组件的自动装配

编程

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

@Component

public 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

回到顶部