<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
兩個切面類:【記錄紀錄檔】和【判斷引數】,分別對應順序 @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(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"/>
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45