组件的自动装配

我怕爱的太早我们不能终老 提交于 2020-08-10 09:04:16

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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!