proxyBeanMenthod
假設我們要進行一個系統的二次開發
然后第一次開發我們實用的是XML聲明bean
二次開發的時候要用注解
我們如何把bean都加載上來呢
我們首先創建一個全新的配置類
package com.bigdata1421.config;public class SpringConfig32 {
}
我們創建一個APP
加載配置類
拿到bean并且打印
package com.bigdata1421.bean.app;import com.bigdata1421.config.SpringConfig3;
import com.bigdata1421.config.SpringConfig32;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App32 {public static void main(String[] args) {ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig32.class);String[] arr = ctx.getBeanDefinitionNames();for (String s : arr) {System.out.println(s);}}}
我們接下來就嘗試
在啟動SpringConfig32的時候
不僅要加載自己在類里面書寫的配置
還要加載xml文件里的配置
我們只需要這一個注解就行
package com.bigdata1421.config;import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;@ImportResource("applicationContext1.xml")
public class SpringConfig32 {
}
spring內部最終就可以把這兩個配置信息
組合到一個容器里面
這樣就搞定了
這就是教我們系統遷移怎么做
小結
拓展
應該是在代理類里面做了方法增強,所以拿到的就是同一個對象
proxyBeanMethods
如果是true
就直接一開始創建了一個bean 然后進入spring容器里面去找bean
用事先就創建好的對象去調用方法 即返回同一個bean
如果是false
就每次執行都要去用對象執行方法
生成一個全新的對象 覆蓋
我們看以前的代碼
就可以進行解釋
在這個類里面
你只要是運行這個方法
得到的對象就是容器中取得bean
如果關掉
就根本就是spring容器中的對象 而是你new出來的
小結小結小結
補充
動態代理是面向對象編程中的一種重要技術,它允許在運行時創建一個實現特定接口或一組接口的代理類對象,而無需顯式編寫這些類的實現代碼。在Java中,動態代理主要通過Java反射機制實現,它通常與代理模式和AOP(面向切面編程)結合使用,以實現橫切關注點的分離和增強功能。
Java中動態代理的實現方式:
-
Java反射機制:
-
Java的反射機制允許在運行時檢查類、接口、方法和字段,并在運行時創建對象、調用方法、獲取或設置字段值等。
-
動態代理就是利用反射機制在運行時動態生成代理類的技術。
-
-
代理類生成:
-
Java動態代理通常使用
java.lang.reflect.Proxy
類實現。 -
首先定義一個接口或者獲取一個接口的引用,然后使用
Proxy.newProxyInstance()
方法創建代理類實例。
-
-
InvocationHandler接口:
-
實現動態代理需要一個實現
InvocationHandler
接口的類,該接口包含一個方法invoke(Object proxy, Method method, Object[] args)
,在代理對象調用方法時被調用。 -
在
invoke()
方法中,可以定義對原始方法調用的增強邏輯,例如添加日志、性能監控、事務處理等。
-
-
應用場景:
-
AOP(面向切面編程):動態代理常用于實現AOP,通過代理類包裝業務邏輯,實現橫切關注點的分離。
-
遠程方法調用(RMI):動態代理可以用于創建遠程對象的本地代理,隱藏遠程調用的具體實現細節。
-
延遲加載(Lazy Loading):動態代理可以延遲加載對象,當真正需要使用時再實例化對象。
-
-
局限性:
-
動態代理只能代理接口,無法直接代理類。
-
由于使用了反射機制,動態代理可能會帶來一定的性能開銷。
-
Spring容器是Spring Framework的核心部分,它負責管理應用中的組件(beans)并協調它們的生命周期和配置。Spring容器的主要功能包括:
-
依賴注入(Dependency Injection,DI):Spring容器通過依賴注入將組件之間的依賴關系動態地注入到組件中,從而實現了松耦合。
-
AOP(Aspect-Oriented Programming,面向切面編程):Spring容器支持AOP,允許開發者通過切面來實現跨越應用邏輯的功能,如事務管理、日志記錄等。
-
事務管理:Spring容器提供了強大的事務管理支持,可以輕松地在應用中管理事務,支持聲明式事務配置。
-
簡化JDBC操作:Spring提供了JDBC模板(JdbcTemplate)等工具類,簡化了數據庫操作,減少了樣板代碼。
-
事件發布和監聽:Spring容器支持事件驅動模型,可以發布事件并允許其他組件監聽這些事件,實現了解耦和增強靈活性。
-
面向接口編程:Spring鼓勵面向接口編程,通過接口來實現依賴注入,使得代碼更易于測試和維護。
Spring容器主要有兩種類型:BeanFactory和ApplicationContext。ApplicationContext是BeanFactory的子接口,提供了更多的企業級功能,如國際化、事件傳播等,是在大多數應用中推薦使用的容器類型。
總體來說,Spring容器是Spring框架的核心,它通過依賴注入和面向切面編程等特性,極大地簡化了Java應用的開發和維護工作。
proxyBeanMethods
是Spring框架中的一個配置選項,它主要用于控制Spring Boot中@Configuration類的代理行為。在Spring中,通常使用@Configuration注解來標記一個類,表示這是一個配置類,可以包含@Bean方法用于定義Spring Bean。
作用和用法:
-
默認行為:
-
默認情況下,Spring會對@Configuration類進行CGLIB代理,以確保@Bean方法的調用可以被攔截,從而管理@Bean方法返回的實例的生命周期和依賴關系。
-
-
proxyBeanMethods選項:
-
proxyBeanMethods = true
:這是Spring Boot 2.2版本引入的默認值。表示Spring會對@Configuration類進行代理,以支持方法調用的攔截和依賴管理。 -
proxyBeanMethods = false
:這個選項告訴Spring不要對@Configuration類進行代理。這在某些情況下可以提高性能,尤其是當@Configuration類中的@Bean方法很簡單,不涉及復雜的依賴關系時。
-
-
性能考慮:
-
當
proxyBeanMethods = false
時,Spring不會為@Configuration類生成代理,這意味著@Bean方法的調用將直接返回實例,不經過Spring的AOP攔截器和增強處理,可以提高應用程序的啟動性能和運行時性能。 -
當
proxyBeanMethods = true
時,雖然增加了一些性能開銷,但可以確保@Bean方法的各種功能(如AOP切面、依賴注入等)得到正確的支持和管理。
-
-
配置方式:
-
在Spring Boot中,可以通過在@Configuration類上使用
@Configuration(proxyBeanMethods = true)
或者@Configuration(proxyBeanMethods = false)
來顯式指定代理行為。
-
-
建議:
-
通常情況下,使用默認的
proxyBeanMethods = true
是比較安全的選擇,因為它保證了Spring框架的各種功能可以正常工作。只有在確實需要優化性能時,才考慮將其設置為false
。
-
在Spring框架中,確保@Bean方法的調用可以被攔截意味著Spring容器能夠攔截對@Configuration類中@Bean方法的調用,并在需要時執行一些額外的邏輯或者處理。
具體來說,對@Configuration類中@Bean方法的攔截可以實現以下幾個方面的功能:
-
AOP切面:
-
Spring框架支持通過AOP(面向切面編程)攔截@Bean方法的調用。這意味著你可以使用切面來在方法執行前后執行額外的邏輯,比如日志記錄、性能監控、安全性檢查等。
-
-
依賴注入:
-
當@Bean方法返回的對象有依賴其他Spring管理的Bean時,Spring需要攔截@Bean方法的調用,以確保依賴的Bean可以被正確注入。
-
-
單例管理:
-
Spring默認情況下會將@Configuration類中@Bean方法返回的對象作為單例管理,即每次調用@Bean方法返回的是同一個實例。這需要Spring能夠攔截@Bean方法的調用,并按照單例的要求進行管理。
-
-
條件化Bean的注冊:
-
通過條件化的方式,可以根據一定條件決定是否注冊某些@Bean方法返回的Bean實例。Spring在攔截@Bean方法時,可以根據條件進行判斷,從而控制Bean的注冊。
-
-
Bean生命周期管理:
-
Spring框架負責管理@Bean方法返回的Bean的生命周期,包括初始化和銷毀階段。攔截@Bean方法的調用是確保Spring可以在需要時執行這些生命周期管理操作的關鍵。
-
總體來說,Spring框架通過攔截@Configuration類中@Bean方法的調用,能夠實現對Bean的完整管理和控制,包括依賴注入、生命周期管理、AOP增強等。這種機制確保了Spring的IoC(控制反轉)和DI(依賴注入)特性能夠正常工作,使得開發者能夠專注于業務邏輯的實現而不必關心底層的管理和維護工作。
個人號推廣
博客主頁
多多!-CSDN博客
Web后端開發
https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482
Web前端開發
https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482
數據庫開發
https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482
項目實戰
https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482
算法與數據結構
https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482
計算機基礎
https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482
回憶錄
https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482