1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Spring必知必會,底層都使用了哪些設(shè)計模式?

        共 11515字,需瀏覽 24分鐘

         ·

        2021-09-16 14:38

          Spring用到的設(shè)計模式   


        1

        代理模式:最常見的 AOP 的實現(xiàn)方式就是通過代理來實現(xiàn),Spring主要是使用 JDK 動態(tài)代理和 CGLIB 代理。


        其中JDK代理實現(xiàn)代碼如下所示:


        public class ProxyHandler implements InvocationHandler {
        Object target; public ProxyHandler(Object target) { this.target=target; } public void before(String param) throws Throwable { if(!param.equals("magicalwolf")) throw new IllegalArgumentException(); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before((String)args[0]); return method.invoke(target, args); }}
        public class Main { public static void main(String[] args) { Subject target=new RealSubject(); Subject proxy=(Subject)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new ProxyHandler(target)); proxy.request("magicalwolf"); proxy.request("hello"); }}


        CGLIB代理實現(xiàn)如下:


        public class RequestInterceptor implements MethodInterceptor {
        public void before(String param) throws Throwable { if(!param.equals("hello")) throw new IllegalArgumentException(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { before((String)args[0]); return proxy.invokeSuper(obj, args);//調(diào)用父類的方法 }}
        public class Main { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); //字節(jié)碼增強器 enhancer.setSuperclass(RealSubject.class); //代理類 enhancer.setCallback(new RequestInterceptor());//回調(diào)方法 Subject proxy = (Subject) enhancer.create(); proxy.request("hello"); }}


        2

        模版模式:定義了一個在操作中的算法框架,而將一些具體步驟延遲到子類中,使子類看可以在不改變算法結(jié)構(gòu)下即可重新定義該算法的某些特定步驟。


        主要是一些對數(shù)據(jù)庫操作的類用到,比如 JdbcTemplate、JpaTemplate,因為查詢數(shù)據(jù)庫的建立連接、執(zhí)行查詢、關(guān)閉連接幾個過程,非常適用于模板方法。



        //提交事務(wù)protected abstract void doCommit(DefaultTransactionStatus status); //回滾事務(wù)protected abstract void doRollback(DefaultTransactionStatus status); //開始事務(wù)protected abstract void doBegin(Object transaction, TransactionDefinition definition) //獲取當(dāng)前的事務(wù)對象protected abstract Object doGetTransaction()


        Spring框架啟動也遵循如準(zhǔn)備啟動上下文,初始化BeanFactory、BeanFactory對象的前置處理與注冊,消息發(fā)送器初始化,發(fā)送應(yīng)用啟動消息等等特定的特定啟動流程,將BeanFactory的初始化和刷新留在了具體的應(yīng)用實現(xiàn)類去實現(xiàn)。


        public abstract class AbstractApplicationContext extends DefaultResourceLoader      implements ConfigurableApplicationContext {         @Override    public void refresh() throws BeansException, IllegalStateException {          prepareRefresh();            //子類實現(xiàn)初始化BeanFactory對象       ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();             prepareBeanFactory(beanFactory);            postProcessBeanFactory(beanFactory);            invokeBeanFactoryPostProcessors(beanFactory);            registerBeanPostProcessors(beanFactory);            initMessageSource();            initApplicationEventMulticaster();            onRefresh();            registerListeners();            finishBeanFactoryInitialization(beanFactory);            finishRefresh();  }    protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {    refreshBeanFactory();    return getBeanFactory();  }  
        // 兩個抽象方法 public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException; protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException;}



        3

        工廠模式:定義了用于創(chuàng)建對象的接口,讓子類決定要創(chuàng)建哪個類的實例化,可以促進組件或類之間的松耦合,通過使用接口而不是將特定的類綁定到應(yīng)用程序代碼中。


        Spring框架使用工廠模式實現(xiàn)了 BeanFactory 和 ApplicationContext 接口,基于工廠模式為Spring應(yīng)用程序創(chuàng)建Bean,并管理著每一個Bean的生命周期。如BeanFactory實例中的doGetBean方法可以根據(jù)使用者傳入的名字,類型,參數(shù)等生成對象并返回。


        public class StaticListableBeanFactory implements ListableBeanFactory {
        private final Map<String, Object> beans; protected <T> T doGetBean( String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException {
        String beanName = transformedBeanName(name); Object beanInstance;
        Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null); } }


        4

        單例模式:保證了一個類僅有的一個實例,并提供了一個訪問它的全局訪問點,提供控制器對關(guān)鍵類的訪問。


        單例模式如DB的連接類或Hibernate中的SessionFactory類,節(jié)省了大量的內(nèi)存,Spring框架中的Bean對象默認(rèn)都是為單例,在Bean對象注冊器實例上使用了Map來管理Bean對象,每次獲取到的對象是從該單例容器中取出來的。



        public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry { private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null && allowEarlyReference) { synchronized (this.singletonObjects) { singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null) { ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName); if (singletonFactory != null) { singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } } } return singletonObject; } }


        5

        責(zé)任鏈可以避免發(fā)送者與請求者耦合在一起,讓多個對象都有可能接收到請求,將這些對象連接成一條鏈,并且沿著這條鏈路傳遞請求,直到有對象處理為止。


        Spring中的Filter實現(xiàn)了責(zé)任鏈模式,管理者所有的Filter的順序執(zhí)行,可以對同一種對象資源實現(xiàn)不同業(yè)務(wù)場景的處理,達到業(yè)務(wù)解耦。詳情可參考以下鏈接。


        https://blog.csdn.net/lovejj1994/article/details/87457581

        public final class ApplicationFilterChain implements FilterChain {
        private ApplicationFilterConfig[] filters = new ApplicationFilterConfig[0]; private int pos = 0; private int n = 0; @Override public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { internalDoFilter(request,response); }
        private void internalDoFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { if (pos < n) { ApplicationFilterConfig filterConfig = filters[pos++]; Filter filter = filterConfig.getFilter(); filter.doFilter(request, response, this); } } }


        6

        觀察者模式: 定義了對象之間一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都能得到通知并自動更新。


        在Spring框架中,觀察者用于實現(xiàn)ApplicationContext的事件處理功能,為開發(fā)者提供了ApplicationEvent和ApplicationLIstneter接口來啟用事件處理,任何Bean實現(xiàn)了SpringListner接口都會收到ApplicationEvent作為事件發(fā)布者推送的消息。更多詳情可參考以下鏈接。


        https://zhuanlan.zhihu.com/p/101141124


        @Servicepublic class PublishService {
        @Autowired private ApplicationContext applicationContext;
        public void publishEvent() { applicationContext.publishEvent(new TestSuccessEvent(this)); }}

        @Servicepublic class ListenService {
        @EventListener(TestSuccessEvent.class) public void test() { .... }}
        @Configurationpublic class AsyncEventConfig {
        @Bean(name = "applicationEventMulticaster") public ApplicationEventMulticaster simpleApplicationEventMulticaster() { SimpleApplicationEventMulticaster eventMulticaster = new SimpleApplicationEventMulticaster(); eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor()); return eventMulticaster; }
        }
        public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {
        ..... @Override public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) { ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event)); Executor executor = getTaskExecutor(); for (ApplicationListener<?> listener : getApplicationListeners(event, type)) { if (executor != null) { executor.execute(() -> invokeListener(listener, event)); } else { invokeListener(listener, event); } } } .....}


        7

        適配器模式:將一個類的接口轉(zhuǎn)換成希望的另外一個接口,Spring框架使用適配器模式實現(xiàn)了很多功能,常見的適配器模式的類有 配置適配器RequestMappinghandlerAdapter完成了從請求到方法的映射,返回值到對應(yīng)的視圖或頁面的適配轉(zhuǎn)換。


          public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware {        @Bean    public RequestMappingHandlerAdapter requestMappingHandlerAdapter(        @Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager,        @Qualifier("mvcConversionService") FormattingConversionService conversionService,        @Qualifier("mvcValidator") Validator validator) {
        RequestMappingHandlerAdapter adapter = createRequestMappingHandlerAdapter(); ..... return adapter; }}

        public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter implements BeanFactoryAware, InitializingBean { @Override protected ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
        ModelAndView mav; checkRequest(request); if (this.synchronizeOnSession) { HttpSession session = request.getSession(false); if (session != null) { Object mutex = WebUtils.getSessionMutex(session); synchronized (mutex) { mav = invokeHandlerMethod(request, response, handlerMethod); } } else { mav = invokeHandlerMethod(request, response, handlerMethod); } } else { mav = invokeHandlerMethod(request, response, handlerMethod); }
        if (!response.containsHeader(HEADER_CACHE_CONTROL)) { if (getSessionAttributesHandler(handlerMethod).hasSessionAttributes()) { applyCacheSeconds(response, this.cacheSecondsForSessionAttributeHandlers); } else { prepareResponse(response); } }
        return mav; } }


        8

        建造者模式: 可以一步步構(gòu)建一個復(fù)雜的對象,最終將返回完整的對象,對象創(chuàng)建的邏輯和過程是通用的,使用它來創(chuàng)建相同的類型的不同具體實現(xiàn),隱藏了調(diào)用方調(diào)用代碼時構(gòu)建對象的細節(jié)。


        Spring框架中有一些功能實現(xiàn)了建造者模式如EmbeddedDatabaseBuilder、BeanDefinitionBuilder、MockMvcWebClientBuilder等。


        public class EmbeddedDatabaseBuilder {
        ...... public EmbeddedDatabaseBuilder setName(String databaseName) { this.databaseFactory.setDatabaseName(databaseName); return this; }
        public EmbeddedDatabaseBuilder setType(EmbeddedDatabaseType databaseType) { this.databaseFactory.setDatabaseType(databaseType); return this; }
        public EmbeddedDatabaseBuilder setDataSourceFactory(DataSourceFactory dataSourceFactory) { Assert.notNull(dataSourceFactory, "DataSourceFactory is required"); this.databaseFactory.setDataSourceFactory(dataSourceFactory); return this; }
        ......}


          IOC和AOP的理解   


        IOC 叫做控制反轉(zhuǎn)。指的是通過Spring來管理對象的創(chuàng)建、配置和生命周期,這樣相當(dāng)于把控制權(quán)交給了Spring,不需要人工來管理對象之間復(fù)雜的依賴關(guān)系,這樣做的好處就是解耦。


        在Spring里面,主要提供了 BeanFactory 和 ApplicationContext 兩種 IOC 容器。


        AOP 叫做面向切面編程。是一個編程范式,目的就是提高代碼的模塊性。


        Spring AOP 基于動態(tài)代理的方式實現(xiàn),如果是實現(xiàn)了接口的話就會使用 JDK 動態(tài)代理,反之則使用 CGLIB 代理。


        Spring中, AOP 的應(yīng)用主要體現(xiàn)在事務(wù)、日志、異常處理等方面,通過在代碼的前后做一些增強處理,可以實現(xiàn)對業(yè)務(wù)邏輯的隔離,提高代碼的模塊化能力,同時也是解耦。Spring主要提供了 Aspect 切面、JoinPoint 連接點、PointCut 切入點、Advice 增強等實現(xiàn)方式。


          幾種代理方式的實現(xiàn)方式與區(qū)別   




        Spring必知必會上篇完,下篇內(nèi)容預(yù)告:


        • Spring AOP 和 AspectJ AOP 有什么區(qū)別?

        • 5.Spring框架的主要模塊

        • Bean的生命周期

          ……

          ……




        更多干貨請點擊關(guān)注


        瀏覽 64
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            youjizzcom日本| 18害羞勿进网站国产| 国产精品啪啪啪啪| 精品人妻一区二区三区日产乱码| 久久er视频| 91麻豆精品A片国产在线观看| 91精品视频在线| 青青草超碰| 成人欧美一区二区三区黑人免费| 91丨人妻丨偷拍| 黄色福利在线观看| 国产一级片免费看| 欧美成人午夜福利| 在线观看无码av| 99久久99久久久精品棕色圆| 熟女人妻在线观看| AV色天堂| 91大香蕉伊人| 一级少女免费播放电视剧韩剧TV| 91久九九| 91一起草高清资源| 日一区二区| 无码国产99精品久久久久网站 | 色五月丁香婷婷| 黄色毛片在线观看| 波多野成人无码精品69| 无码精品一区二区| 亚洲精品婷婷| 亚洲AV高清| 欧美日韩综合| 东京热国产| 在线免费观看黄色片| 一级色情片| 熟练中出-波多野结衣| 性满足BBWBBWBBW| 中国黄色大片| 91精品国产麻豆国产自产在线| 一区二区三区电影| 欧美性猛交XXXX乱大交| 国产精品乱子伦视频一区二区| 小泬BBBBBB免费看| 人人操人人摸人人爱| 黑巨茎大战欧美白妞小说| 亚洲乱码精品久久久久..| 日批视频在线观看| 国产无码播放| 1插菊花综合| 日本精品无码a62v在线| a片在线免费看| 国产成人亚洲综合A∨婷婷 | 婷婷九月| 黄色视频在线观看国产| 精品人妻一区二区蜜桃视频| 91精品国产日韩91久久久久久| 大地资源第5页在线| 91AV在线观看视频| 日本乱轮视频| 日本中文字幕精品| 秋霞午夜福利影院| 无码波多野结衣| 欧洲性爱视频在线观看| www.91madou| 91大神shunv| 日韩高清区| 在线亚洲色图| 操逼三级| 99视频精品全部免费看| 精品视频91| 思思操| 婷婷丁香五月综合| av大全在线观看| 国产精品秘麻豆免费版现看视频| www.超碰在线| 天天撸在线视频| 精品二区| 男女拍拍| 欧美熟妇精品一二三区| 2014亚洲天堂| 看毛片视频| 91久久久久久久91| 北条麻妃无码视频在线| 91大神在线免费观看| 久久另类TS人妖一区二区免费| 精品精品精品| av女人的天堂| 久久大屌| 国产一区二区三区在线视频| 北条麻妃在线观看| 黄片免费观看网站| 免费无码国产在线观看快色| 乱伦91| 国产A级毛片| 蜜桃av秘一区二区三区| 亚洲avwww| 无码在线视频播放| 免费看黄色毛片| 国产精品av在线播放| 国产又猛又黄又爽| 青娱乐老视频| 日本内射网站| 无码精品一区二区| 加勒比综合在线| 亚洲无码中文字幕在线观看| AV成人| 樱桃码一区二区三区| 人人澡av| 亚洲国产精品VA在线看黑人| 日韩无码视频观看| 中文字幕在线不卡视频| 成人毛片100免费观看| 国产福利电影在线观看| 欧美色图15P| 18禁免费网站| 99草自拍| AV资源网站在线| 久9久9久9久9久9久9| A片在线观看网站| 色综合天天操| 欧美日韩国内| 亚洲狼人综合| 搡BBBB搡BBB搡Bb| 悠悠AV导航| 又大又长又粗91| 麻豆网站91| 韩国三级片在线| 天天操电影| 亚洲高清无码在线播放| 无码久久久| 婷婷综合在线| 91亚洲国产成人| 手机无码在线播放| 99激情网| 午夜啪啪视频| 亚洲内射视频| 久草视频网站| 爆操太妹| 国产精品夜夜爽3000| 欧美一级特黄真人做受| 另类Av| 欧美日韩中文| 十八禁免费网站| 唐山熟女工棚嗷嗷叫| 台湾省成人网站| 青青精品视频| 国产一区二区在线播放| 日韩无码免费电影| 亚洲成人大香蕉| 狠狠干狠狠撸| 91综合网| 91免费在线视频观看| 日本一区中文字幕| 停停六综合| 69色综合| 亚洲无码高清视频在线观看| 亚洲无码天堂| 黄片视频链接| 午夜爱爱爱| 色色一区二区| 精品视频99| 操逼视频大全| 欧美不卡在线视频| 久久久WWW成人免费无遮挡大片| 九九久久免费视频| 天天日天天拍| 日韩精品人妻中文字幕| 国产中文字幕亚洲综合欧美| 久久中文字幕无码| 天天色粽合合合合合合合| 亚洲激情一区| 婷婷精品国产a久久综合| 国产熟妇码视频黑料| 91白丝在线观看| 国产淫荡视频| 欧美日韩v| 国产一区二区AV| 999日本不卡影院| 黄色网页免费观看| 成人亚洲综合| 久久久久久久网站| 日韩日逼视频| 天天视频狠狠狠狠| 亚洲熟妇在线观看一区二区| 91大香蕉视频| 不卡免费视频| 一区在线观看| 亚欧综合在线| 国产白丝视频| 超碰99热| 91蜜臀| 午夜大黄片| 精品999999| 精品成人一区二区三区| 天天撸视频| 自拍无码视频| 欧美性猛交ⅩXXX乱大交| 国产av日韩| 色99999| 91大神在线资源观看无广告| 久艹av| 成人区人妻精品一| 白浆av| 小佟丽娅大战91哥| 激情日韩| 日韩黄色片网站| 岛国精品在线播放| 欧美日韩性爰视频| 99av| 欧美内射网站| 91国产爽黄| 北条麻妃一区二区三区在线观看| 九九香蕉网| 青青色在线观看| 亚洲高清免费视频| AA片免费看| 大蕉网| 日韩无码系列| 香蕉AV777XXX色综合一区| 日皮视频免费| 午夜福利手机在线| 亚洲高清无码视频在线播放| AV午夜| 五月天性爱视频| 熟女少妇网站| 另类欧美| 欧美精品成人免码在线| 国产精品一级| 日韩最新高清无码| www.久久久| 亚洲免费在线视频观看| 五月丁香欧美性爱| 免费在线观看内射| 做爰视频毛片下载蜜桃视频。 | 天天天日天天天操| 午夜试看120秒体验区的特点| 91中文视频| 国产美女操逼| 五月天丁香成人| 五月激情黄色| 亚洲少妇人妻| 免费看一级A片| 怡春院中文字幕| 亚洲成人精品AV| 开心深爱激情网| 日韩免费高清| 人妻黄色| 亚洲欧洲av| 影音先锋成人在线| 国产91嫩草乱婬A片2蜜臀| 翔田千里50岁无码| 黄色片视频网站| 91在线成人视频| 亚洲区中文字幕| 国产少妇| 韩国三级无码| 亚洲无码在线播放视频| 亚洲黄片免费观看| 国产一级特黄| 麻豆精品一区二区| 18禁日韩| 四虎av在线播放| 蜜桃传媒av| 国产精品一级片| 人人爱人人操人人爽| 黄色免费观看网站| 国产乱伦免费| 久久高清亚洲| www.狠狠爱| 台湾无码| 激情久久综合| 日韩1区| 成人做爰免费网站2023| 人妻无码人妻| 久久综合热| 欧美久久国产精品| 蜜臀av在线免费观看| 一级女婬片A片AAAA片| 手机看片福利视频| 九九午夜| 丁香五月网| 国产午夜视频| 妞干网国产| 超碰97资源| 欧美午夜精品久久久| 2025无码视频| 在线永久看片免费的视频| 亚洲人成免费网站| 天堂色色| 91亚洲成人| 青草在线视频| 国产作爱| 婷婷五月在线| 最近中文字幕在线观看| 久久这里都是精品| 午夜操一操一级| 骚逼影视| 久久人妻中文字幕| 国产A毛片| 亚洲狼人天堂| 亚州毛多色色精品| 日本黄色视频网|