1. 程式人生 > >【Spring註解】3、屬性賦值

【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群:
180479701(2群)

--------------------- 作者:caychen 來源:CSDN 原文:https://blog.csdn.net/caychen/article/details/83009432?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!