🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[toc] spring初始化和配置bean都在容器中,也可以要求bean工厂配置一个已经存在的对象.`spring-aspects.jar`包含注解驱动的切面支持注入任何对象的能力.该支持旨在用于容器控制之外创建的对象。域对象通常不适用此类别,因为它们通常使用new运算符以编程方式创建,或者由ORM工具创建。 spring注解` @Configurable`标记一个类复合spring驱动的配置.简单的场景下可以用来注解域对象 ~~~java package com.xyz.myapp.domain; import org.springframework.beans.factory.annotation.Configurable; @Configurable public class Account { // ... } ~~~ 等效于下面的xml配置,name,默认是class的全限定名称,省略不写 ~~~xml <bean class="com.xyz.myapp.domain.Account" scope="prototype"> <property name="fundsTransferService" ref="fundsTransferService"/> </bean> ~~~ 如果想指定name ~~~java package com.xyz.myapp.domain; import org.springframework.beans.factory.annotation.Configurable; @Configurable("account") public class Account { // ... } ~~~ 如果使用java注解`@Configuration`,需要再增加一个`@EnableSpringConfigured` ~~~java @Configuration @EnableSpringConfigured public class AppConfig { } ~~~ 如果喜欢使用xml ~~~xml <context:spring-configured/> ~~~ `@Configurable`注解的对象在切面配置之前创建会导致问题产生,信息会发送到debug日志,比如,spring创建域对象,使用属性`depends-on`指定依赖切面配置 ~~~xml <bean id="myService" class="com.xzy.myapp.service.MyService" depends-on="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"> <!-- ... --> </bean> ~~~ ## Unit testing @Configurable objects 如果`@Configurable`注解的类型不是AspectJ编制的,则单元测试时不生效,你可设置mock或属性引用对象正常测试. 如果是AspectJ编制的,则会正常运行,但是每次运行你会看到警告信息,`@Configurable`注解对象不是spring配置的 ## Working with multiple application contexts `@Configurable`的范围是单例的,每一个类加载器对应一个切面实例, 当部署多个web应用在同一个容器时,保证各自应用从各自类路径加载`spring-aspects.jar`(把`spring-aspects.jar` 放在目录`'WEB-INF/lib'`).