博客
关于我
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/

你可能感兴趣的文章
node编译程序内存溢出
查看>>
Node读取并输出txt文件内容
查看>>
node防xss攻击插件
查看>>
noi 1996 登山
查看>>
noi 7827 质数的和与积
查看>>
NOI-1.3-11-计算浮点数相除的余数
查看>>
noi.ac #36 模拟
查看>>
NOI2010 海拔(平面图最大流)
查看>>
NOIp2005 过河
查看>>
NOIP2011T1 数字反转
查看>>
NOIP2014 提高组 Day2——寻找道路
查看>>
noip借教室 题解
查看>>
NOIP模拟测试19
查看>>
NOIp模拟赛二十九
查看>>
Vue3+element plus+sortablejs实现table列表拖拽
查看>>
Nokia5233手机和我装的几个symbian V5手机软件
查看>>
non linear processor
查看>>
Non-final field ‘code‘ in enum StateEnum‘
查看>>
none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
查看>>
None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
查看>>