【Spring註解】3、屬性賦值
1、@Value
配置檔案 person.properties:
person.nickName=張三
person.age=20
實體類 Person.java:
@Data @AllArgsConstructor @NoArgsConstructor public class Person { /** * 使用@Value賦值 * 1、基本數值型別和String * 2、SpEL表示式: #{} * 3、${}: 取出配置檔案中的值 * */ @Value("${person.nickName}") private String name; @Value("${person.age}") private Integer age; }
配置類 MyConfigOfPropertyValue.java
@PropertySources({
@PropertySource(value="classpath:/person.properties")
})
@Configuration
public class MyConfigOfPropertyValue {
@Bean
public Person person() {
return new Person();
}
}
2、@Autowired、@Qualifier、@Primary、@Resource、@Inject
-
@Autowired
-
預設優先按照型別去容器中找對應的元件;
-
如果找到多個相同型別的元件,則再按照屬性的名稱作為元件的id去容器中查詢;
-
-
@Qualifier:
-
使用@Qualifier指定需要裝配的元件id,而不再使用屬性名;
-
-
@Primary:
-
讓Spring進行自動裝配的時候,預設使用首選的Bean;
-
-
@Resource:
-
可以和@Autowired註解一樣,實現自動裝配功能,預設是按照元件名稱進行裝配的;
-
也可以使用註解的name屬性來使用指定的Bean;
-
但是不能支援@Primary功能,也不支援@Autowired的required屬性;
-
-
@Inject:
-
需要匯入javax.inject的依賴包;
-
可以和@Autowired註解一樣,實現自動裝配功能,但是不支援required屬性;
-
該小節的例子就不再一一列舉了,相信大家對其也是相當熟練了。
3、Spring底層元件
自定義元件實現xxxAware介面,在建立物件的時候,會呼叫介面規定的方法注入相關的元件,從而把Spring底層的一些元件注入到自定義的元件中。
-
ApplicationContextAware
-
用於獲取ApplicationContext
-
-
BeanFactoryAware
-
用於獲取BeanFactory
-
-
BeanNameAware
-
用於獲取BeanName
-
-
EmbeddedValueResolverAware
-
用於獲取StringValueResolver
-
-
...
4、@Profile
@Profile:指定元件在某種環境下才能啟用並註冊到容器中,不指定的話,任何環境都能註冊該元件。它由Spring提供,可以根據當前環境,動態的啟用和切換一系列元件的功能。
-
加了環境標識的Bean,只有在指定的環境被啟用的情況下才能註冊到容器中,預設環境是default;
-
寫在配置類上,只有在指定環境的時候,整個配置類裡面的所有配置才能生效;
-
沒有標註環境標識的Bean,在任何環境下都是載入的。
@Configuration
public class MyConfigOfProfile implements EmbeddedValueResolverAware{
@Value("${db.user}")
private String user;
private String driverClass;
@Bean
@Profile(value="test")
public DataSource dataSourceTest(@Value("${db.password}")String password) throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(password);
dataSource.setJdbcUrl("jdbc:mysql:///test");
dataSource.setDriverClass(driverClass);
return dataSource;
}
@Bean
@Profile(value="dev")
public DataSource dataSourceDev(@Value("${db.password}")String password) throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(password);
dataSource.setJdbcUrl("jdbc:mysql:///mybatis");
dataSource.setDriverClass(driverClass);
return dataSource;
}
@Bean
@Profile(value="prod")
public DataSource dataSourceProd(@Value("${db.password}")String password) throws Exception{
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser(user);
dataSource.setPassword(password);
dataSource.setJdbcUrl("jdbc:mysql:///ssm");
dataSource.setDriverClass(driverClass);
return dataSource;
}
@Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
// TODO Auto-generated method stub
this.driverClass = resolver.resolveStringValue("${db.driverClass}");
}
}
注:為了配合多種注入的方式,所以程式碼採用了不同的注入方式來寫這個配置類。
設定環境標識的方式:
- 使用虛擬機器引數:-Dspring.profiles.active=...
@Test
public void test1() {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(
MyConfigOfProfile.class);
String[] beanNamesForType = applicationContext.getBeanNamesForType(DataSource.class);
Arrays.asList(beanNamesForType).stream().forEach(System.out::println);
}
- 使用程式碼修改環境標識:
@Test
public void test2() {
// 建立applicationContext
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
// 設定需要啟用的環境
applicationContext.getEnvironment().setActiveProfiles("test", "dev");
// 設定主配置類
applicationContext.register(MyConfigOfProfile.class);
// 啟動重新整理
applicationContext.refresh();
String[] beanNamesForType = applicationContext.getBeanNamesForType(DataSource.class);
Arrays.asList(beanNamesForType).stream().forEach(System.out::println);
}
====================打個廣告,歡迎關注====================
QQ: |
412425870 |
微信公眾號:Cay課堂 |
|
csdn部落格: |
http://blog.csdn.net/caychen |
碼雲: |
https://gitee.com/caychen/ |
github: |
https://github.com/caychen |
點選群號或者掃描二維碼即可加入QQ群:328243383(1群) |
|
點選群號或者掃描二維碼即可加入QQ群: |
|
--------------------- 作者:caychen 來源:CSDN 原文:https://blog.csdn.net/caychen/article/details/83009432?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!