spring

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容