您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“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對象的嘞?
推斷構造方法,并執行得到普通對象
依賴注入
aware回調
初始化前
執行BeanPostProcessor
接口中的postProcessBeforeInitialization()
方法
初始化
執行有@PostConstruct
注解的方法執行
InitializingBean
接口中的afterPropertiesSet()
方法
執行XML配置文件中init-method
屬性指定的方法
初始化后
執行BeanPostProcessor
接口中的postProcessAfterInitialization()
方法
普通對象/代理對象 存入容器中
使用
銷毀
執行DisposableBean
接口的destroy()
方法
有@PreDestroy
注解的方法
XML 配置文件中destroy-method
屬性指定的方法
如果沒有寫構造方法,那么Spring會執行默認空參的構造方法
如果顯示寫了一個構造方法,那么Spring就會使用這個構造方法,構造方法中如果有參數那么會進行依賴注入
如果顯示寫了多個構造方法并有空參的構造方法時,會執行空參的構造方法
如果顯示寫了多個構造方法沒有空參的構造方法時,運行時會報錯。解決方法是在要執行的構造方法上加@Autowired
注解
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中如果要使用事務需要配置一個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底層核心原理是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。