@Autowired in bean in spring context

时间:2013-05-30 08:12:09

标签: spring spring-mvc

我是新手。是否有自动装配的替代方法可用于普通的java bean中,而在Spring上下文中不存在。

1 个答案:

答案 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功能,并在所有构造函数周围提供自定义方面,并自行处理依赖注入。