autowire相关
spring bean配置的一致性表现在get set 方法与bean当中的值的一致性上。
在使用byName标签进行属性配置时是可以看出的,使用byName后属性bean的相应
id与get set方法中的名称是相匹配的(小驼峰)
使用byType进行配置标注时可以看做是寻找唯一符合属性配置type的类作为
对应属性。
使用constructor作为autowire值时在Beans.xml中的形式基本上与byName byType相同,
唯一的不同是相应属性的初始化需要使用默认构造函数显式地给出,这里基本作用原理与
byType相同,会寻找唯一符合要求的作为属性,找不到会抛出异常。
还有一个默认的方法是autodetect,即先使用constructor形式,当找不到后使用byType
进行寻找。
现在Spring框架所广泛使用的是基于annotation而非XML配置的bean依赖关系,这种特性
使得可以将依赖关系展现在代码中,而非单独在XML配置。
由于XML配置是在annotation之后生效的,故前者可以重载后者。
在之前一些版本中,spring annotation并非自动生效的,故要其生效,需要在beans
中添加如下配置,<context:annotation-config>
在可以使用annotation后就可以展开叙述了,
@Required是用来修饰setter method方法的,使用其进行修饰的对应属性在使用前
必须在bean中进行指定的初始化,即不能为null 否则会抛出异常,这与java @Override
是类似的。
@Autowired可以修饰多种方法,下面分类讨论。
修饰setter methods时与前述使用autowired byType的结果是相同的。(即不用再指定autowired属性)
但要指出,对于setter methods给出修饰后默认相当于同时给出了@Required修饰,
这时要求初始化bean时必须对诸属性进行赋值,要规避这个行为可以改为
@Autowired(required = false)。
当直接对类的property使用@Autowired进行修饰时可以不定义setter method,框架会
自动设定setter method
实际上当使用构造函数进行property初始化时根bean的关系就不算大了,这时setter\getter
methods的使用就显得没有那么重要了。对类的构造函数进行@Autowired修饰时是可以按
byType的形式理解。
从上面的讨论中可以看到,annotation Autowired基本上是 annotation = "byType"的等价物,
这使得当在一个环境中有多个类满足Autowired条件时会不知道使用哪一个,
这时可以结合@Qualifier("*")进行限定(qualifier: 限定)
其基本等价于将bean的依赖关系设定为annotation = "byName" 并将"*"作为name(id)进行匹配。
@PostConstruct 及@PreDestroy是用来替代在bean中需要显式给出的init-method及destory-method
的,直接在bean对应的类中的相应方法去前进行声明即可。
@Resource(name = "*")基本上等价于@Autowired + @Qualifier
spring bean配置的一致性表现在get set 方法与bean当中的值的一致性上。
在使用byName标签进行属性配置时是可以看出的,使用byName后属性bean的相应
id与get set方法中的名称是相匹配的(小驼峰)
使用byType进行配置标注时可以看做是寻找唯一符合属性配置type的类作为
对应属性。
使用constructor作为autowire值时在Beans.xml中的形式基本上与byName byType相同,
唯一的不同是相应属性的初始化需要使用默认构造函数显式地给出,这里基本作用原理与
byType相同,会寻找唯一符合要求的作为属性,找不到会抛出异常。
还有一个默认的方法是autodetect,即先使用constructor形式,当找不到后使用byType
进行寻找。
现在Spring框架所广泛使用的是基于annotation而非XML配置的bean依赖关系,这种特性
使得可以将依赖关系展现在代码中,而非单独在XML配置。
由于XML配置是在annotation之后生效的,故前者可以重载后者。
在之前一些版本中,spring annotation并非自动生效的,故要其生效,需要在beans
中添加如下配置,<context:annotation-config>
在可以使用annotation后就可以展开叙述了,
@Required是用来修饰setter method方法的,使用其进行修饰的对应属性在使用前
必须在bean中进行指定的初始化,即不能为null 否则会抛出异常,这与java @Override
是类似的。
@Autowired可以修饰多种方法,下面分类讨论。
修饰setter methods时与前述使用autowired byType的结果是相同的。(即不用再指定autowired属性)
但要指出,对于setter methods给出修饰后默认相当于同时给出了@Required修饰,
这时要求初始化bean时必须对诸属性进行赋值,要规避这个行为可以改为
@Autowired(required = false)。
当直接对类的property使用@Autowired进行修饰时可以不定义setter method,框架会
自动设定setter method
实际上当使用构造函数进行property初始化时根bean的关系就不算大了,这时setter\getter
methods的使用就显得没有那么重要了。对类的构造函数进行@Autowired修饰时是可以按
byType的形式理解。
从上面的讨论中可以看到,annotation Autowired基本上是 annotation = "byType"的等价物,
这使得当在一个环境中有多个类满足Autowired条件时会不知道使用哪一个,
这时可以结合@Qualifier("*")进行限定(qualifier: 限定)
其基本等价于将bean的依赖关系设定为annotation = "byName" 并将"*"作为name(id)进行匹配。
@PostConstruct 及@PreDestroy是用来替代在bean中需要显式给出的init-method及destory-method
的,直接在bean对应的类中的相应方法去前进行声明即可。
@Resource(name = "*")基本上等价于@Autowired + @Qualifier