0

我是弹簧新手。是否有自动装配的替代方法可以在 Spring 上下文中不存在的普通 Java bean 中使用。

4

1 回答 1

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>.jarlib@Autowired

这可能是让 Spring 以一种干净的方式工作的唯一方法。确保您的classpath.

另一种方法是使用完整的AspectJ功能并围绕所有构造函数提供自定义方面并自己处理依赖注入。

于 2013-05-30T08:37:42.140 回答