这个和@configuration注解不一样
一般情况下,我们使用Spring Ioc容器为我们管理的对象,并注入依赖。
但是,如果不是Spring Ioc容器管理的类,我们可以注入吗?
2. 为非Spring容器管理的对象注入依赖
非Spring容器管理的对象是指的由我们自己new出来的对象。
比如
Account account = new Account()
这个时候,如果我想让Spring Ioc容器注入依赖的话,可以使用*@Configurable*注解。
下面我们来看一下如何使用*@Configurable*注解。
首先需要在maven中pom中添加如下的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
然后我们创建一个配置类
@Configuration
@ComponentScan({"com.ripjava.configurable"})
@EnableSpringConfigured
@EnableLoadTimeWeaving
public class ConfigurableAppConfig {
}
然后是Account类,我们自己管理创建的类。如果没有被configurable修饰,那new出来的Account对象不是被Spring ioc管理的对象,所以里面通过注入方式的service对象就会报错。使用configurable注解可以解决这个问题
@Configurable
public class Account {
@Autowired
private Service service;
public void callService(){
service.service();
}
}
然后是Service接口和一个简单的实现CleanService。
public interface Service {
void service();
}
@Component
public class CleanService implements Service{
public void service(){
System.out.println("clean room");
}
}
最后,我们来测试一下
public static void main(String[] args) {
AnnotationConfigApplicationContext actx = new AnnotationConfigApplicationContext(ConfigurableAppConfig.class);
Account account = new Account();
account.callService();
}
在运行之前,我们添加一个jvm参数:
-javaagent:/path/to/spring-instrument.jar
我们直接指定spring-instrument.jar的maven本地仓库的地址就行,比如
-javaagent:/Users/loginUserName/.m2/repository/org/springframework/spring-instrument/5.1.9.RELEASE/spring-instrument-5.1.9.RELEASE.jar
输出的结果如下
clean room
我们简单的总结一下:
- 如果我们想要使用*@Configurable*,我们需要添加Spring的如下模块:
- spring-context
- spring-aspects
- spring-instrument
- 在配置类上使用*@EnableSpringConfigured和@EnableLoadTimeWeaving*注解。
- 配置JVM参数javaagent ,指定 agent 的 jar 为spring-instrument。
3. 总结
在本文中,我们介绍了Spring的*@Configurable*注解。
可以使用它为非Spring容器管理的对象注入依赖。
Spring是使用AspectJ的LoadTimeWeaving技术为我们自己创建的对象进行注入的。