Spring學(xué)習(xí)04 屬性賦值
屬性的賦值方式有幾種(使用注解的方式)
-
使用@Value注解,直接給屬性賦值:
@Value("Bruce") private String name;
-
使用spring,EL表達式給屬性賦值#{},
@Value("#{20 * 30}") private Integer age;
-
獲取環(huán)境變量中的值,即使用${},獲取屬性值.注入屬性值之前新建一個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容器中各個組件的依賴關(guān)系賦值.
-
使用AutoWired注解,對容器中bean的依賴關(guān)系進行自動注入
@Controller public class SpringController { @Autowired private SpringService springService; public void print(){ System.out.println(springService); springService.print(); } }
- 自動注入時,優(yōu)先根據(jù)組件類型對屬性值進行注入.如果找到組件類型,就進行組件的賦值.
- 如果存同一個類型的Bean存在多個,則將屬性的名稱作為id去容器中查詢
- 使用@Qualifier注解,明確指定組件的Id
- 如果ioc容器中沒有這個bean,但是需要將屬性賦值.@Autowired(required = false),這種方式可以使bean沒有時,不需要報錯
- @Primary 注解,配合auto wire組件,首先優(yōu)先被裝配的bean,也可以使用Qualifier注解指定裝配的bean.
-
spring還支持@Resource注解,此注解在JSR250規(guī)范中定義.
// @Qualifier("springDao") // @Autowired(required = false) @Resource private SpringDao springDao;
@Resource注解可以替代@Autowired注解,但是和auto wire的裝配機制有區(qū)別,默認是按照組件名稱進行自動化裝配.@resource注解不支持@Primary注解.也不支持@auto wire注解中,required=true的用法.
@Inject,是JSR330規(guī)范中定義的注解,@Inject注解,支持@Primary注解.也有自動裝配的功能,@Inject沒有屬性,無法進行指定
Auto wire是spring定義的,@Inject和@Resource注解是Java規(guī)范定義的.具有通用性.
類AutowiredAnnotationBeanPostProcessor,專門用來對自動裝配的注解進行處理.
-
Auto wire注解的使用范圍,可以作用在構(gòu)造器,方法,參數(shù)
-
如果bean中只有唯一的有參構(gòu)造器,可以省略注解.例如:
// 如果有唯一的構(gòu)造器,可以省略@Auto wire注解 public Boss(Car car){ this.car = car; }
標(biāo)注在方法位置,以@Bean + @Autowired組合,可以自動將Bean中的屬性注入.
在構(gòu)造器和@Bean注解配合是,一般是省略@Auto wired注解.這個需要注意.
-