提问者:小点点

Spring查找-方法和作用域代理使用


我对使用方法注入(查找方法)和aop范围代理(因为两者都用于不同范围的bean注入)有点困惑

1)什么时候使用方法注入,什么时候使用aop范围的代理?2)aop范围的代理不会用于原型bean的原因是什么?


共2个答案

匿名用户

查找方法注入和作用域代理都是将较短生命周期的bean注入较长生命周期的bean的方法。但是,它们服务于不同的用例。

方法注入在单例范围bean依赖于原型范围bean的情况下很有用。

代理被注入到所需bean的位置,并根据上下文提供该bean。例如,如果单例bean(例如SpringMVC控制器)自动连接会话范围的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。什么时候使用方法注入,什么时候使用aop范围的代理?

假设您有一个单例bean A依赖于原型bean B。A有一个包含B的方法m。

你得到了A的对象a,并多次执行方法m。每次m执行时,B的一个新对象b需要注入到a。那就是你使用方法注入的时候。

此外,如果您有一个单例bean A依赖于会话bean B。A有一个涉及B的方法m。

你得到了A的对象a,并多次执行方法m。只要执行时间在同一个会话中,a就有B的相同对象b。这就是你使用代理的时间。