22.1 @Autowired
标注在方法上
- 标注在方法上,Spring容器创建当前对象,就会调用方法,完成赋值
- 方法使用的参数,自定义类型的值从IOC容器中获取
package com.suirui.springanno.autowiredDemo.entity;
import org.springframework.stereotype.Component;
@Component
public class Car {
String label = "car1";
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}
package com.suirui.springanno.autowiredDemo.entity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Boss {
Car car;
public Car getCar() {
return car;
}
@Autowired
//标注在方法上,Spring容器创建当前对象,就会调用方法,完成赋
//方法使用的参数,自定义类型的值从IOC容器中获取
public void setCar(Car car) {
this.car = car;
}
public void print(){
System.out.println("Boss car类注入" + car);
if (car == null) {
return;
}
System.out.println("car的Label: " + car.getLabel());
}
}
package com.suirui.springanno.autowiredDemo;
import com.suirui.springanno.autowiredDemo.Service.BookService;
import com.suirui.springanno.autowiredDemo.config.MainConfigAutoWired;
import com.suirui.springanno.autowiredDemo.entity.Boss;
import com.suirui.springanno.autowiredDemo.entity.Car;
import com.suirui.springanno.propertyValues.entity.Person;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
public class MainTestAutoWired {
public static void main(String[] args) {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfigAutoWired.class);
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String s : beanDefinitionNames) {
System.out.println(s);
}
Boss bean = ac.getBean(Boss.class);
Car bean1 = ac.getBean(Car.class);
System.out.println(bean.getCar() == bean1);
bean.print();
}
}
22.2 @Autowired
标注在构造器
- 默认加在IOC容器中的组件,容器启动会调用无参构造器创建对象,再进行赋值操作
- 会调用
@Autowired
标注在构造器,构造器中的组件也是从IOC容器中获取 - 如果组件只有一个有参构造器,这个有参构造器的
@Autowired
可以省略,中的组件也是自动从IOC容器中获取 @Autowired
标注多个构造器会报错
package com.suirui.springanno.autowiredDemo.entity;
import org.springframework.stereotype.Component;
@Component
public class House {
String label = "house1";
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}
package com.suirui.springanno.autowiredDemo.entity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Boss {
Car car;
House house;
public Boss() {
}
@Autowired
public Boss(Car car) {
this.car = car;
}
@Autowired
public Boss(House house) {
this.house = house;
}
public Car getCar() {
return car;
}
// @Autowired
//标注在方法上,Spring容器创建当前对象,就会调用方法,完成赋
//方法使用的参数,自定义类型的值从IOC容器中获取
public void setCar(Car car) {
this.car = car;
}
public void print(){
System.out.println("Boss car类注入" + car);
System.out.println("Boss house类注入" + house);
if (car == null) {
return;
}
System.out.println("car的Label: " + car.getLabel());
System.out.println("house的Label: " + house.getLabel());
}
}
22.3 @Autowired
标注在参数上
- 参数也是从IOC容器中获取
- @Bean方式+方法参数;参数从容器中获取,可以省略
@Autowired
package com.suirui.springanno.autowiredDemo.config;
import com.suirui.springanno.autowiredDemo.dao.BookDao;
import com.suirui.springanno.autowiredDemo.entity.Boss;
import com.suirui.springanno.autowiredDemo.entity.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@Configuration
@ComponentScan(value = "com.suirui.springanno.autowiredDemo")
public class MainConfigAutoWired {
// @Bean(value = "bookDao2")
// @Primary
// public BookDao bookDao(){
// BookDao b = new BookDao();
// b.setLabel("2");
// return b;
// }
@Bean
public Boss boss(Car car){
Boss boss = new Boss();
boss.setCar(car);
return boss;
}
}