springboot注解方式,@Autowire和有参构造和无参构造使用哪个创建对象
构造测试条件
① application.yml
ruoyi.name = ruoyi
ruoyi.age = 12
② pojo.Person类
@Data
@Component
@NoArgsConstructor
@AllArgsConstructor
public class Person {
@Value("${ruoyi.name}")
private String name;
@Value("${ruoyi.age}")
private Integer age;
}
③ 启动类
@SpringBootApplication
@Slf4j
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(Application.class, args);
log.info("{}",run);
}
}
第一种 controller
@RestController
public class HelloController {
@Autowired
private Person person;
public HelloController(Person person) {
this.person = new Person("2",2);
}
public HelloController() {
person = new Person("1",1);
}
}
测试:
第二种 controller
@RestController
public class HelloController {
// @Autowired
private Person person;
public HelloController(Person person) {
this.person = new Person("2",2);
}
public HelloController() {
person = new Person("1",1);
}
}
测试:
第三种 controller
@RestController
public class HelloController {
// @Autowired
private Person person;
public HelloController(Person person) {
this.person = new Person("2",2);
}
// public HelloController() {
// person = new Person("1",1);
// }
}
测试:
报错了,Spring容器会报错,需要修改@Autowired(required = false)即可,如下修改:
@RestController
public class HelloController {
@Autowired
private Person person;
@Autowired(required = false)
public HelloController(Person person) {
this.person = new Person("2",2);
}
@Autowired(required = false)
public HelloController() {
person = new Person("1",1);
}
}
测试:
第五种 controller
@RestController
public class HelloController {
// @Autowired
private Person person;
@Autowired(required = false)
public HelloController(Person person) {
this.person = new Person("2",2);
}
@Autowired(required = false)
public HelloController() {
person = new Person("1",1);
}
}
测试:
这样的话,Spring会根据参数个数进行排序,参数个数越多,优先级越高,这样上面的代码就会调用第一个构造函数
第六种 controller
@RestController
public class HelloController {
// @Autowired
private Person person;
@Autowired(required = false)
public HelloController(Person person) {
this.person = new Person("2",2);
}
// @Autowired(required = false)
public HelloController() {
person = new Person("1",1);
}
}
测试:
总结:
1、Spring在实例化对象的时候一旦找到一个它认为合适的构造方法,就会直接实例化对象,不会继续寻找其他构造方法。
2、@Autowire写在属性上永远第一,
3、要是没有@Autowire写在属性上,取写在构造方法上的,要是有多个急需要加@Autowired(required = false),参数多的为主
4、要是都没有,就使用无参构造创建对象
5、只有有参构造,就使用有参构造创建对象