Spring - Bean的自动装配

@Autowired自定注入

@Autowired自定注入是规则如下:

  • 默认按照类型去容器中找对应的组件
  • 自动装配默认容器中不能为null,如果允许为null的话需要指定@Autowired的required属性赋值成false
  • 如果存在多个相同类型的实例,就按照属性名称作为id去容器中查找
  • 如果容器中存在多个Bean实例,可以使用@Qualifier注解指定被注入的属性名
  • 如果容器中存在多个Bean实例,可以在需要注入的类实例上使用@Primary注解,让其成为首选注入的实例Bean
  • @Qualifier和@Primary同时存在的话,@Qualifier的优先级大于@Primary

@Autowired能标注的地方:

  • 构造器(如果当前类只有一个有参构造器,那么@Autowired可以省略,对应的参数还是会自动从Spring的IOC容器中获取并注入)
  • 参数(@Bean标注的参数,@Autowired也可以省略,对应的属性也能从Spring的IOC容器中获取并注入)
    @Configuration//告诉Spring这里是一个配置文件
    public class SpringConfig12 {
    
        @Bean(name = "car")
        public Car getCar() {
            return new Car();
        }
    
        @Bean
        public Boss boss(Car car) { //用@Bean标注,这里的Car前面的@Autowired可以省略
            return new Boss(car);
        }
    }
  • 属性
  • 方法(标注在方法上的时候,Spring容器在实例化当前对象的时候就会调用该方法,自动注入)

@Resource和@Inject

@Resource是java规范(JSR250)中的注解,也能实现自动装配,默认是按照属性名称进行装配的,但是不支持@Primary和@Autowired(required =false)

@Inject是java中的规范(JSR330),需要导入依赖。然后也能实现自动装配的功能,但是没有@Autowired注解那么强大

<!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

Aware接口

如果我们自定义的Bean需要使用到Spring容器底层的对象,例如:ApplicationContext、BeanFactory、Environment、ClassLoader等等我们只需要实现对应的xxxxAware接口,然后实现接口中的setxxxx方法就好了

拿ApplicationContextAware举例子

public class Boss implements ApplicationContextAware {

    private Car car;
    private ApplicationContext context;

    public Boss(Car car) {
        this.car = car;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.context = applicationContext;
    }

    @Override
    public String toString() {
        return "Boss{" +
                "car=" + car +
                '}';
    }
}

猜你喜欢

转载自blog.csdn.net/qq_27062249/article/details/118074766