2019.7.02 Spring自动注入

7.01

  • @AutoWired默认优先寻找和类型一致的bean,如果容器存在多种类型的bean,默认会注入id和@Autowired注解的bean对象的名称一致的bean。可以使用@Qualifier(“XXXX(bean的id)”)来指定到底注入那个bean。如果在容器中找到相同类型的Bean,那么就会抛出异常,此时可使用@AutoWired注解的属性required=false,这样就会给这个bean==null。

  • 使用@Primary注解的Bean,在@autowired的时候,默认首先注入被@Primary注解的bean

  • 还支持使用@Resource(JSR250规范)和@Inject(JSR330)

  • @Resouces作用和@Autowired作用一样,可以用于自动装配,默认优先配置id和属性名一样的bean,也可以使用@Resources(name="XXX")来指定某个具体的Bean

  • @Autowired不仅可以注解到方法上,还可以注解到方法(也可以是构造器)上。

    @Component
    public class Car {
    
        private Person person;
    
        /*当注解到方法时,ioc容器初始化bean会把方法的入参从容器中自动获取,然后执行这个方法(构造器也是)*/
        @Autowired
        public void setPerson(Person person) {
            this.person = person;
        }
    
        @Override
        public String toString() {
            return "Car{" +
                    "person=" + person +
                    '}';
        }
    }
  • @Bean注解的方法形参默认从容器中获取

  • 注入到容器中的组件可以通过实现XXXAware接口来获取Spring底层的组件。

    @Component
    public class Car implements EmbeddedValueResolverAware {
    
        private Person person;
        private int age;
    
        /*当注解到方法时,会把方法的入参从容器中自动获取,然后执行这个方法*/
        @Autowired
        public void setPerson(Person person) {
            this.person = person;
        }
    
        @Override
        public String toString() {
            return "Car{" +
                    "person=" + person +
                    ", age=" + age +
                    '}';
        }
    
        @Override
        public void setEmbeddedValueResolver(StringValueResolver stringValueResolver) {
            /*可以解析Spel*/StringValueResolver
            String s = stringValueResolver.resolveStringValue("你的系统是 ${os.name}");
            System.out.println(s);
        }
    }
  • @Profile指定那些组件在什么环境启用(用于数据源!!!!)

    • 在注册组件的时候,在方法(也可以是方法上,表明整个配置类下面的所有组件)上面加上@Profile("XXX(如test、dev等)"),那么容器启动的时候,会根据环境变量来判断那些组件是需要加载的(这个环境变量(-Dspring.profiles.active=test)可以通过设置jvm,也可以通过代码的方式,不过代码的方式必须是以无参的形式来创建容器)。如果没有被profile注解,不管什么环境都会被注册,前提是配置类没有被profile注解

猜你喜欢

转载自www.cnblogs.com/mwss/p/11123083.html