Spring学习04 属性赋值
属性的赋值方式有几种(使用注解的方式)
-
使用@Value注解,直接给属性赋值:
@Value("Bruce") private String name;
-
使用spring,EL表达式给属性赋值#{},
@Value("#{20 * 30}") private Integer age;
-
获取环境变量中的值,即使用${},获取属性值.注入属性值之前新建一个person.properties文件,写入属性person.nikeName=ThirdDog,然后在配置类上面将文件注入到IOC容器中.
package com.wzl.yanyan.spring01.config; import com.wzl.yanyan.Person; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.PropertySource; @PropertySource("classpath:/person.properties") public class MainConfigPropertyValue { @Bean public Person getPerson(){ return new Person(); } }
然后使用获取属性:
@Value("${person.nikeName}") private String nickName;
spring的自动装配
spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值.
-
使用AutoWired注解,对容器中bean的依赖关系进行自动注入
@Controller public class SpringController { @Autowired private SpringService springService; public void print(){ System.out.println(springService); springService.print(); } }
- 自动注入时,优先根据组件类型对属性值进行注入.如果找到组件类型,就进行组件的赋值.
- 如果存同一个类型的Bean存在多个,则将属性的名称作为id去容器中查询
- 使用@Qualifier注解,明确指定组件的Id
- 如果ioc容器中没有这个bean,但是需要将属性赋值.@Autowired(required = false),这种方式可以使bean没有时,不需要报错
- @Primary 注解,配合auto wire组件,首先优先被装配的bean,也可以使用Qualifier注解指定装配的bean.
-
spring还支持@Resource注解,此注解在JSR250规范中定义.
// @Qualifier("springDao") // @Autowired(required = false) @Resource private SpringDao springDao;
@Resource注解可以替代@Autowired注解,但是和auto wire的装配机制有区别,默认是按照组件名称进行自动化装配.@resource注解不支持@Primary注解.也不支持@auto wire注解中,required=true的用法.
@Inject,是JSR330规范中定义的注解,@Inject注解,支持@Primary注解.也有自动装配的功能,@Inject没有属性,无法进行指定
Auto wire是spring定义的,@Inject和@Resource注解是Java规范定义的.具有通用性.
类AutowiredAnnotationBeanPostProcessor,专门用来对自动装配的注解进行处理.
-
Auto wire注解的使用范围,可以作用在构造器,方法,参数
-
如果bean中只有唯一的有参构造器,可以省略注解.例如:
// 如果有唯一的构造器,可以省略@Auto wire注解 public Boss(Car car){ this.car = car; }
标注在方法位置,以@Bean + @Autowired组合,可以自动将Bean中的属性注入.
在构造器和@Bean注解配合是,一般是省略@Auto wired注解.这个需要注意.
-