91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

@Aspect@Order各個通知的執行順序是什么

發布時間:2022-02-14 14:38:31 來源:億速云 閱讀:170 作者:小新 欄目:開發技術

小編給大家分享一下@Aspect@Order各個通知的執行順序是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

    @Aspect@Order各個通知的執行順序

    兩個切面類:【記錄日志】和【判斷參數】,分別對應順序 @Order(0) 和@Order(1) 。

    本文只是將重點說下 執行順序 這么回事哈哈哈

    代碼

    【業務類】

    /**
     * 登錄控制器
     */
    @Controller
    public class LoginController {
        //向外面拋出異常
        public void loginWithThrow(String username, String password) throws Exception {
            if (username == null || password == null) {
                throw new Exception("登錄信息不可為空啊");
            }
            System.out.println("LoginController#login...");
        }
        //拋出異常自己捕獲的情況
        public void loginWithTryCatch(String username, String password) {
           try{
               if (username == null || password == null) {
                   throw new Exception("登錄信息不可為空啊");
               }
               System.out.println("LoginController#login...");
           }catch (Exception e){
               e.printStackTrace();
           }
        }
    }

    【切面類】

    /**
     * 輸出日志注解
     */
    @Order(0)
    @Aspect
    @Component
    public class LogAspect {
        //抽出共通的execution用的
        //com.yuki.demo.aop.aspect 包或者子包下所有類的方法
        @Pointcut("execution(* com.yuki.demo.aop.aspect..*.*(..))")
        public void pointcut(){
        }
        //前置通知
    //    @Before("execution(public void com.yuki.demo.aop.aspect.LoginController.*(String,String))")
        @Before("pointcut()")
        public void before() {
            System.out.println("LogAspect#before...");
        }
        //環繞通知
        //ProceedingJoinPoint 只有環繞通知有
        @Around("execution(public void com.yuki.demo.aop.aspect.LoginController.*(String,String))")
        public void around(ProceedingJoinPoint joinPoint) throws Throwable {
            System.out.println("LogAspectA#around開始...");
            //代理方法的執行,如果沒有joinPoint.proceed() ,則前置通知@Before 不會執行,其它的通知正常
            joinPoint.proceed();
            //執行方法之后,如果joinPoint.proceed() 拋出了異常,則該句不會執行,拋出異常后直接跳出了aroud方法了
            System.out.println("LogAspectA#around結束...");
        }
        //后置通知(只要連接點被執行,不管是否拋出異常)
        @After("execution(public void com.yuki.demo.aop.aspect.LoginController.*(String,String))")
        public void after() {
            System.out.println("LogAspect#after...");
        }
        //異常通知(只有在joinPoint.proceed()方法執行向外面拋出了異常,才會執行該通知)
        @AfterThrowing("execution(public void com.yuki.demo.aop.aspect.LoginController.*(String,String))")
        public void afterThrowing() {
            System.out.println("LogAspect#afterThrowing...");
        }
        //正常的返回通知通知(正常結束了才會執行該通知)
        @AfterReturning("execution(public void com.yuki.demo.aop.aspect.LoginController.*(String,String))")
        public void afterReturning() {
            System.out.println("LogAspect#afterReturning...");
        }
    }

    【切面類】

    /**
     * 判斷請求參數的sign是否正確的 切面類
     */
    @Order(1)
    @Aspect
    @Component
    public class SignAspect {
        @Around("execution(public void com.yuki.demo.aop.aspect.LoginController.*(String,String))")
        public void around(ProceedingJoinPoint joinPoint) throws Throwable {
            System.out.println("SignAspect#around開始...");
            joinPoint.proceed();
            System.out.println("SignAspect#around結束...");
        }
    }

    【啟動配置】

    省略。。。非重點

    【測試類】

    @SpringBootTest
    class AopApplicationTests {
        @Autowired
        private LoginController loginController;
        @Test
        void contextLoads() {
            loginController.loginWithTryCatch("yuki", "1234");
        }
    }

    【控制臺輸出】

    LogAspectA#around開始...
    LogAspect#before...
    SignAspect#around開始...
    LoginController#login...
    SignAspect#around結束...
    LogAspectA#around結束...
    LogAspect#after...
    LogAspect#afterReturning...

    小結

    @Aspect@Order各個通知的執行順序是什么

    @Aspect@Order各個通知的執行順序是什么

    spring AspectJ order(順序)

    @Aspect
    @Order(2)
    public class HelloWorldAspectAnnotation {
    	/**
    	 * JoinPoint接口
    	 * @param joinPoint
    	 */
    	/*public interface JoinPoint {
    	    String toString();         //連接點所在位置的相關信息
    	    String toShortString();     //連接點所在位置的簡短相關信息
    	    String toLongString();     //連接點所在位置的全部相關信息
    	    Object getThis();         //返回AOP代理對象
    	    Object getTarget();       //返回目標對象
    	    Object[] getArgs();       //返回被通知方法參數列表
    	    Signature getSignature();  //返回當前連接點簽名
    	    SourceLocation getSourceLocation();//返回連接點方法所在類文件中的位置
    	    String getKind();        //連接點類型
    	    StaticPart getStaticPart(); //返回連接點靜態部分
    	}*/	
    	
        //定義前置通知,注意這里是sayHello2
    	//使用@Before進行前置通知聲明,其中value用于定義切入點表達式或引用命名切入點
    	@Before(value="execution(* com.boventech..*.sayHello2(..))&& args(param)",argNames="param")
    	public void beforeAdvice(JoinPoint joinPoint,String param) {
    		System.out.println(1);
    		System.out.println("=======================");
    		System.out.println("===param:" + param);
    		System.out.println("=======================");
    		System.out.println(joinPoint.getArgs().length);
    		System.out.println("=======================");
    		System.out.println(joinPoint.toString());
    		System.out.println("=======================");
    		System.out.println(joinPoint.getTarget());
    		System.out.println("=======================");
    		System.out.println(joinPoint.getThis());
    		System.out.println("=======================");
    		System.out.println("===========before advice");
    	}
    	/*value:指定切入點表達式或命名切入點;
        pointcut:同樣是指定切入點表達式或命名切入點,如果指定了將覆蓋value屬性指定的,pointcut具有高優先級;*/
    	@AfterReturning(value="execution(* com.boventech..*.sayHello2(..))&& args(param)",argNames="param",pointcut="execution(* com.boventech..*.sayHello2(..))&& args(param)")
    	public void afterFinallyAdvice(JoinPoint joinPoint,String param) {
    		System.out.println("param:"+param);
    		System.out.println("===========");
    		System.out.println("===========after finally advice");
    	}
    }
    @Aspect
    @Order(1)
    public class HelloWorldAspectAnnotation2 {
    	/**
    	 * JoinPoint接口
    	 * @param joinPoint
    	 */
    	/*public interface JoinPoint {
    	    String toString();         //連接點所在位置的相關信息
    	    String toShortString();     //連接點所在位置的簡短相關信息
    	    String toLongString();     //連接點所在位置的全部相關信息
    	    Object getThis();         //返回AOP代理對象
    	    Object getTarget();       //返回目標對象
    	    Object[] getArgs();       //返回被通知方法參數列表
    	    Signature getSignature();  //返回當前連接點簽名
    	    SourceLocation getSourceLocation();//返回連接點方法所在類文件中的位置
    	    String getKind();        //連接點類型
    	    StaticPart getStaticPart(); //返回連接點靜態部分
    	}*/	
    	
        //定義前置通知,注意這里是sayHello2
    	//使用@Before進行前置通知聲明,其中value用于定義切入點表達式或引用命名切入點
    	@Before(value="execution(* com.boventech..*.sayHello2(..))&& args(param)",argNames="param")
    	public void beforeAdvice(JoinPoint joinPoint,String param) {
    		System.out.println(2);
    		System.out.println("=======================");		
    	}
    	
    	/*value:指定切入點表達式或命名切入點;
        pointcut:同樣是指定切入點表達式或命名切入點,如果指定了將覆蓋value屬性指定的,pointcut具有高優先級;*/
    	@AfterReturning(value="execution(* com.boventech..*.sayHello2(..))&& args(param)",argNames="param",pointcut="execution(* com.boventech..*.sayHello2(..))&& args(param)")
    	public void afterFinallyAdvice(JoinPoint joinPoint,String param) {
    		System.out.println("order:" + 2);
    	}
    }
    public class AopAnnotationTest {	
    	@Test
        public void testHelloworld() {
            ApplicationContext ctx =  new ClassPathXmlApplicationContext("/helloWorld2.xml");
            IHelloWorld2Service helloworldService =ctx.getBean("helloWorld2Service", IHelloWorld2Service.class);
            String param = "12";
            helloworldService.sayHello2(param);
        } 
    }
    <aop:aspectj-autoproxy/>
    	<bean id="helloWorld2Service" class="com.boventech.learning.serviceImpl.HelloWorld2ServiceImpl"/>
    	
        <bean id="aspect"
                 class="com.boventech.learning.aspect.HelloWorldAspectAnnotation"/>
                 
        <bean id="aspect2"
                 class="com.boventech.learning.aspect.HelloWorldAspectAnnotation2"/>

    以上是“@Aspect@Order各個通知的執行順序是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    剑川县| 古田县| 高平市| 鹤壁市| 张家界市| 杭州市| 阿巴嘎旗| 讷河市| 蒲城县| 建宁县| 军事| 临高县| 浪卡子县| 凤台县| 正定县| 湘乡市| 望奎县| 丰宁| 洪洞县| 房产| 高清| 清流县| 含山县| 平邑县| 绿春县| 乡宁县| 海兴县| 紫云| 陇南市| 瑞丽市| 洪江市| 江永县| 桃源县| 浮山县| 仪陇县| 嘉定区| 高台县| 永胜县| 博爱县| 射洪县| 肇源县|