Spring Boot,使用@Configurable和加载时间编织将@Autowire转换为非托管类

时间:2015-03-20 13:20:39

标签: java spring spring-boot aspectj spring-aop

我有一组非托管类,我在Spring之外实例化。我一直试图使用Spring AOP将加载时间编织到@Autowire一个bean进入这些类,但到目前为止还没有任何运气。

我一直在使用Tomcat 8和Spring Boot 1.2.0进行测试。

我尝试设置课程的@Configuration看起来像这样:

@Configuration
@PropertySource("classpath:application.properties")
@EnableSpringConfigured
@EnableLoadTimeWeaving
public class Config

Config内部我将我想要@Auotwire的bean定义到我的非托管类中:

@Bean
public StateProvider stateProvider() {
    //setup bean
    return new DynamoStateProviderImpl( );
}

非托管bean看起来像这样:

@Configurable(autowire = Autowire.BY_TYPE, dependencyCheck = true,   preConstruction = true)
public class StateOutput implements UnifiedOutput {

@Autowired
private StateProvider stateProvider;

我的pom中有以下deps

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-agent</artifactId>
        <version>2.5.6.SEC03</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
    </dependency>

    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.0</version>
    </dependency>

到目前为止,我还没有看到注入stateProvider的任何内容或者能够从日志中提取任何信息。我也尝试使用

进行二传手式注射
@Autowired
public void setStateProvider(StateProvider stateProvider){
    this.stateProvider = stateProvider;
}

由于

1 个答案:

答案 0 :(得分:3)

为了测试LTW,您需要使用javaagent或将spring-tomcat-weaver.jar放在\lib文件夹中,并在TomcatInstrumentableClassLoader中设置context.xml

javaagent示例:

-javaagent:"${settings.localRepository}/org/springframework/spring-agent/2.5.6.SEC03/spring-agent-2.5.6.SEC03".jar

ClassLoader示例:

<Context>
    <Loader loaderClass="org.springframework.instrument.classl oading.tomcat.TomcatInstrumentableClassLoader" />
</Context>