中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring底層核心原理是什么

發布時間:2023-04-19 15:43:54 來源:億速云 閱讀:99 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Spring底層核心原理是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Spring底層核心原理是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

Spring底層核心原理

下面這幾行代碼是一個Spring的入門代碼,第一行是通過java配置類 注解的方式創建一個Spring容器,第二行是通過XML配置文件的方式創建一個Spring容器

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test();

最后兩行代碼就是從Spring容器中拿一個Bean對象并執行方法。那么Spring是如何創建一個Bean對象的嘞?

Bean的生命周期

  • 推斷構造方法,并執行得到普通對象

  • 依賴注入

  • aware回調

  • 初始化前

執行BeanPostProcessor接口中的postProcessBeforeInitialization()方法

  • 初始化

執行有@PostConstruct注解的方法執行

InitializingBean接口中的afterPropertiesSet()方法

執行XML配置文件中init-method屬性指定的方法

  • 初始化后

執行BeanPostProcessor接口中的postProcessAfterInitialization()方法

  • 普通對象/代理對象 存入容器中

  • 使用

  • 銷毀

執行DisposableBean接口的destroy()方法

@PreDestroy注解的方法

XML 配置文件中destroy-method屬性指定的方法

推斷構造方法

如果沒有寫構造方法,那么Spring會執行默認空參的構造方法

如果顯示寫了一個構造方法,那么Spring就會使用這個構造方法,構造方法中如果有參數那么會進行依賴注入

如果顯示寫了多個構造方法并有空參的構造方法時,會執行空參的構造方法

如果顯示寫了多個構造方法沒有空參的構造方法時,運行時會報錯。解決方法是在要執行的構造方法上加@Autowired注解

AOP原理

cjlib和jdk兩種動態代理的實現都是有一個target屬性來存儲普通對象,代理對象中重寫要執行的方法,首先執行增強邏輯,然后通過target屬性去執行目標方法。偽代碼如下:

public class UserServiceProxy extends UserService{
    private UserService target;
    public void test(){
        // TODO 增強業務
        target.test();
        // TODO 增強業務
    }
}

那么如何判斷一個Bean是否需要進行AOP創建一個普通對象嘞?

  • 遍歷所有有@Aspect注解的切面Bean

  • 遍歷所有的方法

  • 判斷方法上的切點表達式是否和當前正在創建的Bean匹配

  • 如果匹配則把這個切面中增強方法存入一個Map緩存中

真正要執行代理對象的方法時會從緩存中取出相應的增強邏輯來執行,再去執行目標方法。

Spring事務

Spring中如果要使用事務需要配置一個JdbcTemplate和一個事務管理器,它們倆都需要配置DataSource。

@ComponentScan("com.hs")
@Configuration
public class AppConfig {
   @Bean
   public JdbcTemplate jdbcTemplate() {
      return new JdbcTemplate(dataSource());
   }
   @Bean
   public PlatformTransactionManager transactionManager() {
      DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
      transactionManager.setDataSource(dataSource());
      return transactionManager;
   }
   @Bean
   public DataSource dataSource() {
      DriverManagerDataSource dataSource = new DriverManagerDataSource();
      dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/hs?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai");
      dataSource.setUsername("root");
      dataSource.setPassword("123456");
      return dataSource;
   }
}

Spring事務大致執行流程如下:

  • 判斷要執行的方法上是否存在@Transcational注解

  • 如果存在則通過事務管理器創建一個connection連接對象

  • autoCommit設置為false

  • 去執行目標方法target.method()

  • 如果出現了異常則回滾rollback(),沒有異常則提交commit()

如果上面的配置類中不加@Configuration注解,那么Spring的事務會失效。原因如下:

JdbcTemplate和事務管理器都需要DataSource,都會調用dataSource()獲取。如果不加@Configuration注解,那么他們倆獲取的DataSource就不是同一個。

代理對象中操作的是事務管理器的連接對象,而業務方法卻是使用的JdbcTemplate,所以就導致了Spring事務失效。

而如果加上了@Configuration注解,在調用dataSource()時會先去Spring容器中找DataSource,如果沒找到才回去調用方法創建一個。

讀到這里,這篇“Spring底層核心原理是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武穴市| 青田县| 丽水市| 新化县| 循化| 将乐县| 山东省| 曲阜市| 黑水县| 万源市| 菏泽市| 晋州市| 贡嘎县| 阿拉善盟| 正镶白旗| 东平县| 沙田区| 绩溪县| 高台县| 商南县| 江都市| 武隆县| 海淀区| 通河县| 定襄县| 诏安县| 松阳县| 双江| 富平县| 八宿县| 简阳市| 桑日县| 醴陵市| 桐柏县| 罗源县| 海兴县| 永善县| 丰城市| 乌拉特后旗| 宾川县| 怀柔区|