我是新手。是否有自动装配的替代方法可用于普通的java bean中,而在Spring上下文中不存在。
答案 0 :(得分:1)
你可以使用具有AspectJ
魔法的Spring @Configurable来实现这一目的。
如果您需要详细说明,请参阅link。
以下是对如何实现这一目标的简要概述。
首先,你想要在某处注入一些bean:
@Component
public class InjectedClass {
// ...
}
然后,您有一个不是弹簧容器管理的类,您想要实例化。您希望自动装配与此类一起使用。您将其标记为@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
(可能名为org.springframework.instrument.tomcat-<version>.jar
)放在tomcat安装的lib
目录中来确保,并且,aspectj magic开始工作。对于使用@Configurable注释进行注释的类,@Autowired
依赖项将自动解析;即使实例是在弹簧容器外面创建的。
这可能是以干净的方式使用Spring的唯一方法。确保classpath
中有适当的依赖关系。
另一种方法是使用完整的AspectJ功能,并在所有构造函数周围提供自定义方面,并自行处理依赖注入。