Spring AOP基于注解的“零配置”方式实现
- 为了在Spring中启动@AspectJ支持,需要在类加载路径下新增两个AspectJ库:aspectjweaver.jar和aspectjrt.jar。除此之外,Spring AOP还需要依赖一个aopalliance.jar包
- 定义一个类似ServiceAspect.java这样的切面bean:

1 package com.hyq.aop;
2
3 import org.apache.commons.logging.Log;
4 import org.apache.commons.logging.LogFactory;
5 import org.aspectj.lang.JoinPoint;
6 import org.aspectj.lang.ProceedingJoinPoint;
7 import org.aspectj.lang.annotation.After;
8 import org.aspectj.lang.annotation.AfterReturning;
9 import org.aspectj.lang.annotation.AfterThrowing;
10 import org.aspectj.lang.annotation.Around;
11 import org.aspectj.lang.annotation.Aspect;
12 import org.aspectj.lang.annotation.Before;
13 import org.aspectj.lang.annotation.Pointcut;
14 import org.springframework.stereotype.Component;
15
16 /**
17 * 系统服务组件Aspect切面Bean
18 * @author Shenghany
19 */
20 //声明这是一个组件
21 @Component
22 //声明这是一个切面Bean
23 @Aspect
24 public class ServiceAspect {
25
26 private final static Log log = LogFactory.getLog(ServiceAspect.class);
27
28 //配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
29 @Pointcut("execution(* com.hyq.aop..*(..))")
30 public void aspect(){ }
31
32 /*
33 * 配置前置通知,使用在方法aspect()上注册的切入点
34 * 同时接受JoinPoint切入点对象,可以没有该参数
35 */
36 @Before("aspect()")
37 public void before(JoinPoint joinPoint){
38 System.out.println("执行before.....");
39 }
40
41 //配置后置通知,使用在方法aspect()上注册的切入点
42 @After("aspect()")
43 public void after(JoinPoint joinPoint){
44 System.out.println("执行after.....");
45 }
46
47 //配置环绕通知,使用在方法aspect()上注册的切入点
48 @Around("aspect()")
49 public void around(JoinPoint joinPoint){
50 long start = System.currentTimeMillis();
51 try {
52 ((ProceedingJoinPoint) joinPoint).proceed();
53 long end = System.currentTimeMillis();
54 if(log.isInfoEnabled()){
55 log.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms!");
56 }
57 } catch (Throwable e) {
58 long end = System.currentTimeMillis();
59 if(log.isInfoEnabled()){
60 log.info("around " + joinPoint + "\tUse time : " + (end - start) + " ms with exception : " + e.getMessage());
61 }
62 }
63 }
64
65 //配置后置返回通知,使用在方法aspect()上注册的切入点
66 @AfterReturning("aspect()")
67 public void afterReturn(JoinPoint joinPoint){
68 if(log.isInfoEnabled()){
69 log.info("afterReturn " + joinPoint);
70 }
71 }
72
73 //配置抛出异常后通知,使用在方法aspect()上注册的切入点
74 @AfterThrowing(pointcut="aspect()", throwing="ex")
75 public void afterThrow(JoinPoint joinPoint, Exception ex){
76 if(log.isInfoEnabled()){
77 log.info("afterThrow " + joinPoint + "\t" + ex.getMessage());
78 }
79 }
80
81 }
3.定义一个业务组件,如:

1 package com.hyq.aop;
2
3 import org.apache.commons.logging.Log;
4 import org.apache.commons.logging.LogFactory;
5 import org.springframework.stereotype.Component;
6 @Component()
7 public class UserService {
8
9 private final static Log log = LogFactory.getLog(UserService.class);
10
11 public User get(long id){
12 if(log.isInfoEnabled()){
13 log.info("getUser method . . .");
14 }
15 return new User();
16 }
17
18 public void save(User user){
19 if(log.isInfoEnabled()){
20 log.info("saveUser method . . .");
21 }
22 }
23
24 public boolean delete(long id) throws Exception{
25 if(log.isInfoEnabled()){
26 log.info("delete method . . .");
27 throw new Exception("spring aop ThrowAdvice演示");
28 }
29 return false;
30 }
31
32 }
业务组件要用@Component()注解修饰
4.在bean.xml中加入下面配置:
1 <!-- 激活组件扫描功能,在包com.hyq.aop及其子包下面自动扫描通过注解配置的组件 -->
2 <context:component-scan base-package="com.hyq.aop"/>
3 <!-- 激活自动代理功能 -->
4 <!-- <aop:aspectj-autoproxy proxy-target-class="true"/> -->
5 <aop:aspectj-autoproxy/>
转载:https://www.cnblogs.com/zest/p/5883866.html
Spring AOP基于注解的“零配置”方式实现的更多相关文章
- spring-第十七篇之spring AOP基于注解的零配置方式
1.基于注解的零配置方式 Aspect允许使用注解定义切面.切入点和增强处理,spring框架可以识别并根据这些注解来生成AOP代理.spring只是用了和AspectJ 5一样的注解,但并没有使用A ...
- 8 -- 深入使用Spring -- 4...5 AOP代理:基于注解的“零配置”方式
8.4.5 基于注解的“零配置”方式 AspectJ允许使用注解定义切面.切入点和增强处理,而Spring框架则可识别并根据这些注解来生成AOP代理.Spring只是使用了和AspectJ 5 一样的 ...
- 【学习】Spring 的 AOP :基于Annotation 的“零配置”方式
转自:http://www.cnblogs.com/jbelial/archive/2012/07/20/2539123.html AOP(Aspect Orient Programming ) , ...
- 10 Spring框架--基于注解的IOC配置
1.工程环境搭建 2.基于注解的IOC配置 IOC注解的分类 (1)用于创建对象的 他们的作用就和在XML配置文件中编写一个<bean>标签实现的功能是一样的@Component: 作用: ...
- Spring Aop基于注解的实现
一.AspectOriented Programing,面向切面编程. AOP主要用于日志记录,性能统计,安全控制(权限控制),事务处理,异常处理等.将日志记录,性能统计,安全控制,事务处理,异常 ...
- spring-第十八篇之spring AOP基于XML配置文件的管理方式
1.在XML配置文件中配置切面.切入点.增强处理.spring-1.5之前只能使用XML Schema方式配置切面.切入点.增强处理. spring配置文件中,所有的切面.切入点.增强处理都必须定义在 ...
- spring的基于注解的IOC配置
1.配置文件配置 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http: ...
- Spring boot 基于注解方式配置datasource
Spring boot 基于注解方式配置datasource 编辑 Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...
- 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置
经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...
随机推荐
- Easyui 行编辑
之前没用过,突然用了的时候手忙脚乱的感觉 找了官方文档也好 百度了一大堆东西 表示个人脑袋跟不上思路 直接铺上简化的 以后自己 找起来也方便 以下代码已经执行 应该不会再错了 <tab ...
- UI- Layer的使用总结(附动画)
#pargma mark - Layer 1. 设置当前视图的背景颜色 self.view.backgroundColor = [UIColor lightGrayColor]; 2. 创建一个视图, ...
- CSS样式:覆盖规则
规则一:由于继承而发生样式冲突时,最近祖先获胜. CSS的继承机制使得元素可以从包含它的祖先元素中继承样式,考虑下面这种情况: <html> <head> <title& ...
- 【设计模式】calendar的单例需求和实现
calendar单例需求: 参数:有default的calendar file 1.如果无实例,无参数调用,取default,检查是否合法,存入实例 2.如果无实例,有参数调用,检查是否合法,存入实例 ...
- linux 6 网卡名称修改
转自:http://blog.csdn.net/tianlesoftware/article/details/8737700 一.问题说明 测试环境中出现的小问题,因为虚拟机之间经常复制来复制去,导致 ...
- Markdown转HTML之Node篇
前言 环境及编码 搭建环境 express markdown-it commander rd 核心编码 cmd_preview模块 cmd_build模块 打造命令行工具 写点xxmd 演示 总结 前 ...
- 旧书重温:0day2【10】第五章 堆溢出利用2
好久没有发帖子啦!最近一直很忙!但是还是抽空学习啦下! 前段时间匆匆忙忙的把0day2上的堆溢出实验做啦! 可能当时太浮躁啦,很多细节没注意!结果:实验结果很不满意!所以就有啦这一篇!! 上一篇是发布 ...
- Proposition
提供 \(k\) 个变量 \((k\leq 4)\) 可独立取值为 \(0,1\),两种运算分别等价于 \(\neg a\) 和 \(\neg a \lor b\) . 你需要恰好使用 \(n\) 个 ...
- Hihocoder1081 最短路径 结构体练习
最短路径 :虽然做过很多次最短路的题,spfa,bellman,floyd都用过不少.但是题目强调的“顺序”又让我加深了对最短路的理解. 当然,主要还是练习下STL: pair型: #include& ...
- 剑指offer-第六章面试中的各项能力(不用加减乘除做加法)
//不用加减乘除四则运算,来做加法 //题目:两个数做加法. //思路:用二进制的位运算的思路.第一步:首先两数相加考虑进位.可以用异或. //第二步:两个数相加只考虑进位,并将最后的结果左移.第三步 ...