当前位置:首页 > 编程笔记 > 正文
已解决

【JavaSpring】Aop的通知类型,获取数据

来自网友在路上 173873提问 提问时间:2023-09-22 19:17:59阅读次数: 73

最佳答案 问答题库738位专家为你答疑解惑

AOP 通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置

前置通知

@Pointcut("execution(void org.example.dao.BookDao.update())")private void pt() {}@Before("pt()")public void before() {System.out.println("before advice");}

后置通知

@Pointcut("execution(void org.example.dao.BookDao.update())")private void pt() {}@After("pt()")public void after() {System.out.println("after advice");}

环绕通知(获取异常和返回值)

无对原始操作的调用

显然原始方法不执行了

 @Pointcut("execution(void org.example.dao.BookDao.update())")private void pt() {}@Around("pt()")public void around() {System.out.println("around before advice");System.out.println("around after advice");}

 

加上对原始操作的调用

无返回值

 @Pointcut("execution(void org.example.dao.BookDao.update())")private void pt() {}@Around("pt()")public void around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("around before advice");pjp.proceed();System.out.println("around after advice");}

如果有返回值

@Around("pt()")public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("around before advice");Object obj=pjp.proceed();System.out.println("around after advice");return obj;}

返回后通知(获取返回值)

成功运行后执行

  @Pointcut("execution(void org.example.dao.BookDao.update())")private void pt() {}@AfterReturning("pt()")public void afterReturning() {System.out.println("afterReturning advice");}

和后置通知的区别

如果抛出异常,AfterReturning不运行,但After正常运行 

抛出异常后通知(获取异常)

@Pointcut("execution(void org.example.dao.BookDao.update())")private void pt() {}@AfterThrowing("pt()")public void afterThrowing() {System.out.println("afterThrowing advice");}

测试(通知类型,如果想看看效果,直接复制) 

package org.example.dao.impl;import org.example.dao.BookDao;
import org.springframework.stereotype.Repository;@Repository
public class BookDaoImpl implements BookDao {public void save() {System.out.println("book dao save");}public void update() {System.out.println("book dao update");}public void delete() {System.out.println("book dao delete");}public int select() {System.out.println("book dao select");return 100;}
}
package org.example.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration
@ComponentScan("org.example")
@EnableAspectJAutoProxy//有用注解开发的AOP
public class SpringConfig {
}
package org.example.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Component
@Aspect//当作Aop处理
public class MyAdvice {@Pointcut("execution(void org.example.dao.BookDao.update())")private void pt() {}@Before("pt()")public void before() {System.out.println("before advice");}@After("pt()")public void after() {System.out.println("after advice");}@Around("pt()")public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("around before advice");Object obj = pjp.proceed();System.out.println("around after advice");return obj;}@AfterReturning("pt()")public void afterReturning() {System.out.println("afterReturning advice");}@AfterThrowing("pt()")public void afterThrowing() {System.out.println("afterThrowing advice");}
}
package org.example.dao;public interface BookDao {void save();void update();int select();
}
package org.example;import org.example.config.SpringConfig;
import org.example.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** Hello world!**/
public class App 
{public static void main( String[] args ){ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao=ctx.getBean(BookDao.class);bookDao.update();}
}

测试(获取参数,JoinPoint必须是第一位)

package org.example.aop;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;import java.util.Arrays;@Component
@Aspect//当作Aop处理
public class MyAdvice {@Pointcut("execution(* org.example.dao.BookDao.findName(..))")private void pt() {}@Before("pt()")public void before(JoinPoint jp) {Object[] args = jp.getArgs();System.out.println("before advice:" + Arrays.toString(args));}@After("pt()")public void after(JoinPoint jp) {Object[] args = jp.getArgs();System.out.println("after advice:" + Arrays.toString(args));}@Around("pt()")public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("around before advice");Object obj = pjp.proceed();Object[] args = pjp.getArgs();System.out.println("around after advice:" + Arrays.toString(args));return obj;}@AfterReturning(value = "pt()", returning = "res")public void afterReturning(Object res) {System.out.println("afterReturning advice:" + res);}@AfterThrowing(value = "pt()", throwing = "t")public void afterThrowing(Throwable t) {System.out.println("afterThrowing advice"+t);}
}
package org.example.dao;public interface BookDao {String findName(int id);}

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"【JavaSpring】Aop的通知类型,获取数据":http://eshow365.cn/6-11614-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!