一、基礎
1、什麼是反射
在Java中,反射是指在執行時檢查和操作類、介面、欄位和方法等程式結構的能力。
透過反射,你可以在執行時動態獲取類的資訊、例項化物件、訪問和修改欄位、呼叫方法,
以及構造新的物件例項,而無需在編譯時知道這些類的具體資訊。
反射使得Java程式能夠以更靈活的方式處理類和物件,但需要謹慎使用,
因為它可能會影響程式的效能和安全性。
2、怎麼使用反射建立物件
//透過類的地址全名獲取類的型別
Class<?> clazz = Class.forName("com.xr.bean.User");
//透過預設構造方法建立例項,轉換型別
User user = (User)clazz.getDeclaredConstructor().newInstance();
//獲取物件,呼叫例項方法
user.get();
3、什麼是IoC(控制反轉)
IoC是一種底層為Map(key為id,value為建立的物件)的Spring容器,它是用來建立和管理所有物件和例項,並管理例項物件之間的依賴關係
1、讀取配置的bean.xml檔案,獲取類的id和對應的包路徑
2、透過Spring的BeanFactory介面的實現類(包路徑,ClassPathXMLApplication;檔案路徑,FileSystemApplication;)去建立bean
4、什麼是依賴注入
給例項化物件的屬性賦值,就是依賴注入
可以透過setter方法注入
也可以透過構造方法進行注入
還可以透過介面方法進行注入,這種使用的比較少。
二、類的載入機制
類載入器(ClassLoader)是Java虛擬機器(JVM)的一部分,負責將類的位元組碼載入到記憶體中,並生成對應的Class物件。類載入器實現了Java虛擬機器規範中的ClassLoader介面。
Java中的類載入器可以分為以下幾種型別:
啟動類載入器(Bootstrap ClassLoader): 它是虛擬機器的一部分,負責載入Java核心類庫,如java.lang包中的類。由於啟動類載入器是用C++語言實現的,因此在Java中無法直接訪問。
擴充套件類載入器(Extension ClassLoader): 它是由sun.misc.Launcher$ExtClassLoader類實現的,負責載入JRE擴充套件目錄(jre/lib/ext)中的類庫。
應用程式類載入器(Application ClassLoader): 也稱為系統類載入器,它是由sun.misc.Launcher$AppClassLoader類實現的,負責載入應用程式類路徑(classpath)中的類庫。
自定義類載入器(Custom ClassLoader): 除了上述三種內建的類載入器外,Java還提供了一種機制允許開發人員自定義類載入器。自定義類載入器通常用於載入來自非標準位置(如網路、資料庫、檔案系統等)的類,或實現特定的載入策略。
在Java中,類載入器採用雙親委派模型,即每個類載入器在載入類時會先委託給其父類載入器進行載入,只有在父類載入器無法載入該類時,才由子類載入器自行載入。這種機制保證了類的唯一性和安全性。
三、SpringBean的生命週期:
1、例項化:呼叫類的無參構造方法進行例項化
2、屬性賦值:使用類的setter方法進行物件的屬性賦值,或者使用介面注入進行注入
3、呼叫初始化前置方法:BeanPostProcessor介面的實現方法postProcessBeforeInitialization方法,執行初始化前置方法
4、初始化:可以自定義Bean的xml檔案指定初始化方法initMethod,執行配置初始化方法
5、呼叫初始化後置方法:BeanPostPocessor介面的實現方法postProcessAfterInitialization方法,執行初始化後置方法
6、使用
7、銷燬:可以自定義Bean的xml檔案指定銷燬方法
8、容器關閉
四、Spring註解
1、@Component 標記Spring管理的Bean
2、@Repository 標記持久層,並由Spring進行管理的Bean
3、@Service 標記服務層,並由Spring進行管理的Bean
4、@Controller 標記請求接收層,並由Spring進行管理的Bean
以上註解功能相等,只是區分用於不同地方
5、Lombok
@Data 包含@Getter、@Setter、@EqualsAndHashCode、@ToString等註解
@Getter
@Setter
@EqualsAndHashCode 重寫equals和hashCode方法
@ToString
@AllArgsConstructor 所有引數構造方法
@NoArgsConstructor 無參構造方法
@Builder 構造物件及屬性值
@NonNull 不可為空,為空丟擲異常
五、AOP
代理模式:
透過代理類進行處理具體介面或者業務類的實際行為,統一解耦處理,降低耦合,靈活,動態處理
JDK代理
類是實現介面的方式,代理類也實現對應介面,然後進行處理
CGlib代理
類沒有實現介面,透過繼承的方式,我們代理類同樣去繼承去進行代理處理
porxy代理
porxy.newInstance(ClassLoader classLoader,Integrface[] intefaces,IntercepetorHandler interceptionHandler)
@Component /標記Spring IoC管理類物件
@Aspect //標記該類為代理類
//五種切入型別
1、前置 @Before
2、後置 @After
3、返回 @AfterReturning
4、異常 @AfterThrowing
5、環繞 @Around
@Around(excution("pointCut()"))
@pointcut("com.xr.test.service.serviceImpl.*")
public Object aroundPoinCut(JoinPoint joinPoint){
Object returnObj = null;
try{
//前置方法
//TODO
//執行代理類方法
returnObj = joinPoint.proceed();
//後置方法
//TODO
}catch(Exception e){
//異常方法
//TODO
e.print()
}finally{
//返回前方法
//TODO
}
return returnObj;
}
六、事務傳播行為:
required 預設,沒有就新建,有就加入
required_new 不管有沒有事務,新建新的事務執行,原本如果存在事務就掛起事務,不存在巢狀關係
supports 有就加入,沒有就不管
mandatory 有就加入,沒有就丟擲異常
not_supported 不支援事務,存在就掛起
never 不支援事務,存在就丟擲異常
nested 不管是否有事務都建立新的事務,使用新事務執行,巢狀事務,巢狀的事務可以獨立的提交和回滾,沒有事務就和required一樣
七、預載入
通常我們使用的HotSpotVM,要使用預載入,需要使用GraalVM,透過映象直接生成預載入過後的程式
有點:減少啟動所消耗時間
缺點:靈活性底