我怎样才能在每次创建新对象时执行单例依赖注入?

时间:2013-05-13 10:54:45

标签: java spring

我上课了:


    public class Base
    {
    private MyExecutor executor;
    }

如何使用new运算符创建类Base的新实例,并希望使用通过spring注入的MyExecutor的相同单例实例? 请建议。

3 个答案:

答案 0 :(得分:2)

将执行程序声明为非原型(即不要将其作为原型,因为singleton是默认的)。从ApplicationContext中获取bean,将其传递给Base

的构造函数

另一种选择是将单例实例存储为Spring调用的构造函数中的MyExecutor的静态字段。然后提供getInstance静态方法。

答案 1 :(得分:1)

这是Spring默认执行的操作,它会注入相同的bean实例。例如,下面的B1和B2将默认获得相同的MyExecutor bean实例,除非您将MyExecutor bean范围从singleton更改为prototype或其他。

public class B1 {
    @Autowired
    private MyExecutor executor;
...

public class B2 {
    @Autowired
    private MyExecutor executor;
...    

答案 2 :(得分:0)

你可以这样做:

   ApplicationContext ctx = ...
    YourClass someBeanNotCreatedBySpring = ...
    ctx.getAutowireCapableBeanFactory().autowireBeanProperties(
        someBeanNotCreatedBySpring,
        AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true);

您可以在YourClass中使用@Autowired等来指定要注入的字段等。

或者您可以将以下注释添加到Base和@Autowired以指定要注入的字段

@Configurable(preConstruction=true,dependencyCheck=true,autowire=Autowire.BY_TYPE)
@EnableSpringConfigured

并遵循XMl COnfiguration

<context:load-time-weaver weaver-class="org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver" aspectj-weaving="on"/>

<context:load-time-weaver aspectj-weaving="autodetect"/>

关键概念是启用Load time weaving

Source