环境
java:1.8
spring-boot:2.1.3
前言
今天在写注解时,不小心把@Configuration
写成了@Configurable
,这两个长得很像,所以顺便探究下,有什么区别。
@Configuration
该注解是可以用来替代XML
文件。
以前我们配置bean
时,都是写在applicationContext.xml
文件中的。
有了这个注解后,我们就可以编写一个类在其上面加上该注解。即配置类。
在配置类中可以在方法上加@Bean
注解定义其中的Bean
@Configurable
现在假设,我们想在非Spring管理的类中使用依赖注入;
比如:手动new
出来的对象,正常情况下,Spring
是无法依赖注入的,这个时候可以使用@Configurable
注解;
现在假设我们有如下代码:
public class CarSalon {
//...
public void testDrive() {
Car car = new Car();
car.startCar();
}
}
@Component
public class Car {
@Autowired
private Engine engine;
@Autowired
private Transmission transmission;
public void startCar() {
transmission.setGear(1);
engine.engineOn();
System.out.println("Car started");
}
}
@Component
public class Engine {
//...
}
@Component
public class Transmission {
//...
}
代码运行时,会把Null
异常。因为正常情况下,Spring
无法对new
出来的对象进行依赖注入;
在此基础上,我们使用@Configurable
注解进行修改,如下:
@Configurable(preConstruction = true)
@Component
public class Car {
@Autowired
private Engine engine;
@Autowired
private Transmission transmission;
public void startCar() {
transmission.setGear(1);
engine.engineOn();
System.out.println("Car started");
}
}
讲解:
@Configurable(preConstruction = true)
这个注解的作用是:
告诉Spring
在构造函数运行之前将依赖注入到对象中。
使用该注解需要注意的地方:
① 需要在项目中添加如下jar
包:aspectj-x.x.x.jar, aspectjrt.jar, aspectjveawer-x.x.x.jar
② 将基于Spring的java代理添加到运行配置中:-javaagent:"PATH\spring-instrument-x.x.x.jar"
现在,运行就不会报错了。
参考地址:
Spring dependency injection – @Configurable
Spring framework @Configurable vs @Configuration