spring方法注入
Spring核心现成可用,有两个作用域:单例和原型。 单例实现单例模式,这意味着在运行时(在JVM中)只有一个实例。 Spring在上下文创建期间实例化它们,将它们缓存在上下文中,并在需要时(或类似的东西)从缓存中提供它们。 每次访问上下文以获取Bean时都会实例化原型。
当需要在单例范围的bean中注入原型范围的bean时,会出现问题。 由于单例是在上下文创建期间创建(然后注入)的:这是唯一一次访问Spring上下文,因此原型作用域的bean仅注入一次,因此无法实现它们的目的。
为了将原型注入单例中,并通过setter和构造函数注入并排进行syde,Spring提出了另一种注入方法,称为方法注入。 它的工作方式如下:由于单例是在上下文创建时实例化的,因此它改变了原型作用域的处理方式,从注入到通过抽象方法创建。 以下代码段显示了实现注入的不成功方法:
publicclassSingleton{
privatePrototypeprototype;
publicSingleton(Prototypeprototype){
this.prototype=prototype;
}
publicvoiddoSomething(){
prototype.foo();
}
publicvoiddoSomethingElse(){
prototype.bar();
}
}
下一个代码段显示正确的代码:
publicabstractclassSingleton{
protectedabstractPrototypecreatePrototype();
publicvoiddoSomething(){
createPrototype().foo();
}
publicvoiddoSomethingElse(){
createPrototype().bar();
}
}
如您所见,代码没有指定createPrototype()实现。 此职责委托给Spring,因此需要以下配置:
<beanid="prototype"class="ch.frankel.blog.Prototype"scope="prototype"/>
<beanid="singleton"class="sample.MySingleton">
<lookup-methodname="createPrototype"bean="prototype"/>
</bean>
注意,方法注入的替代方法是显式访问Spring上下文以自己获取Bean。 这样做是一件坏事,因为它完全击败了整个Inversion of Control模式,但它确实有效(并且在服务器上发生讨厌的错误时,它实际上是唯一的选择-参见下文)。
但是,使用方法注入有几个主要限制:
- Spring通过更改字节码实现了这种黑魔法。 因此,您需要在类路径上具有CGLIB库 。
- 该功能仅通过XML配置可用,没有注释(有关更多信息,请参见JIRA )
- 最后,某些应用服务器存在与CGLIB相关的错误(例如this )
spring方法注入