Spring注解中@Configuration和@Configurable的区别

https://blog.csdn.net/u013066244/article/details/89061676

环境

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 {
//…
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

代码运行时,会把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");
}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

讲解:
@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

                                

你可能感兴趣的:(springboot,spring)