组件的自动装配
MainConfigOfAutowired.class
/**
* 自动装配
* Spring利用DI完成IOC容器中各个组件的依赖注入
*
* 1. @Autowired ,自动注入
* 1.1 默认按照类型优先找寻组件,applicationContext.getBean(LampService.class)
* 1.2 如果找到多个相同类型的组件,再将属性名的名称作为id去找寻组件
* applicationContext.getBean("lampService")
* 1.3 使用@Qualifier("lampDAO")去装配指定id的组件
* 1.4 使用自动装配,一定会在容器中将该组件装配成功,否则会异常,可以使用@Autowired(required = false)指定不必装配
* 1.5 @Primary 让Spring进行自动装配的时候首选该组件
*
* 2. Spring还支持使用@Resource(JSR250)和@Inject(JSR330)[java注解的规范]
*
* @Resouce 可以和@Autowired一样实现自动装配,默认按照组件名称进行装配,不支持@Primary功能,不支持@Autowired(required=false)
* @Inject 需要导入javax.inject的包,和@Autowired一样
* @Autowired 是Spring自定义的,@Resource和@Inject是java规范
* @Autowired 使用AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能
*
* 3. @Autowired:构造器、参数、方法、属性,都是从容器中获取组件的值
* 3.1 标在方法上 @Bean标注的方法创建对象时,方法参数的值默认从容器中获取
* 3.2 标在构造器上,如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置依旧是从IOC容器中获取
* 3.3 放在参数上
*
* 4. 自定义组件想要使用Spring底层容器的一些组件,只需要实现(ApplicationContext,BeanFactory,xxx)
* 自定义组件实现xxxAware,在创建对象的时候,会调用接口规定的方法注入组件
* 把Spring底层的一些组件注入到自定义Bean中
* xxxAware,功能使用xxxProcessor,
* ApplicationContextAware --> ApplicationContextAwareProcessor
*/
@Configuration
@ComponentScan(value = {"com.lun.dao", "com.lun.service"})
@Import({Red.class, Lamp.class, Room.class})
@PropertySource("classpath:lamp.properties")
public class MainConfigOfAutowired {
@Primary
@Bean
public LampDAO lampDAO2() {
return new LampDAO();
}
}
Red.class
public class Red implements ApplicationContextAware, BeanNameAware, EmbeddedValueResolverAware {
private ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("传入的IOC容器对象:" + applicationContext);
this.applicationContext = applicationContext;
}
public void setBeanName(String name) {
System.out.println("当前bean的名称" + name);
}
public void setEmbeddedValueResolver(StringValueResolver resolver) {
String resolverValue = resolver.resolveStringValue("你好${os.name} 我是#{20*18} ");
System.out.println("解析的值" + resolverValue);
}
}
Lamp.class
/**
* 使用@Value赋值
* 1. 基本数值
* 2. 可以使用SpEL,#{}
* 3. 可以写${},取出properties中的值
*/
public class Lamp {
@Value("彩灯")
private String name;
@Value("#{20-10}")
private int power;
@Value("${lamp.place}")
private String place;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPower() {
return power;
}
public void setPower(int power) {
this.power = power;
}
@Override
public String toString() {
return "Lamp{" +
"name="" + name + """ +
", power=" + power +
", place="" + place + """ +
"}";
}
}
Room.class
@Componentpublic class Room {
private Lamp lamp;
// @Autowired
// public Room(Lamp lamp) {
// this.lamp = lamp;
// }
public Room(@Autowired Lamp lamp) {
this.lamp = lamp;
System.out.println("room....有参构造器...");
}
public Lamp getLamp() {
return lamp;
}
/**
* 标注在方法上,Spring容器创建当前对象时就会调用该方法并赋值
* 方法使用的参数,自定义类型的值从IOC容器中获取
*/
@Autowired
public void setLamp(Lamp lamp) {
this.lamp = lamp;
}
// public void setLamp(@Autowired Lamp lamp) {
// this.lamp = lamp;
// }
@Override
public String toString() {
return "Room{" +
"lamp=" + lamp +
"}";
}
}
IOCTest_Autowired.class
public class IOCTest_Autowired { @Test
public void test01() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(
MainConfigOfAutowired.class);
Object service = applicationContext.getBean(LampService.class);
System.out.println(service);
Object dao = applicationContext.getBean(LampDAO.class);
System.out.println(dao);
Object room = applicationContext.getBean(Room.class);
System.out.println(room);
applicationContext.close();
}
}
lamp.properties
lamp.place=u000du000a
以上是 组件的自动装配 的全部内容, 来源链接: utcz.com/z/516836.html