我对使用方法注入(lookup-method)和aop scoped-proxy(因为它们都用于不同的scoped bean注入)有点困惑所以
1)何时使用方法注入以及何时使用aop-scoped代理? 2)为什么aop-scoped代理不会用于原型bean的原因是什么?
答案 0 :(得分:3)
查找方法注入和范围代理都是将较短寿命的bean注入较长寿命的bean的方法。但是,它们用于不同的用例。
在单例范围的bean依赖于原型范围的bean的情况下,方法注入非常有用。
代理注入代理所需的bean,并根据上下文提供该bean。例如,如果单例bean(例如Spring MVC控制器)自动连接会话范围的bean,则代理会传递属于当前HTTP会话的bean。
这样的代理不适用于在运行时获取原型bean的情况。查找方法注入是在运行时获取原型实例的一种方法。
但是,方法注入具有局限性,因为它基于抽象方法。因此,编写单元测试等某些事情比较麻烦,因为您需要提供抽象方法的存根实现。组件扫描也不适用于抽象类。
方法注入的一种替代方法是Spring ObjectFactory或其JSR等效项Provider。
在运行时创建原型bean实例的另一种直接方法(甚至可以提供构造函数参数)是实现如下的bean工厂:
@Configuration
public class MyProvider {
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public MyThing create(String name) {
return new MyThing(name);
}
}
用法:
@Component
public class MySingleton {
@Autowired
private MyProvider myProvider;
public void doStuffThatNeedsAPrototypeBeanInstance() {
MyThing thing = myProvider.create("some name");
...
}
}
答案 1 :(得分:0)
问题1.何时使用方法注入以及何时使用aop范围的代理?
假设您有一个单例bean A依赖于原型beanB。A有一个涉及m的方法m。
您获得了A的对象a,并多次执行了方法m。每次执行m时,需要将B的新对象b注入到a中。是时候使用方法注入了。
此外,如果您有一个单例bean,则A依赖于会话beanB。A的方法m涉及到B。
您获得了A的对象a,并多次执行了方法m。只要执行时间在同一个会话中,a就具有与B相同的对象b。这就是您使用代理的时间。