欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

 更新時(shí)間:2021年01月28日 16:02:04   作者:mengda_lei  
這篇文章主要介紹了springboot 實(shí)現(xiàn)bean手動(dòng)注入操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

1、springboot啟動(dòng)類實(shí)現(xiàn)接口ApplicationListener<ContextRefreshedEvent>,實(shí)現(xiàn)方法onApplicationEvent,初始化上下文

package test.projectTest;
import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.system.ApplicationPidFileWriter;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import test.projectTest.util.SpringContextUtil;
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class})
@SpringBootApplication(scanBasePackages={"test.projectTest"})
public class TestApplication implements ApplicationListener<ContextRefreshedEvent>
{
 public static void main( String[] args )
 {
  SpringApplication application = new SpringApplication(TestApplication.class);
  application.addListeners(new ApplicationPidFileWriter());
  application.run(args);
  System.out.println( "啟動(dòng)成功" );
 }
 @Override
 public void onApplicationEvent(ContextRefreshedEvent event) {
  SpringContextUtil.setApplicationContext(event.getApplicationContext());  
 }
}

2.SpringContextUtil工具類初始化ApplicationContext applicationContext

package test.projectTest.util;
import org.springframework.context.ApplicationContext;
/**
 * 獲取spring容器,以訪問容器中定義的其他bean
 */
public class SpringContextUtil{
 //spring上下文
 private static ApplicationContext applicationContext;
 
 /**
  * 實(shí)現(xiàn)ApplicationContextAware接口的回調(diào)方法,設(shè)置上下文環(huán)境
  * @param applicationContext
  */
 public static void setApplicationContext(ApplicationContext applicationContext){
  if(null==SpringContextUtil.applicationContext)
   SpringContextUtil.applicationContext=applicationContext;
 }
 
 public static ApplicationContext getApplicationContext(){
  return applicationContext;
 }
  /**
  * 通過name獲取 Bean.
  *
  * @param name
  * @return
  */
 public static Object getBean(String name) {
  return getApplicationContext().getBean(name);
 }
 /**
  * 通過name獲取 Bean.
  *
  * @param clazz
  * @return
  */
 public static <T> T getBean(Class<T> clazz) {
  return getApplicationContext().getBean(clazz);
 }
 /**
  * 通過name,以及Clazz返回指定的Bean
  *
  * @param name
  * @param clazz
  * @return
  */
 public static <T> T getBean(String name, Class<T> clazz) {
  return getApplicationContext().getBean(name, clazz);
 }
}

3.獲取bean

package test.projectTest.util;
import test.projectTest.mapper.slave.DailyDataMapper;
public class TestUtil{ 
 private static DailyDataMapper dailyDataMapper; 
 static{//手動(dòng)注入bean
  if(dailyDataMapper==null){
   dailyDataMapper = (DailyDataMapper)SpringContextUtil.getBean("dailyDataMapper");
  }
 }
 public static void test(){
  dailyDataMapper.selectByPrimaryKey(1);
 } 
}

補(bǔ)充:springboot中bean的實(shí)例化和屬性注入過程

springboot版本(2.0.4 RELEASE)

大致描述springboot中bean的實(shí)例化和屬性注入過程流程

1) 在某一時(shí)刻Spring調(diào)用了Bean工廠的getBean(beanName)方法。beanName可能是simpleController,或者simpleService,simpleDao,順序沒關(guān)系(因?yàn)楹竺鏁?huì)有依賴關(guān)系的處理)。我們假設(shè)simpleController吧

2)getBean方法首先會(huì)調(diào)用Bean工廠中定義的getSingleton(beanName)方法,來判斷是否存在該名字的bean單例,如果存在則返回,方法調(diào)用結(jié)束(spring默認(rèn)是單例,這樣可以提高效率)

3) 否則,Spring會(huì)檢查是否存在父工廠,如果有則返回,方法調(diào)用結(jié)束

4) 否則,Spring會(huì)檢查bean定義(BeanDefinition實(shí)例,用來描述Bean結(jié)果,component-scan掃描后,就是將beanDefinition實(shí)例放入Bean工廠,此時(shí)還沒有被實(shí)例化)是否有依賴關(guān)系,如果有,執(zhí)行1)步,獲取依賴的bean實(shí)例

5) 否則,Spring會(huì)嘗試創(chuàng)建這個(gè)bean實(shí)例,創(chuàng)建實(shí)例前,Spring會(huì)檢查調(diào)用的構(gòu)造器,并實(shí)例化該Bean,(通過Constructor.newInstance(args)進(jìn)行實(shí)例化)

6) 實(shí)例化完成后,Spring會(huì)調(diào)用Bean工廠的populateBean方法來填充bean實(shí)例的屬性,也就是自動(dòng)裝配。populateBean方法便是調(diào)用了BeanPostProcessor實(shí)例來完成屬性元素的自動(dòng)裝配工作

7)在元素裝配過程中,Spring會(huì)檢查被裝配的屬性是否存在自動(dòng)裝配的其他屬性,然后遞歸調(diào)用getBean方法,知道所有@Autowired的元素都被裝配完成。如在裝配simpleController中的simpleService屬性時(shí),發(fā)現(xiàn)SimpleServiceImpl實(shí)例中存在@Autowired屬性simpleDao,然后調(diào)用getBean(simpleDao)方法,同樣會(huì)執(zhí)行1)----7)整個(gè)過程。所有可以看成一個(gè)遞歸過程。

8)裝配完成后,Bean工廠會(huì)將所有的bean實(shí)例都添加到工廠中來。

Bean的實(shí)例化

1. 進(jìn)入SpringApplication類中refreshContext()方法

2. 進(jìn)入AbstractApplicationContext類中refresh()方法,找到this.finishBeanFactoryInitialization()方法,這個(gè)方法就是完成beanFactory的實(shí)例化

3. 進(jìn)入AbstractApplicationContext類中finishBeanFactoryInitialization()方法,找到preInstantiateSingletons()

4. 進(jìn)入DefaultListableBeanFactory類中preInstantiateSingletons()方法,找到getBean()方法

5. 進(jìn)入AbstractBeanFactory類中g(shù)etBean()方法,找到doGetBean()方法

6. 在AbstractBeanFactory類中doGetBean方法中,找到createBean()方法

7. 進(jìn)入AbstractAutowireCapableBeanFactory類中createBean方法中,找到doCreateBean()方法

8. 在AbstractAutowireCapableBeanFactory類中doCreateBean()方法中,找到createBeanInstance()方法,看名字就知道是實(shí)例化bean的

9. 在AbstractAutowireCapableBeanFactory類createBeanInstance()方法中,找到instantiateBean()方法

10. 在AbstractAutowireCapableBeanFactory類instantiateBean()方法中,找到instantiate()方法

11. 在SimpleInstantiationStrategy類instantiate()方法中,找到instantiateClass()方法

12. 在BeanUtils類instantiateClass()方法中,可知bean的實(shí)例化是通過Constructor.newInstance()進(jìn)行實(shí)例化

Bean的屬性注入

1. 在AbstractAutowireCapableBeanFactory類doCreateBean()方法中,找到populateBean()方法,從名字可知是用來填充bean的

2. 在AbstractAutowireCapableBeanFactory類中populateBean()方法,找到postProcessPropertyValues()方法

3. 進(jìn)入AutowiredAnnotationBeanPostProcessor類中postProcessPropertyValues()方法中,找到findAutowiringMetadata()方法,在這個(gè)方法中,如果屬性中含有@Autowired注解則會(huì)遞歸getBean()。沒有然后進(jìn)入inject()方法中

4. 進(jìn)入AutowiredAnnotationBeanPostProcessor類inject方法中,找到resolveDependency()方法,通過這個(gè)方法獲取對應(yīng)字段的值

5. 進(jìn)入AutowiredAnnotationBeanPostProcessor類inject方法中,找到field.set(bean, value)方法,通過反射將值設(shè)置到屬性中

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • 解決java web應(yīng)用線上系統(tǒng)偶發(fā)宕機(jī)的情況

    解決java web應(yīng)用線上系統(tǒng)偶發(fā)宕機(jī)的情況

    這篇文章主要介紹了解決java web應(yīng)用線上系統(tǒng)偶發(fā)宕機(jī)的情況,具有好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java?中向?Arraylist?添加對象的示例代碼

    Java?中向?Arraylist?添加對象的示例代碼

    本文介紹了如何在 Java 中向 ArrayList 添加對象,并提供了示例和注意事項(xiàng),通過掌握這些知識,讀者可以在自己的 Java 項(xiàng)目中有效地使用 ArrayList 來存儲(chǔ)和操作對象,需要的朋友可以參考下
    2023-11-11
  • 簡單驗(yàn)證碼生成Java版

    簡單驗(yàn)證碼生成Java版

    這篇文章主要為大家詳細(xì)介紹了簡單驗(yàn)證碼生成Java版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 使用EasyPoi輕松導(dǎo)入導(dǎo)出Excel文檔的方法示例

    使用EasyPoi輕松導(dǎo)入導(dǎo)出Excel文檔的方法示例

    這篇文章主要介紹了使用EasyPoi輕松導(dǎo)入導(dǎo)出Excel文檔的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • maven中pom.xml詳細(xì)介紹

    maven中pom.xml詳細(xì)介紹

    最近在學(xué)習(xí)maven,這篇文章主要介紹了maven中pom.xml詳細(xì)介紹,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java創(chuàng)建多線程服務(wù)器流程

    Java創(chuàng)建多線程服務(wù)器流程

    這篇文章主要介紹了Java創(chuàng)建多線程服務(wù)器流程,以下實(shí)例演示了如何使用Socket類的accept()方法和ServerSocket類的MultiThreadServer(socketname)方法來實(shí)現(xiàn)多線程服務(wù)器程序
    2023-05-05
  • AQS同步組件CyclicBarrier循環(huán)屏障用例剖析

    AQS同步組件CyclicBarrier循環(huán)屏障用例剖析

    這篇文章主要為大家介紹了AQS同步組件CyclicBarrier循環(huán)屏障用例剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 利用mysql實(shí)現(xiàn)的雪花算法案例

    利用mysql實(shí)現(xiàn)的雪花算法案例

    這篇文章主要介紹了利用mysql實(shí)現(xiàn)的雪花算法案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 詳解Spring系列之@ComponentScan批量注冊bean

    詳解Spring系列之@ComponentScan批量注冊bean

    本文介紹各種@ComponentScan批量掃描注冊bean的基本使用以及進(jìn)階用法和@Componet及其衍生注解使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-02-02
  • Java實(shí)現(xiàn)駝峰、下劃線互轉(zhuǎn)的方法

    Java實(shí)現(xiàn)駝峰、下劃線互轉(zhuǎn)的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)駝峰、下劃線互轉(zhuǎn)的示例代碼,主要有使用 Guava 實(shí)現(xiàn)和自定義代碼轉(zhuǎn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05

最新評論