Spring註解 - 生命週期、屬性賦值、自動裝配
阿新 • • 發佈:2020-03-18
# 一、Bean的生命週期
## 流程
**Bean建立 —— 初始化 —— 銷燬**
建立:
- 單例項:在容器啟動時建立物件
- 多例項:每次呼叫時建立物件
初始化:
- 都是在物件建立完成後,呼叫初始化方法
銷燬:
- 單例項:容器關閉時,呼叫銷燬方法
- 多例項:容器不會管理這個bean,只能手動呼叫銷燬方法
## 實現方式
1. 在 @Bean 註解上指定初始化(**initMethod**)、銷燬方法(**destroyMethod**)
```java
@Bean(initMethod = "init", destroyMethod = "destroy")
public Car car(){
return new Car();
}
```
2. 讓Bean實現 **InitializingBean** 和 **DisposableBean** 介面,重寫它們的方法
```java
public class Cat implements InitializingBean, DisposableBean {
public Cat() {
System.out.println("Cat...Construct...");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Cat...init...");
}
@Override
public void destroy() throws Exception {
System.out.println("Cat...destroy...");
}
}
```
3. 使用 JSR250 中的 **@PostConstruct** 和 **@PreDestroy** 註解標註初始化、銷燬方法
```java
public class Dog {
public Dog() {
System.out.println("Dog...Construct...");
}
@PostConstruct
public void init(){
System.out.println("Dog...init...");
}
@PreDestroy
public void destroy(){
System.out.println("Dog...destroy...");
}
}
```
4. 實現BeanPostProcessor介面,重寫
**postProcessBeforeInitialization**(在初始化之前工作)
**postProcessAfterInitialization**(在初始化之後工作)
```java
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization" + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization" + beanName);
return bean;
}
}
```
# 二、屬性賦值相關注解
## @Value
**作用:**
新增在欄位上,用於給屬性賦值
**屬性:**
- value:指定要傳入的值
**用法:**
```java
public class Person {
@Value("張三") //普通方式賦值
private String name;
@Value("#{20 - 1}") //使用SpEL表示式
private Integer age;
@Value("${person.nickName}") //使用 ${} 讀取配置檔案內容
private String nickName;
//省略getter setter toString方法
}
```
上述第三種方式顯然是不能讀取到的,我們需要配置一下配置檔案的位置,使用到下面這個註解
## @PropertySource
**作用:**
讀取指定的外部配置檔案,將K/V鍵值對儲存到執行的環境變數中,用 ${} 來獲取
**屬性:**
- name:給屬性源指定一個名稱
- value:要載入的配置檔案的路徑,可以指定多個
- ignoreResourceNotFound:是否忽略資源未找到的情況,預設false
- encoding:給定資源的特定字元編碼,例如 “UTF-8”
- factory:指定一個自定義屬性源工廠,預設使用 PropertySourceFactory
**用法:**
在 resources 目錄下建立一個 properties 檔案,內容如下
```properties
person.nickName=小張
```
然後在配置類上標註 `@PropertySource("classpath:person.properties")` 即可
可以直接在@Value註解中獲取,也可以通過 ioc 容器物件獲取
```java
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration4.class);
String nickName = context.getEnvironment().getProperty("person.nickName");
System.out.println(nickName);
```
# 三、自動裝配相關注解
Spring 利用依賴注入(DI),完成對IOC容器中各個元件的依賴關係賦值
## @Autowired
- 預設按照型別去容器中尋找對應的元件,如果只有一個就賦值
- 如果找到多個相同型別的元件,再按照屬性名尋找
- 有一個required屬性,預設是true;
- 可以寫在構造器、方法、引數、屬性上
## @Qualifier
- 一般配合 @Autowired 使用,指定需要裝配的元件的id,@Autowired 就直接按照id注入。
- 如果 id 對應的元件不存在,並且沒有指定 required = false,則會報錯
## @Primary
- 讓Spring進行自動裝配的時候,首先選擇標註了@Primary的元件
- 如果已經使用 @Qualifier 指明瞭要裝配的元件,則不生效
----
**