Spring查找方法和范围代理使用

时间:2018-04-27 07:23:08

标签: spring spring-mvc spring-boot

我对使用方法注入(lookup-method)和aop scoped-proxy(因为它们都用于不同的scoped bean注入)有点困惑所以

1)何时使用方法注入以及何时使用aop-scoped代理? 2)为什么aop-scoped代理不会用于原型bean的原因是什么?

2 个答案:

答案 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。这就是您使用代理的时间。