【Spring】2 Spring IoC容器中定义组件依赖的方式

来源:互联网 发布:c语言insert函数 编辑:程序博客网 时间:2024/06/06 01:10

Outlines:

Review : Spring IoC容器中如何定义Bean
1)     通过属性id name class定义一个Bean
Content: Spring IoC容器中如何定义 Bean的依赖注入
手动注入
2-1)  通过属性property定义Bean的setter依赖注入
          通过属性contruct-arg定义Bean的constructor依赖注入(ref bean/local)
自动注入
2-2)    通过属性autowired,自动注入依赖
2-3)    通过注解@AutoWired定义Bean的反射注入;通过@AutoWired也可以定义Bean的setter、consturctor依赖注入(自动byType注入)
          通过注解@Resource定义Bean的setter、constructor依赖注入(自动byNmae注入)

----------------------------------------------------splitter---------------------------------------

Spring IoC容器中定义组件依赖的方式

1)        显式的依赖注入(setter和constructor)

2)        自动化方式(@Autowired和@Resource)

        

Review:

显示、手动的Bean引用依赖解决方案

在<ref>元素的bean属性里面,Bean名称可以引用IoC容器里面的任意Bean,及时该Bean并没有定义在同一个XML配置文件里也可以引用。

如果引用的是同一个XML文件里面的Bean,应该使用local属性(代替bean属性)指定bean Id;此时XML编辑器可以帮助验证拥有该ID的Bean是否定义在供一个xml文件中。(例如引用完整性)

 

Problem:

Spring IoC容器中定义组件依赖的方式——显式的依赖注入(setter和constructor)

需要在bean的定义xml中显式定义,property或者constructor-arg

有没有自动化的方式呢?

 

SolutionA:

在每个bean的定义配置中<bean autowire=””>设置autowire属性。

默认是no,即需要手工指定bean的依赖;

ByName,即容器通过定义的bean id和bean某个属性的名字对应,从而自动定位注入依赖。

ByType,即容器通过bean的某个属性的类型和其他bean的类型对应,从而自动注入依赖。

Constructor,即容器会根据构造器自动选择匹配完成依赖注入。

Autodetect会让容器在byType和constructor两种方式自动选择一种。

 

另外ByType,Construtor,autodetect有可能会造成注入冲突,引起异常UnsatisfiedDependencyException

一般容器的自动依赖注入特性还和容器的依赖检查特性一起使用。


SolutionB:

自动依赖管理

通过bean的xml定义文件中autowired属性,可以以bean的粒度来控制自动注入依赖。

如果通过java注解@Autowired和@Resource,可以bean中属性的粒度来控制自动依赖注入。同时需要结合AutowiredAnnotationBeanPostProcessor。


1)@Autowired注解可以应用在setter方法和constructor构造器方法。@Autowired注解也可以应用在数据成员上,容器会使用Java反射机制进行自动依赖注入。

使用@Autowired容器会自动进行根据类型(ByType)的自动依赖注入。

可以进一步的控制@Autowired依赖注入,通过@Qualifier注解和自定义注解,可以再根据类型(ByType)的自动依赖注入的同时加上根据名称(ByName)的过滤条件

 

如果容器无法找到匹配类型进行自动依赖注入,则会抛出异常;触发设置@Autowired的required属性=false。

 

2)@Resource可以应用在setter方法和constructor构造器方法和数据成员上。

     使用@Autowired容器会自动进行根据名称的自动依赖注入。

 

注意

如果@Autowired注解应用在数组类型,集合List、Set类型、Map类型的属性上,会一次性自动匹配所有类型兼容的依赖,并且完成注入。

@Resource通过名称自动依赖注入,Bean的名称是唯一的,所以不会匹配出多个依赖。

 

 

原创粉丝点击