【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元件。之前將的都是在來的欄位上添加註解,那有沒有什麼方法可以實現方法、構造器位置的自動裝配嗎?今天我們就一起來探討下如何實現方法、構造器位置的自動裝配。 > > 關注 **冰河技術*