2013-05-30 209 views
0

我是新来的泉水。有没有其他的自动装配可以用在普通的java bean中,而这个bean在spring的上下文中是不存在的。@Autowired in bean not in spring context

+0

所以你想要注入一个弹簧托管bean到非托管POJO? – WeMakeSoftware

+0

你想让自动装配为你实例化的bean工作,而不是弹簧容器,那是你想要的吗? –

+0

@Funtik,是的,你是对的 –

回答

1

你可以通过使用弹簧@Configurable以及一些AspectJ魔法来实现。

如果您需要详细的解释,这里是link

下面是如何实现它的简要概述。

首先,你有一些豆你想要的地方注入:

@Component 
public class InjectedClass { 
    // ... 
} 

然后,你有没有春天,容器管理,要实例化一个类。你希望自动装配与这个类一起工作。您将其标记为@Configurable

@Configurable 
public class NonContainerManagedClass { 

    @Autowired 
    private InjectedClass injected; 

    // ... 
} 

现在您需要告诉spring您希望这个非容器管理的自动装配工作。所以你把下面的东西放在你的弹簧配置中。现在

<context:load-time-weaver /> 
<context:spring-configured /> 

,因为这种事情需要你@Configurable类的字节码的修改。所以你告诉Tomcat使用不同的classloader。您可以通过在应用程序的META-INF指南中创建一个context.xml并将以下内容放在那里。现在

<Context path="/youWebAppName"> 
    <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" 
     useSystemClassLoaderAsParent="false"/> 
</Context> 

,Tomcat的需要找到classloader。你可以通过在你的tomcat安装的lib目录中加入Spring的spring-tomcat-weaver.jar(可能命名为org.springframework.instrument.tomcat-<version>.jar),并且瞧,aspectj魔法开始工作。对于注解为@Configurable注释的类,@Autowired依赖项会自动解析;即使这些实例是在弹簧容器外创建的。

这可能是以干净的方式与Spring合作的唯一方法。确保你在你的classpath有适当的依赖关系。

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