spring方法注入_Spring方法注入

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

更进一步:

翻译自: https://blog.frankel.ch/method-injection-with-spring/

spring方法注入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值