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注解
- 在注册组件的时候,在方法(也可以是方法上,表明整个配置类下面的所有组件)上面加上