1. 程式人生 > >【Spring註解】——生命週期以及自動裝配

【Spring註解】——生命週期以及自動裝配

    本文主要講解一下配合spring註解講解spring中bean的生命週期和自動裝配涉及到一些註解,如有理解偏頗之處,懇請各位大神指正。

容器管理bean的生命週期

bean的生命週期

     bean建立——初始化——銷燬過程

--> Spring IOC容器例項化Bean
--> 呼叫BeanPostProcessor的postProcessBeforeInitialization方法
--> 呼叫bean例項的初始化方法
--> 呼叫BeanPostProcessor的postProcessAfterInitialization方法

BeanPOstProcessor原理

 * populateBean(beanName, mbd, instanceWrapper);給bean進行屬性賦值
 * initializeBean
 * {
 * applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
 * invokeInitMethods(beanName, wrappedBean, mbd);執行自定義初始化
 * applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
 *}

1、構造(物件建立)

    @Scope

      單例項:在容器啟動的時候建立物件

      多例項:在每次獲取的時候建立物件

2、初始化

     物件建立完成,並賦值好,呼叫初始化方法。

1)通過@Bean指定init-method和destroy-method

@Bean(initMethod="init",destroyMethod="detory")
public Car car(){
   return new Car();
}

2)通過實現讓bean實現InitializingBean(定義初始化邏輯),DisposableBean(定義銷燬邏輯);

@Component
public class Cat implements InitializingBean,DisposableBean {
	
	public Cat(){
		System.out.println("cat constructor...");
	}

	@Override
	public void destroy() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("cat...destroy...");
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("cat...afterPropertiesSet...");
	}
}

3)使用JSR520:

@PostConstruct:在bean建立完成並且屬性賦值完成;來執行初始化方法

@PreDestroy:在容器銷燬bean之前通知我們進行清理工作

@Component
public class Dog{
	public Dog(){
		System.out.println("dog constructor...");
	}
	//物件建立並賦值之後呼叫
	@PostConstruct
	public void init(){
		System.out.println("[email protected]");
	}
	//容器移除物件之前
	@PreDestroy
	public void detory(){
		System.out.println("[email protected]");
	}
}

4)自定義實現BeanPostProcessor介面的bean後置處理器

在bean初始化前後進行一些處理工作;可以用來處理初始化前後的方法

 * postProcessBeforeInitialization:在初始化之前工作
 * postProcessAfterInitialization:在初始化之後工作
Demo展示
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

	//初始化之前
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean);
		return bean;
	}

	//初始化之後
	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		// TODO Auto-generated method stub
		System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean);
		return bean;
	}
}

2、屬性賦值

1)@Value

1、基本數值
2、可以寫SpEL; #{}

3、可以寫${};取出配置檔案【properties】中的值(在執行環境變數裡面的值)

        @Value("張三")
	private String name;
	@Value("#{20-2}")
	private Integer age;
	
	@Value("${person.nickName}")
	private String nickName;

注意:如果需要給靜態成員變數賦值,上述賦值為null,因為static是在bean初始化之前進行賦值的,所以@value無法賦值,具體解決方案,詳見https://blog.csdn.net/jiadajing267/article/details/79715231

2)@PropertySource

使用@PropertySource讀取外部配置檔案中的k/v儲存到執行的環境變數中;載入完外部的配置檔案以後使用${}取出配置檔案的值

3、自動裝配

1)、@Autowired 自動注入

 1)、預設優先按照型別去容器中找對應的元件:applicationContext.getBean(BookDao.class);找到就賦值
 2)、如果找到多個相同型別的元件,再將屬性的名稱作為元件的id去容器中查詢
         applicationContext.getBean("bookDao")
 3)、@Qualifier("bookDao"):使用@Qualifier指定需要裝配的元件的id,而不是使用屬性名
 4)、自動裝配預設一定要將屬性賦值好,沒有就會報錯;
        可以使用@Autowired(required=false);
 5)、@Primary:讓Spring進行自動裝配的時候,預設使用首選的bean;
 	也可以繼續使用@Qualifier指定需要裝配的bean的名字

@Autowired:標註在構造器,引數,方法,屬性;都是從容器中獲取引數元件的值

2)@Resource

    可以和@Autowired一樣實現自動裝配功能;預設是按照元件名稱進行裝配的;

    沒有能支援@Primary功能沒有支援@Autowired(reqiured=false);

3)@Inject

     需要匯入javax.inject的包,和Autowired的功能一樣。沒有required=false的功能

     @Autowired是spring定義,@Resource和@Inject是Java規範

4、自定義元件獲取spring容器底層元件

自定義元件想要使用Spring容器底層的一些元件(ApplicationContext,BeanFactory,xxx);
自定義元件實現xxxAware;在建立物件的時候,會呼叫介面規定的方法注入相關元件;Aware;

把Spring底層一些元件注入到自定義的Bean中

 * xxxAware:功能使用xxxProcessor;
 * 	ApplicationContextAware==》ApplicationContextAwareProcessor;
Demo
@Component
public class Dog implements ApplicationContextAware {
	//@Autowired
	private ApplicationContext applicationContext;
	
	public Dog(){
		System.out.println("dog constructor...");
	}
	
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		// TODO Auto-generated method stub
		this.applicationContext = applicationContext;
	}
}

5、根據環境裝配bean

@Profile

    Spring為我們提供的可以根據當前環境,動態的啟用和切換一系列元件的功能;最常見的就是利用swagger的使用問題

 1)、加了環境標識的bean,只有這個環境被啟用的時候才能註冊到容器中。預設是default環境
 2)、寫在配置類上,只有是指定的環境的時候,整個配置類裡面的所有配置才能開始生效
 3)、沒有標註環境標識的bean在,任何環境下都是載入的

相關推薦

Spring註解——生命週期以及自動裝配

    本文主要講解一下配合spring註解講解spring中bean的生命週期和自動裝配涉及到一些註解,如有理解偏頗之處,懇請各位大神指正。容器管理bean的生命週期bean的生命週期     bea

Spring註解2、Bean生命週期

1、初始化和銷燬 通過@Bean註解的initMethod和destroyMethod屬性 InitializingBean介面、DisposableBean介面 可以使用JSR250: @PostConstruct:在Bean建立完成並且屬性

Spring註解四、自動裝配@[email protec

四、自動裝配 [email protected]&@Qualifier和@Primary @Autowried是Spring2.5定義的自動裝配的註解,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。 使用 @Au

Spring註解1、Spring元件註冊

1、@Configuration: 指定該註解的類是個配置類,對應之前的配置檔案   2、@Bean: 指定該方法作為一個Bean元件,它會往容器中註冊一個Bean元件; 其中型別為返回值,id預設為方法名;

Spring註解3、屬性賦值

1、@Value 配置檔案 person.properties: person.nickName=張三 person.age=20 實體類 Person.java: @Data @AllArgsConstructor @NoArgsConstructor public class

Spring註解FactoryBean註冊

5.FactoryBean 自定義Cat的工廠物件 CatFactoryBean /** * @author GaoYuzhe * @date 2018/3/13. */ publ

Spring註解@Condition條件註冊

[email protected]條件註冊 @Condition來指定一定條件下注冊元件對像 All Conditions that must match in order

Spring註解@Configuration和@ComponentScan註解

Spring註解 一、組建註冊 包結構: [email protected]和@ComponentScan @ComponentScan的includeFilters

Spring註解@Scope 作用域和@Lazy懶載入

[email protected] 作用域和@Lazy懶載入 @Scope來表示註冊物件的作用域。 @Scope的四種類型 //多例模式,只有在使用類時才註冊物件

小程式生命週期與app物件的使用

小程式的生命週期與app物件的使用 APP的生命週期 App()函式用來註冊一個小程式。接受一個 object 引數,其指定小程式的生命週期函式等。 App()必須在app.js中註冊,且不能註冊多個。 object引數說明: 當小程式處於前臺

Spring註解(三):自動裝配

13、自動裝配:【13-1】@Autowired:自動注入(推薦使用);可以在構造器(如果元件只有一個有參構造器,這個有參構造器的@Autowired可以省略,引數位置的元件還是可以自動從容器中獲取)、引數、方法(一般標註在SET方法上)、屬性中使用①預設優先按照型別去容器找

spring系列之7:生命週期-BeanPostProcessor原理以及spring底層中的運用

本章節重點說一下我們自定義的BeanPostProcessor的執行機制和呼叫棧。 事前準備: 1.自定義beanPostProcessor 2.註冊自定義的beanPostProcessor到容器中 1.自定義beanPostProcessor @Componen

Spring註解驅動開發使用InitializingBean和DisposableBean來管理bean的生命週期,你真的瞭解嗎?

## 寫在前面 > 在《[【Spring註解驅動開發】如何使用@Bean註解指定初始化和銷燬的方法?看這一篇就夠了!!](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484985&idx=1&sn=bf7e

淺談servlet的生命週期 ,以及Request請求

 servlet 的生命週期,從建立到銷燬; 在接收request的時候Tomcat呼叫init方法建立servlet,service對request 或response 進行處理,關閉伺服器時候呼叫destory方法,servlet銷燬;【多次請求 init()方法僅僅被

Spring Bean的生命週期(非常詳細)

Spring作為當前Java最流行、最強大的輕量級框架,受到了程式設計師的熱烈歡迎。準確的瞭解Spring Bean的生命週期是非常必要的。我們通常使用ApplicationContext作為Spring容器。這裡,我們講的也是 ApplicationContext中Be

Spring學習spring註解自動注入bean

Spring mvc註解用到的配置: <!-- 啟用spring mvc 註解 --> <context:annotation-config /> <context:component-scan base-package

spring系列- IOC容器Bean生命週期

Spring IOCBean的生命週期: bean物件例項化—>屬性注入—>beanfactory—>ApplicationContext---->postProcessBeforeInitialization—> Initi

Spring註解驅動開發元件註冊-@ComponentScan-自動掃描元件&指定掃描規則

## 寫在前面 > 在實際專案中,我們更多的是使用Spring的包掃描功能對專案中的包進行掃描,凡是在指定的包或子包中的類上標註了@Repository、@Service、@Controller、@Component註解的類都會被掃描到,並將這個類注入到Spring容器中。Spring包掃描功能可以使

Spring註解驅動開發使用@Autowired@Qualifier@Primary三大註解自動裝配元件,你會了嗎?

## 寫在前面 > 【Spring專題】停更一個多月,期間在更新其他專題的內容,不少小夥伴紛紛留言說:冰河,你【Spring專題】是不是停更了啊!其實並沒有停更,只是中途有很多小夥伴留言說急需學習一些知識技能,以便於跳槽,哈哈,大家都懂得!所以,中途停更了一段時間,寫了一些其他專題的文章。現在,繼續更

Spring註解驅動開發如何實現方法、構造器位置的自動裝配?我這樣回答讓面試官很滿意!

## 寫在前面 > 在 **冰河技術** 微信公眾號前面的文章中,我們介紹瞭如何使用註解來自動裝配Spring元件。之前將的都是在來的欄位上添加註解,那有沒有什麼方法可以實現方法、構造器位置的自動裝配嗎?今天我們就一起來探討下如何實現方法、構造器位置的自動裝配。 > > 關注 **冰河技術*