AOP入门案例
AOP入门案例
案例设定:测定接口执行效率
简化设定:在接口执行前输出当前系统时间
开发模式:XML or 注解
思路分析
- 导入坐标(pom.xml)
- 制作连接点方法(原始操作,Dao接口与实现类)
- 制作共性功能(通知类与通知)
- 定义切入点
- 绑定切入点与通知关系(切面)
实现步骤(注解版)
-
导入aop相关坐标说明:spring-context坐标依赖spring-aop坐标。
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency>
-
定义dao接口与实现类
// BookDao.java public interface BookDao { void save(); void update(); } // BookDaoImpl.java @Repository public class BookDaoImpl implements BookDao { @Override public void save() { System.out.println(System.currentTimeMillis()); System.out.println("book dao save ..."); } @Override public void update() { System.out.println("book dao update ..."); } }
-
定义通知类,制作通知
public class MyAdvice { // 通知 public void method(){ System.out.println(System.currentTimeMillis()); } }
-
定义切入点
public class MyAdvice { // 定义切入点 @Pointcut("execution(void com.charley.dao.BookDao.update())") private void pt(){} // 通知 public void method(){ System.out.println(System.currentTimeMillis()); } }
说明:切入点定义依托一个不具有实际意义的方法进行,即无参数,无返回值,方法体无实际逻辑
-
绑定切入点与通知关系,并指定通知添加到原始连接点的具体执行位置
public class MyAdvice { // 定义切入点 @Pointcut("execution(void com.charley.dao.BookDao.update())") private void pt(){} // 把切入点和通知绑定好 @Before("pt()") // 定义好通知 public void method(){ System.out.println(System.currentTimeMillis()); } }
-
定义通知类受spring容器管理,并定义当前类为切面类
@Component //告诉spring这段代码受其控制 @Aspect // 告诉spring这段代码是做AOP的 public class MyAdvice { // 定义切入点 @Pointcut("execution(void com.charley.dao.BookDao.update())") private void pt(){} // 把切入点和通知绑定好 @Before("pt()") // 定义好通知 public void method(){ System.out.println(System.currentTimeMillis()); } }
-
开启Spring对AOP注解驱动支持
@Configuration @ComponentScan("com.charley") @EnableAspectJAutoProxy // 告诉程序有注解开发的aop public class SpringConfig { }