博客
关于我
Spring--通过注解来配置bean【转】
阅读量:443 次
发布时间:2019-03-06

本文共 3761 字,大约阅读时间需要 12 分钟。

Spring注解驱动的Bean配置与组件扫描指南

在Spring应用中,通过注解配置Bean是一种简洁高效的方式,能够自动发现和管理需要管理的组件。以下是关于Spring注解配置Bean的详细指南,包括组件扫描、自动注入以及相关配置示例。

1. 组件扫描(Component Scanning)

Spring能够从类路径中自动扫描,发现并实例化带有特定注解的组件。这种自动化扫描使开发者免去了手动配置的痛苦。以下是组件扫描的关键点:

  • @Component:这是Spring管理组件的基础注解,标识一个受Spring管理的组件。
  • @Repository:标识持久层组件,通常用于DAO层。
  • @Service:标识服务层(业务层)组件。
  • @Controller:标识表现层组件,通常用于Web层。

Spring默认的命名策略是:使用类的全名,首字母大写,除非在注解中指定了value属性来指定bean的名称。

要启用组件扫描,需要在Spring配置文件中添加如下配置:

  • base-package:指定需要扫描的基础包路径,Spring将扫描该包及其子包中的所有类。
  • resource-pattern:用于过滤特定的类,可以通过正则表达式指定。
  • include-filter:指定要包含的目标类。
  • exclude-filter:指定要排除的目标类。

2. 自动注入(Autowired)

@Autowired注解是Spring最常用的注入方式,支持通过类型、名称或自定义逻辑进行注入。以下是@Autowired的使用要点:

  • 类型注入:默认情况下,Spring通过类型进行注入。对于接口或非接口类型,Spring会查找唯一匹配的实现类。
  • 名称注入:可以通过@Qualifier注解指定特定的bean名称。
  • 数组注入:@Autowired可以注入数组类型的属性,Spring会自动匹配所有兼容类型的bean。
  • 集合注入:@Autowired可以注入集合属性,Spring会根据集合的类型自动装配所有兼容类型的bean。
  • Map注入:@Autowired可以注入Map属性。当Map的键值类型已知时,Spring会根据键值类型自动装配对应的bean。

3. @Resource和@Inject注解

除了@Autowired,Spring还支持@Resource和@Inject注解,这两种注解与@Autowired功能相似,但有一些细微差别:

  • @Resource:需要指定bean名称(如果不指定,默认使用字段或方法名)。与@Autowired不同,@Resource不支持required属性,默认所有属性都需要被注入。
  • @Inject:与@Autowired类似,但没有required属性,默认所有属性都需要被注入。@Inject不支持数组或集合注入。

建议优先使用@Autowired注解,因为它提供了更丰富的功能。

4. 代码示例

以下是一些典型的代码示例,展示了如何使用Spring注解配置Bean和组件扫描。

TestObject.java
package com.yl.annotation;import org.springframework.stereotype.Component;@Componentpublic class TestObject {}
UserRepository.java
package com.yl.annotation.repository;public interface UserRepository {    void save();}
UserRepositoryImpl.java
package com.yl.annotation.repository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Repository;import com.yl.annotation.TestObject;@Repository("userRepository")public class UserRepositoryImpl implements UserRepository {    @Autowired    private TestObject testObject;    @Override    public void save() {        System.out.println("UserRepository save...");        System.out.println(testObject);    }}
UserJdbcRepository.java
package com.yl.annotation.repository;import org.springframework.stereotype.Repository;@Repositorypublic class UserJdbcRepository implements UserRepository {    @Override    public void save() {        System.out.println("UserJdbcRepository save...");    }}
UserService.java
package com.yl.annotation.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Service;import com.yl.annotation.repository.UserRepository;@Servicepublic class UserService {    @Autowired    @Qualifier("userJdbcRepository")    private UserRepository userRepository;    public void add() {        System.out.println("UserService add...");        userRepository.save();    }}
UserController.java
package com.yl.annotation.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import com.yl.annotation.service.UserService;@Controllerpublic class UserController {    @Autowired    private UserService userService;    public void execute() {        System.out.println("UserController execute...");        userService.add();    }}
beans-annotation.xml

5. 自定义过滤

如果需要更复杂的过滤,可以使用自定义TypeFilter实现自定义的过滤逻辑。例如:

package com.yl.filter;import org.springframework.core.type.TypeFilter;public class MyCustomFilter extends TypeFilter {    public MyCustomFilter() {        super(MyCustomFilter.class);    }    @Override    protected boolean match( Class
type ) { return super.match(type) && isMyCondition(type); } private boolean isMyCondition(Class
type) { return type.getName().contains("Custom"); }}

在Spring配置中使用:

转载地址:http://llayz.baihongyu.com/

你可能感兴趣的文章
Python 列表解析 大文件
查看>>
python 列表转字典方法
查看>>
Python 列表(List)概述-ChatGPT4o作答
查看>>
Python网络爬虫基础进阶到实战教程
查看>>
Python 初学者需要知道的四条建议
查看>>
Python 判断字符串是否包含子字符串
查看>>
python 判断当前时间是否为零点
查看>>
python 利用pandas读取本地中CSV文件的指定列 列名重命名 并保存回本地
查看>>
python 利用pyspark读取HDFS中CSV文件的指定列 列名重命名 并保存回HDFS
查看>>
python 利用pyttsx3文字转语音
查看>>
python 利用已有Ner模型进行数据清洗合并
查看>>
python 到大数据开发工程师_如何成为一个大数据开发工程师?
查看>>
python 加密解密(base64, AES)
查看>>
Python 包管理器和 Node.js
查看>>
Python 单词字母顺序不变且所有倒排
查看>>
python 启动提示IDLE's subprocess didn't make conne...
查看>>
python 命令接口_实现“[命令][操作][参数]”样式的命令行接口?
查看>>
Python 和 OpenCV.如何检测图像中的所有(填充)圆形/圆形对象?
查看>>
Python 和 RabbitMQ - 聆听来自多个渠道的消费事件的最佳方式?
查看>>
python编辑器打不开_关于命令ride.py打不开RF,而是打开pycharm编辑器问题解决思路...
查看>>