我有一堂课:
public class Base
{
private MyExecutor executor;
}
如何使用 new 运算符创建类 Base 的新实例,并希望使用通过 spring 注入的同一个 MyExecutor 单例实例?请建议。
将执行程序声明为非原型(即不要将其设为原型,因为默认情况下是单例)。从 ApplicationContext 中获取 bean,将其传递给Base
.
另一种选择是将单例实例存储为MyExecutor
Spring 调用的构造函数的静态字段。然后提供一个getInstance
静态方法。
这是 Spring 默认所做的,它注入相同的 bean 实例。例如,默认情况下,B1 和 B2 下面将获得相同的 MyExecutor bean 实例,除非您将 MyExecutor bean 范围从singleton
toprototype
或其他更改。
public class B1 {
@Autowired
private MyExecutor executor;
...
public class B2 {
@Autowired
private MyExecutor executor;
...
你可以这样做:
ApplicationContext ctx = ...
YourClass someBeanNotCreatedBySpring = ...
ctx.getAutowireCapableBeanFactory().autowireBeanProperties(
someBeanNotCreatedBySpring,
AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true);
您可以@Autowired
在 YourClass 中使用 etc 来指定要注入的字段等。
或者您可以将以下注释添加到 Base 并@Autowired
指定要注入的字段
@Configurable(preConstruction=true,dependencyCheck=true,autowire=Autowire.BY_TYPE)
@EnableSpringConfigured
并遵循 XML 配置
<context:load-time-weaver weaver-class="org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver" aspectj-weaving="on"/>
或者
<context:load-time-weaver aspectj-weaving="autodetect"/>
关键概念是使Load time weaving