弹簧仪表和自动注射新物体

时间:2012-08-01 08:11:27

标签: java spring hashmap code-injection

我有春季3.1申请。我有spring-instrument java代理,我有可配置的类:

@Configurable
public class WeavingClass {

    @Resource
    @Getter
    private ApplicationContext ac;

    public WeavingClass()
    {

    }

}

并进行单元测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={WebBackendContextConfig.class})
@Slf4j
public class TestWeavingInjection extends TestCase {

    @Test
    public void isInjectedTest()
    {
        WeavingClass wc = new WeavingClass();
        assertNotNull(wc.getAc());
    }
}

并且:

@Configuration
@PropertySource(value={"classpath:META-INF/conf/liteicms-backend.properties"})
@ComponentScan(value={"ru.icb.liteicms.backend.service", "ru.icb.liteicms.domain", "ru.icb.liteicms.backend.domain.contentpage.wrappers"})
@EnableSpringConfigured
@EnableLoadTimeWeaving
@EnableAspectJAutoProxy
public class WebBackendContextConfig {

}

我用-javaagent运行我的测试:org.springframework.instrument-3.1.1.RELEASE.jar 我的测试没有错误。

但如果我加上这个:

private HashMap<Class<?>, Class<?>> builderMap = new HashMap<Class<?>, Class<?>>()
{
    private static final long serialVersionUID = 1L;
    {
    put(String.class, WeavingClass.class);
    }
};

我的测试已经破裂。

1 个答案:

答案 0 :(得分:2)

注入new - 创建的对象(而不是托管bean)只能在编译或加载时编织时使用,而不能使用Spring默认使用的运行时代理。

您需要配置一个AspectJ weaver,<context:load-time-weaver>,或者使用命令行选项启动JVM以启用InstrumentationSavingAgent

Details from the Spring documentation