以注释方式配置为例,Bean的创建和依赖注入

2019-07-19 0 By admin

Spring 框架中有三种配置Bean 的方式,这里以注释方式为例说明Bean的创建和依赖注入。

Spring2.0开始引入基于注解的配置方式,即Bean的定义信息可以通过在Bean的实现类上标注注解实现。
Spring在2.5后提供了一个context的命名空间,它提供了通过扫描类包来加载利用注解定义的Bean的方式。
在context中可以使用resource-pattern来过滤出特定的类。不过使用resource-pattern并不能提供给我们完善的功能,所有我们得使用过滤子元素的方法。
其中:
include-filter:表示要包含的目标类。
exclude-filter:表示要排除在外的目标类。
过滤器支持的配置类别:

  1. annotation:例:cn.gud.XxxAnnotation;符合XxxAnnotation的target class。
  2. assignable:例:cn.gud.XxxService;指定class或interface的全名。
  3. aspectj:例:cn.gud***XxxService+;AspectJ语法。
  4. regex:例:cn\.gud\.*;Regelar Expression。
  5. Custom:例:cn.gud.MyTypeFilter;type.TypeFilter。

一、XML文件告诉Spring 去哪里找Beans

使用注释的方式配置Bean的话,可以在Java的源码中的类设置注释,使其创建Bean。
不过我们需要使用XML配置文件,来告诉Spring去扫描哪些源码文件,找到Bean的定义。

1.1、applicationContext.xml

告知spring在创建容器时要扫描的包,配置所需要的标签;不是在beans的约束中,而是一个名称为context名称空间和约束中。

1.2、context:annotation-config 和 context:component-scan的区别

Spring在2.5后提供了一个context的命名空间,它提供了通过扫描类包来加载利用注解定义的Bean的方式。

1、context:annotation-config 是用于激活那些已经在spring容器里注册过的bean(无论是通过xml的方式还是通过package sanning的方式)上面的注解。
2、context:component-scan除了具有 context:annotation-config的功能之外,还可以在指定的package下扫描以及注册java bean 。
示例:<context:component-scan base-package="com.myx"></context:component-scan>

二、Java 对象Bean创建的注释

2.1、@Component 注释

用于把当前类对象存入spring容器中;创建bean对象。
属性:value:用于指定bean的id。当我们不写时,它的默认值是当前类名,且首字母改小写。

2.2、@Component的衍生注释

  1. @Controller:用来修饰WEB层类(控制层)(springMVC延用了该注解
  2. @Service:用来修饰service层类(业务层)
  3. @Repository:用来修饰DAO层类(持久层)

以上三个注释他们的作用和属性与Component是一模一样。
他们三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰。

三、Java 对象Bean依赖注入的注释

3.1、@Autowired 注释

自动按照类型注入。
1、只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功;
2、如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错;
3、如果Ioc容器中有多个类型匹配时:先按照类型匹配,如果不能匹配上,会按照属性的名称进行匹配
出现位置:可以是变量上,也可以是set方法上
细节:在使用注解注入时,set方法就不是必须的了。

3.2、注入集合示例

第一步:
@Bean
Public List<User> createList(){
    // 组织数据
    List<User> list = new ArrayList<User>();
    return list;
}
第二步:
@Autowired
private List<User> list;

3.3、@Qualifier 注释

在按照类中注入的基础之上再按照名称注入。
在自动按照类型注入的基础上,再按照bean的ID注入。它在给类成员注入数据时,不能单独使用;但是再给方法的形参注入数据时,可以单独使用。
属性:value:用于指定注入bean的id。

3.4、@Resource 注释

直接按照bean的id注入。如果id属性不存在,可以再按照类型注入。它可以独立使用
属性:name:用于指定bean的id,如果指定name,只能按照bean的id注入,不能按照类型注入。
以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现(使用@Value)

3.5、@Value注释

用于注入基本类型和String类型的数据
属性:value:用于指定数据的值。使用${表达式}可以读取配置文件(.properties文件)的信息
@Value(value = "myx")
private String name;
@Value(value = "18")
private Integer age;

四、Java 对象Bean的作用域Scope 注释

4.1、@Scope 注释说明

用于指定bean的作用范围
属性:value:指定范围的取值。常用取值:singleton prototype

五、Java 对象Bean的生命周期(初始化和销毁)

以单例Bean为例

@PostConstruct
public void  init(){
    System.out.println("初始化方法执行了");
}

@PreDestroy
public void  destroy(){
    System.out.println("销毁方法执行了");
}