最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring從@Aspect到Advisor使用演示實(shí)例

 更新時(shí)間:2023年02月08日 08:39:18   作者:tanglin_030907031026  
這篇文章主要介紹了Spring從@Aspect到Advisor使用演示實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧

演示1 - 代理創(chuàng)建器

public class A17 {
    public static void main(String[] args) {
        GenericApplicationContext context = new GenericApplicationContext();
        context.registerBean("aspect1", Aspect1.class);
        context.registerBean("config", Config.class);
        context.registerBean(ConfigurationClassPostProcessor.class);
        context.registerBean(AnnotationAwareAspectJAutoProxyCreator.class);
        // BeanPostProcessor
        // 創(chuàng)建 -> (*) 依賴(lài)注入 -> 初始化 (*)
        context.refresh();
//        for (String name : context.getBeanDefinitionNames()) {
//            System.out.println(name);
//        }
        /*
            第一個(gè)重要方法 findEligibleAdvisors 找到有【資格】的 Advisors
                a. 有【資格】的 Advisor 一部分是低級(jí)的, 可以由自己編寫(xiě), 如下例中的 advisor3
                b. 有【資格】的 Advisor 另一部分是高級(jí)的, 由本章的主角解析 @Aspect 后獲得
         */
        AnnotationAwareAspectJAutoProxyCreator creator = context.getBean(AnnotationAwareAspectJAutoProxyCreator.class);
        List<Advisor> advisors = creator.findEligibleAdvisors(Target2.class, "target2");
        /*for (Advisor advisor : advisors) {
            System.out.println(advisor);
        }*/
        /*
            第二個(gè)重要方法 wrapIfNecessary
                a. 它內(nèi)部調(diào)用 findEligibleAdvisors, 只要返回集合不空, 則表示需要?jiǎng)?chuàng)建代理
         */
        Object o1 = creator.wrapIfNecessary(new Target1(), "target1", "target1");
        System.out.println(o1.getClass());
        Object o2 = creator.wrapIfNecessary(new Target2(), "target2", "target2");
        System.out.println(o2.getClass());
        ((Target1) o1).foo();
        /*
            學(xué)到了什么
                a. 自動(dòng)代理后處理器 AnnotationAwareAspectJAutoProxyCreator 會(huì)幫我們創(chuàng)建代理
                b. 通常代理創(chuàng)建的活在原始對(duì)象初始化后執(zhí)行, 但碰到循環(huán)依賴(lài)會(huì)提前至依賴(lài)注入之前執(zhí)行
                c. 高級(jí)的 @Aspect 切面會(huì)轉(zhuǎn)換為低級(jí)的 Advisor 切面, 理解原理, 大道至簡(jiǎn)
         */
    }
    static class Target1 {
        public void foo() {
            System.out.println("target1 foo");
        }
    }
    static class Target2 {
        public void bar() {
            System.out.println("target2 bar");
        }
    }
    @Aspect // 高級(jí)切面類(lèi)
    @Order(1)
    static class Aspect1 {
        @Before("execution(* foo())")
        public void before1() {
            System.out.println("aspect1 before1...");
        }
        @Before("execution(* foo())")
        public void before2() {
            System.out.println("aspect1 before2...");
        }
    }
    @Configuration
    static class Config {
        /*@Bean // 低級(jí)切面
        public Advisor advisor3(MethodInterceptor advice3) {
            AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
            pointcut.setExpression("execution(* foo())");
            DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(pointcut, advice3);
            return advisor;
        }
        @Bean
        public MethodInterceptor advice3() {
            return invocation -> {
                System.out.println("advice3 before...");
                Object result = invocation.proceed();
                System.out.println("advice3 after...");
                return result;
            };
        }*/
    }
}

收獲??

AnnotationAwareAspectJAutoProxyCreator 的作用

  • 將高級(jí) @Aspect 切面統(tǒng)一為低級(jí) Advisor 切面
  • 在合適的時(shí)機(jī)創(chuàng)建代理

findEligibleAdvisors 找到有【資格】的 Advisors

  • 有【資格】的 Advisor 一部分是低級(jí)的, 可以由自己編寫(xiě), 如本例 A17 中的 advisor3
  • 有【資格】的 Advisor 另一部分是高級(jí)的, 由解析 @Aspect 后獲得

wrapIfNecessary

  • 它內(nèi)部調(diào)用 findEligibleAdvisors, 只要返回集合不空, 則表示需要?jiǎng)?chuàng)建代理
  • 它的調(diào)用時(shí)機(jī)通常在原始對(duì)象初始化后執(zhí)行, 但碰到循環(huán)依賴(lài)會(huì)提前至依賴(lài)注入之前執(zhí)行

演示2 - 代理創(chuàng)建時(shí)機(jī)

public class A17_1 {
    public static void main(String[] args) {
        GenericApplicationContext context = new GenericApplicationContext();
        context.registerBean(ConfigurationClassPostProcessor.class);
        context.registerBean(Config.class);
        context.refresh();
        context.close();
        // 創(chuàng)建 -> (*) 依賴(lài)注入 -> 初始化 (*)
        /*
            學(xué)到了什么
                a. 代理的創(chuàng)建時(shí)機(jī)
                    1. 初始化之后 (無(wú)循環(huán)依賴(lài)時(shí))
                    2. 實(shí)例創(chuàng)建后, 依賴(lài)注入前 (有循環(huán)依賴(lài)時(shí)), 并暫存于二級(jí)緩存
                b. 依賴(lài)注入與初始化不應(yīng)該被增強(qiáng), 仍應(yīng)被施加于原始對(duì)象
         */
    }
    @Configuration
    static class Config {
        @Bean // 解析 @Aspect、產(chǎn)生代理
        public AnnotationAwareAspectJAutoProxyCreator annotationAwareAspectJAutoProxyCreator() {
            return new AnnotationAwareAspectJAutoProxyCreator();
        }
        @Bean // 解析 @Autowired
        public AutowiredAnnotationBeanPostProcessor autowiredAnnotationBeanPostProcessor() {
            return new AutowiredAnnotationBeanPostProcessor();
        }
        @Bean // 解析 @PostConstruct
        public CommonAnnotationBeanPostProcessor commonAnnotationBeanPostProcessor() {
            return new CommonAnnotationBeanPostProcessor();
        }
        @Bean
        public Advisor advisor(MethodInterceptor advice) {
            AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
            pointcut.setExpression("execution(* foo())");
            return new DefaultPointcutAdvisor(pointcut, advice);
        }
        @Bean
        public MethodInterceptor advice() {
            return (MethodInvocation invocation) -> {
                System.out.println("before...");
                return invocation.proceed();
            };
        }
        @Bean
        public Bean1 bean1() {
            return new Bean1();
        }
        @Bean
        public Bean2 bean2() {
            return new Bean2();
        }
    }
    static class Bean1 {
        public void foo() {
        }
        public Bean1() {
            System.out.println("Bean1()");
        }
        @Autowired public void setBean2(Bean2 bean2) {
            System.out.println("Bean1 setBean2(bean2) class is: " + bean2.getClass());
        }
        @PostConstruct public void init() {
            System.out.println("Bean1 init()");
        }
    }
    static class Bean2 {
        public Bean2() {
            System.out.println("Bean2()");
        }
        @Autowired public void setBean1(Bean1 bean1) {
            System.out.println("Bean2 setBean1(bean1) class is: " + bean1.getClass());
        }
        @PostConstruct public void init() {
            System.out.println("Bean2 init()");
        }
    }
}

收獲??

代理的創(chuàng)建時(shí)機(jī)

  • 初始化之后 (無(wú)循環(huán)依賴(lài)時(shí))
  • 實(shí)例創(chuàng)建后, 依賴(lài)注入前 (有循環(huán)依賴(lài)時(shí)), 并暫存于二級(jí)緩存

依賴(lài)注入與初始化不應(yīng)該被增強(qiáng), 仍應(yīng)被施加于原始對(duì)象

演示3 - @Before 對(duì)應(yīng)的低級(jí)通知

public class A17_2 {
    static class Aspect {
        @Before("execution(* foo())")
        public void before1() {
            System.out.println("before1");
        }
        @Before("execution(* foo())")
        public void before2() {
            System.out.println("before2");
        }
        public void after() {
            System.out.println("after");
        }
        public void afterReturning() {
            System.out.println("afterReturning");
        }
        public void afterThrowing() {
            System.out.println("afterThrowing");
        }
        public Object around(ProceedingJoinPoint pjp) throws Throwable {
            try {
                System.out.println("around...before");
                return pjp.proceed();
            } finally {
                System.out.println("around...after");
            }
        }
    }
    static class Target {
        public void foo() {
            System.out.println("target foo");
        }
    }
    @SuppressWarnings("all")
    public static void main(String[] args) throws Throwable {
        AspectInstanceFactory factory = new SingletonAspectInstanceFactory(new Aspect());
        // 高級(jí)切面轉(zhuǎn)低級(jí)切面類(lèi)
        List<Advisor> list = new ArrayList<>();
        for (Method method : Aspect.class.getDeclaredMethods()) {
            if (method.isAnnotationPresent(Before.class)) {
                // 解析切點(diǎn)
                String expression = method.getAnnotation(Before.class).value();
                AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
                pointcut.setExpression(expression);
                // 通知類(lèi)
                AspectJMethodBeforeAdvice advice = new AspectJMethodBeforeAdvice(method, pointcut, factory);
                // 切面
                Advisor advisor = new DefaultPointcutAdvisor(pointcut, advice);
                list.add(advisor);
            }
        }
        for (Advisor advisor : list) {
            System.out.println(advisor);
        }
        /*
            @Before 前置通知會(huì)被轉(zhuǎn)換為下面原始的 AspectJMethodBeforeAdvice 形式, 該對(duì)象包含了如下信息
                a. 通知代碼從哪兒來(lái)
                b. 切點(diǎn)是什么(這里為啥要切點(diǎn), 后面解釋)
                c. 通知對(duì)象如何創(chuàng)建, 本例共用同一個(gè) Aspect 對(duì)象
            類(lèi)似的通知還有
                1. AspectJAroundAdvice (環(huán)繞通知)
                2. AspectJAfterReturningAdvice
                3. AspectJAfterThrowingAdvice
                4. AspectJAfterAdvice (環(huán)繞通知)
         */
    }
}

收獲??

@Before 前置通知會(huì)被轉(zhuǎn)換為原始的 AspectJMethodBeforeAdvice 形式, 該對(duì)象包含了如下信息

  • 通知代碼從哪兒來(lái)
  • 切點(diǎn)是什么(這里為啥要切點(diǎn), 后面解釋)
  • 通知對(duì)象如何創(chuàng)建, 本例共用同一個(gè) Aspect 對(duì)象

類(lèi)似的還有

  • AspectJAroundAdvice (環(huán)繞通知)
  • AspectJAfterReturningAdvice
  • AspectJAfterThrowingAdvice (環(huán)繞通知)
  • AspectJAfterAdvice (環(huán)繞通知)

到此這篇關(guān)于Spring從@Aspect到Advisor使用演示實(shí)例的文章就介紹到這了,更多相關(guān)Spring @Aspect Advisor內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)順序棧原理解析

    Java實(shí)現(xiàn)順序棧原理解析

    這篇文章主要介紹了Java實(shí)現(xiàn)順序棧原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java利用InputStream類(lèi)實(shí)現(xiàn)文件讀取與處理

    Java利用InputStream類(lèi)實(shí)現(xiàn)文件讀取與處理

    在Java開(kāi)發(fā)中,輸入流(InputStream)是一個(gè)非常重要的概念,它涉及到文件讀寫(xiě)、網(wǎng)絡(luò)傳輸?shù)榷鄠€(gè)方面,InputStream類(lèi)是Java中輸入流的抽象基類(lèi),定義了讀取輸入流數(shù)據(jù)的方法,本文將以InputStream類(lèi)為切入點(diǎn),介紹Java中的輸入流概念及其應(yīng)用,需要的朋友可以參考下
    2023-11-11
  • SpringBoot指標(biāo)監(jiān)控功能實(shí)現(xiàn)

    SpringBoot指標(biāo)監(jiān)控功能實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot指標(biāo)監(jiān)控功能實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • 利用Jacob將Excel轉(zhuǎn)換PDF的問(wèn)題匯總

    利用Jacob將Excel轉(zhuǎn)換PDF的問(wèn)題匯總

    項(xiàng)目中經(jīng)常會(huì)遇到將excel轉(zhuǎn)換成PDF的需求,下面這篇文章主要給大家介紹了關(guān)于如何利用Jacob將Excel轉(zhuǎn)換PDF問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • 對(duì)spring task和線(xiàn)程池的深入研究

    對(duì)spring task和線(xiàn)程池的深入研究

    這篇文章主要介紹了對(duì)spring task和線(xiàn)程池的深入研究,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring Boot 3.0升級(jí)指南

    Spring Boot 3.0升級(jí)指南

    這篇文章主要為大家介紹了Spring Boot 3.0升級(jí)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • java中的類(lèi)URL與URLConnection使用介紹

    java中的類(lèi)URL與URLConnection使用介紹

    這篇文章主要為大家介紹了java中的類(lèi)URL與URLConnection使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Java 使用反射調(diào)用jar包中的類(lèi)方式

    Java 使用反射調(diào)用jar包中的類(lèi)方式

    這篇文章主要介紹了Java 使用反射調(diào)用jar包中的類(lèi)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 詳解Java動(dòng)態(tài)字節(jié)碼技術(shù)

    詳解Java動(dòng)態(tài)字節(jié)碼技術(shù)

    Java字節(jié)碼增強(qiáng)指的是在Java字節(jié)碼生成之后,對(duì)其進(jìn)行修改,增強(qiáng)其功能,可減少冗余代碼,提高性能等。本文將詳細(xì)介紹Java動(dòng)態(tài)字節(jié)碼技術(shù)。
    2021-05-05
  • springmvc使用JSR-303進(jìn)行數(shù)據(jù)校驗(yàn)實(shí)例

    springmvc使用JSR-303進(jìn)行數(shù)據(jù)校驗(yàn)實(shí)例

    本篇文章主要介紹了詳解springmvc使用JSR-303進(jìn)行數(shù)據(jù)校驗(yàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02

最新評(píng)論

山东| 阿瓦提县| 兴城市| 邮箱| 永修县| 石屏县| 乐清市| 新野县| 泰州市| 临猗县| 繁峙县| 湾仔区| 玉林市| 金华市| 铁岭县| 礼泉县| 宜章县| 灌云县| 兴义市| 荆州市| 长治市| 武威市| 清镇市| 抚松县| 区。| 苏州市| 英超| 田林县| 顺平县| 祥云县| 微山县| 平遥县| 营山县| 中超| 广昌县| 元江| 万宁市| 横山县| 奉化市| 利津县| 镇雄县|