Spring基本用法(三)
?需要指出的是,当Bean实现了ApplicationContextAware接口、BeanNameAware接口之后,Spring容器会在该Bean初始化完成之后--也就是调用init-method属性所指定的方法(如果有)之后,再来回调setApplicationContext(ApplicationContext applicationContext)、setBeanName(String name)方法
?????? 由于singleton Bean具有单例行为,当客户端多次请求singleton Bean时,Spring返回给客户端的将是同一个singleton Bean实例,这不存在任何问题。问题是:如果客户端多次请求singleton Bean、并调用该singleton Bean去调用prototype Bean的方法时-----始终都是调用同一个prototype Bean实例,这就违背了设置prototype Bean的初衷:本来希望它具有prototype行为,但实际上它却表现出singleton行为了。
?????? 解决这种不同步问题有如下两种思路:
?????? →部分放弃依赖注入:singleton作用域Bean每次需要prototype作用域Bean时,主动向容器请求新的Bean实例,即可保证每次注入的prototype Bean实例都是最新的实例(代码污染)
?????? →利用方法注入(使用lookup),利用lookup方法注入可以让Spring容器重写容器中Bean的抽象或具体方法,返回查找容器中其他Bean的结果,被查找的Bean通常是一个non-singletong Bean(尽管也可以是一个singleton的)。
??????? 例:在要依赖prototype Bean的singleton Bean中定义个abstract get方法,然后在配置文件中<lookup-method name="get" bean="prototypeBeanid"/>
四、深入理解依赖关系配置
?????? Spring不仅支持普通的值注入和依赖于其他已知Bean的注入,还支持将Bean实例的属性值、方法返回值、Field值直接定义成容器中的一个变量
????? ①注入其他Bean的属性值?? 使用PropertyPathFactoryBean,例<bean id="person.son.age“ value="java.lang.System"/><property name="targetMethod" value="getProperties"/></bean> method既可以是静态方法,也可以是非静态的(对应targetObject)
??????
?