小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏+评论转发+关注我,后面会有很多干货。我有一些面试题、架构、设计类资料可以说是程序员面试必备!
所有资料都整理到网盘了,需要的话欢迎下载!私信我回复【666】即可免费获取
Advice 直译为通知,也有人翻译为 “增强处理”,共有 5 种类型,如下表所示。
在pom.xml文件里添加 Spring AOP 和 AspectJ 的 jar 包依赖
org.springframework
spring-context
5.2.10.RELEASE
org.aspectj
aspectjweaver
1.9.5
复制代码
/*UserDao接口*/
public interface UserDao {
public void save();
public int update();
}
/*UserDaoImpl实现类*/
@Repository
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("正在执行 UserDao 的 save 方法");
}
@Override
public int update() {
System.out.println("正在执行 UserDao 的 update 方法");
return 1;
}
}
复制代码
/*通知类*/
@Component//将这个类定义成 Bean
@Aspect//将这个Bean定义为切面
public class MyAdvice {
//指定UserDao类中的save方法为切入点
@Pointcut("execution(void com.bighorn.dao.UserDao.save())")
private void pt1(){}
//指定UserDao类中的update方法为切入点
@Pointcut("execution(int com.bighorn.dao.UserDao.update())")
private void pt2(){}
}
复制代码
/*Spring核心配置类*/
@Configuration
@ComponentScan("com.bighorn") //开启注解扫描
@EnableAspectJAutoProxy //开启 AspectJ 的自动代理
public class SpringConfig {
}
复制代码
public class App {
public static void main(String[] args) throws SQLException {
//获取配置类初始化容器
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
//从容器中获取UserDao对象
UserDao userDao = context.getBean(UserDao.class);
//调用userDao的方法
userDao.save();
}
}
复制代码
在MyAdvice这个通知类中添加前置通知、后置通知、返回后通知、异常后通知及相关注解。
//前置通知
@Before("pt1()")
public void before() {
System.out.println("before advice ...");
}
//后置通知
@After("pt1()")
public void after() {
System.out.println("after advice ...");
}
//返回后通知
@AfterReturning("pt1()")
public void afterReturning() {
System.out.println("afterReturning advice ...");
}
//异常后通知
@AfterThrowing("pt1()")
public void afterThrowing() {
System.out.println("afterThrowing advice ...");
}
复制代码
环绕通知是非常强大的通知,能够完成上述四种通知的所有功能。
/**
* 环绕通知需要携带ProceedingJoinPoint类型的参数
* 环绕通知类似于动态代理的全过程:ProceedingJoinPoint类型的参数可以决定是否执行目标方法
* 环绕通知必须要有返回值,返回值即为目标方法的返回值
* @param pjp
* @return Object
*/
@Around("pt2()")
public Object around(ProceedingJoinPoint pjp) {
Object result = null;
try {
System.out.println("这是环绕通知中的前置通知......");
//执行目标方法
result = pjp.proceed();
System.out.println("这是环绕通知中的返回通知......");
} catch (Throwable e) {
System.out.println("这是环绕通知中的异常通知......");
}
System.out.println("这是环绕通知中的后置通知......");
return result;
}
复制代码
修改 App 类,调用 UserDao 的update()方法,运行程序,观察结果。
public class App {
public static void main(String[] args) throws SQLException {
//获取配置类初始化容器
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
//从容器中获取UserDao对象
UserDao userDao = context.getBean(UserDao.class);
//调用userDao的update方法
userDao.update();
}
}
复制代码
运行结果如下
作者:倔强的牛角
原文出处:https://xie.infoq.cn/article/5bc9629517f1590c5e564aee2
| 留言与评论(共有 0 条评论) “” |