我是弹簧新手。是否有自动装配的替代方法可以在 Spring 上下文中不存在的普通 Java bean 中使用。
1 回答
你可以通过使用带有一些魔法的 Spring @Configurable来做到这一点。AspectJ
如果您需要详细说明,这里是链接。
这里是如何实现它的简要概述。
首先,您有一些要在某处注入的 bean:
@Component
public class InjectedClass {
// ...
}
然后,您有一个不是 spring-container 管理的类,您想要实例化它。您希望自动装配与此类一起使用。您将其标记为@Configurable。
@Configurable
public class NonContainerManagedClass {
@Autowired
private InjectedClass injected;
// ...
}
现在你需要告诉 spring 你希望这个非容器管理的自动装配工作。因此,您将以下内容放入您的弹簧配置中。
<context:load-time-weaver />
<context:spring-configured />
现在,因为这种事情需要修改@Configurable类的字节码。所以你告诉 Tomcat 使用不同的classloader
. 您可以通过context.xml
在应用程序的META-INF
目录中创建一个并将以下内容放入其中来做到这一点。
<Context path="/youWebAppName">
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"
useSystemClassLoaderAsParent="false"/>
</Context>
现在,Tomcat 需要找到classloader
. 您可以通过将 Spring (可能spring-tomcat-weaver.jar
名为 对于带有@Configurable注解的类,依赖会自动解析;即使实例是在弹簧容器之外创建的。org.springframework.instrument.tomcat-<version>.jar
lib
@Autowired
这可能是让 Spring 以一种干净的方式工作的唯一方法。确保您的classpath
.
另一种方法是使用完整的AspectJ功能并围绕所有构造函数提供自定义方面并自己处理依赖注入。