自动装配 03 方法 构造器位置的自动装配
@Autowired的位置:构造器 方法 参数 属性 都是从容器中获取参数的值
- 方法上:Spring容器创建当前对象就会调用此方法 完成赋值
- 方法使用的参数 自定义类型就会从ioc容器中获取
- 构造器上: 构造器要用的组件都是从容器中获取
- 若bean中只有一个有参构造方法,
@Autowired
注解可以省掉,默认会调用这个参数位置的组件还是会从ioc容器获取
- 若bean中只有一个有参构造方法,
- 参数上:@Bean + 方法参数:默认不写@Autowired ,也能自动装配 也是从ioc容器中获取
Boss.java
@Component
public class Boss {
private Car car;
public Car getCar() {
return car;
}
@Autowired
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "Boss{" +
"car=" + car +
'}';
}
}
Car.java
/**
* 生命周期测试
* 自动装配测试
*/
@Component
public class Car {
public Car() {
System.out.println("car constructor ...");
}
/**
* 做初始化方法
* 初始化方法不可以有参数 但可以抛异常
*/
public void init() {
System.out.println("car init ...");
}
/**
* 做销毁方法
* 销毁方法不可以有参数 但可以抛异常
*/
public void destroy() {
System.out.println("car destroy ...");
}
}
配置类
@Configuration
@ComponentScan(value = {"com.example.annotations.service","com.example.annotations.dao","com.example.annotations.controller","com.example.annotations.bean"})
public class MainConfig4Autowire {
}
测试:
@Test
void autowiredTest(){
//配置类测试
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig4Autowire.class);
System.out.println("容器创建完毕");
//获取bean
System.out.println("准备获取bean");
Boss boss = applicationContext.getBean(Boss.class);
Car car = applicationContext.getBean(Car.class);
System.out.println(boss.toString());
System.out.println(car.toString());
System.out.println("获取完毕");
//关闭容器
applicationContext.close();
System.out.println("容器已关闭");
}
@Bean + 方法参数
@Component
public class Boss {
private Car car;
public Boss(Car car) {
System.out.println("构造方法注入");
this.car = car;
}
public Car getCar() {
return car;
}
// @Autowired
public void setCar(Car car) {
System.out.println("setter注入");
this.car = car;
}
@Override
public String toString() {
return "Boss{" +
"car=" + car +
'}';
}
}
运行测试之后可看到有相应输出