Spring的AOP
代理模式
- jdk動(dòng)態(tài)代理
利用攔截器+反射生成接口的匿名類,在調(diào)用具體方法前調(diào)用invokeHandle來(lái)處理。
所以jdk動(dòng)態(tài)代理只能為實(shí)現(xiàn)了接口的類服務(wù)。 - cglib動(dòng)態(tài)代理
利用ASM框架,對(duì)代理對(duì)象類生成的class文件加載進(jìn)來(lái),通過(guò)修改其字節(jié)碼生成子類來(lái)處理。
Cglib是針對(duì)類實(shí)現(xiàn)代理,主要是對(duì)指定的類生成一個(gè)子類,覆蓋其中的方法,并覆蓋其中方法的增強(qiáng),但是因?yàn)椴捎玫氖抢^承,所以該類或方法最好不要生成final,對(duì)于final類或方法,是無(wú)法繼承的。
Spring的Bean的作用域
bean的作用域規(guī)定了哪種類型的對(duì)象返回給調(diào)用者。
- singleton 單例bean
- prototype 多例bean
- request 每次http請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的bean
- session 同一個(gè)session共享一個(gè)bean
- application 限定一個(gè)Bean的作用域?yàn)镾ervletContext的生命周期。該作用域僅適用于web的Spring WebApplicationContext環(huán)境。
事務(wù)的傳播行為
當(dāng)一個(gè)事務(wù)方法A調(diào)用另一個(gè)事務(wù)方法B時(shí),B是否開(kāi)啟一個(gè)新事物,或者在A的事務(wù)中運(yùn)行,這由spring的事務(wù)傳播行為決定。
spring的單例模式
spring使用注冊(cè)表的方式創(chuàng)建單例對(duì)象,將對(duì)象放到currenthashmap中來(lái)實(shí)現(xiàn)單例。
1.需要單例的類
public class Student {
//假裝有很多屬性和方法
}
2.創(chuàng)建注冊(cè)表
/**
* Created by liuruijie on 2017/2/13.
* 單例注冊(cè)表
*/
public class BeanFactory {
/**
* 這些是維護(hù)此注冊(cè)表的,
* 因?yàn)椴皇侵攸c(diǎn)
* 所以采用了最簡(jiǎn)單的方式
* 可以用其他方式
*/
private static BeanFactory beanFactory = new BeanFactory();
private BeanFactory(){
}
// 獲取bean工廠對(duì)象
public static BeanFactory getInstance() {
return beanFactory;
}
//緩存單例對(duì)象的hash表
private final HashMap<String, Object> cacheMap = new HashMap<>();
//通過(guò)類名獲取其單例對(duì)象,如果注冊(cè)表中沒(méi)有該對(duì)象,則創(chuàng)建,否則返回該對(duì)象。
public Object getBean(String className) {
Object bean = cacheMap.get(className);
//使用雙重檢測(cè)鎖來(lái)實(shí)現(xiàn)單例
if (bean == null) {
synchronized (this.cacheMap) {
//第二次檢測(cè)
bean = cacheMap.get(className);
if (bean == null) {
try {
bean = Class.forName(className).newInstance();
} catch (InstantiationException e) {
System.err.println("could not instance an object of type:" + className);
e.printStackTrace();
} catch (IllegalAccessException e) {
System.err.println("could not access class " + className);
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.err.println("could not find class " + className);
e.printStackTrace();
}
}
cacheMap.put(className, bean);
}
}
return bean;
}
}
3.驗(yàn)證
//這是一個(gè)單例注冊(cè)表
BeanFactory beanFactory = BeanFactory.getInstance();
//獲取實(shí)例1
Student student1 = (Student) beanFactory
.getBean(Student.class.getName());
//獲取實(shí)例2
Student student2 = (Student) beanFactory
.getBean(Student.class.getName());
//比較獲取到的兩個(gè)實(shí)例
System.out.println(student1.hashCode());
System.out.println(student2.hashCode());
4.結(jié)果

spring的工廠模式
todo