使用Aspectj进行AOP开发

使用Aspectj进行AOP开发 1.介绍 @Aspect是一个注解,我们可以通过注解来创建通知,创建通知之前要先引入两个jar文件: spring-framework-2.5.5\lib\aspectj下的两个jar文件都需要导入 2.在bean.xml中需要引入aop schema: http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 这样,环境就搭建完了 3.为了测试,我们先创建一个service层来写一个方法 EmployeeService.java接口 package cn.csdn.hr.service; public interface EmployeeService { //工作 public void work(); } EmployeeServiceBean.java 实现类 package cn.csdn.hr.service; public class EmployeeServiceBean implements EmployeeService { @Override public void work() { // TODO Auto-generated method stub System.out.println("工作中==================="); } } 4.创建一个类就可以包含所有的通知类型,AspectUtil.java package cn.csdn.hr.advice; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.DeclareParents; import org.aspectj.lang.annotation.Pointcut; @Aspect public class AspectUtil { // 声明一个切入点,在以后的前置,后置中直接引用就可以了! @Pointcut("execution(* cn.csdn.hr..*.work(..))") public void disp() { } // execution(修饰符,返回值类型,包名+类名+方法名(方法参数)) // 前置通知 @Before("disp()") public void getUp() { // TODO Auto-generated method stub System.out.println("老王该起床啦=============!"); } // 环绕通知要加上参数 有优先级 // @Around("execution(* cn.csdn.hr..*(..)") @Around("disp()") public Object punchCard(ProceedingJoinPoint jp) throws Throwable { // TODO Auto-generated method stub System.out.println("打卡前============!"); Object obj = jp.proceed(); System.out.println("打卡后============!"); return obj; } // 后置通知 @AfterThrowing("disp()") public void unwell() { System.out.println("不舒服呢!!需要请假-------------"); } // 后置通知 @After("disp()") public void goHome() { // TODO Auto-generated method stub System.out.println("赶紧回家吧!"); } // 引用通知 @DeclareParents(value = "cn.csdn.hr.service.EmployeeServiceBean", defaultImpl = AuditableAdvice.class) public Auditable auditable; } 需要注意的是在声明的类上要加上一个@Aspect,可以说这个类就是一个切面,在最前面我们声明了一个方法为: @Pointcut("execution(* cn.csdn.hr..*.work(..))") public void disp() { } 这样,就可以声明一个切入点,在前置通知或后置通知的时候就可以直接写声明pointCut的方法就可以了,可以省略一下代码,如上面的所视。 引入通知中引用了一个接口为Auditable,我们可以实现它: package cn.csdn.hr.advice; import java.util.Date; public interface Auditable { //引入 就是添加新的功能 修改日期的接口 //添加属性:记录最后一次修改的时间 void setLastModifiedDate(Date lastModifiefDate); Date getLastModifiedDate(); } 实现类为: package cn.csdn.hr.advice; import java.util.Date; import org.springframework.aop.support.DefaultIntroductionAdvisor; import org.springframework.aop.support.DelegatingIntroductionInterceptor; /* * 引入通知,继承DelegatingIntroductionInterceptor接口,使用引入的拦截器 */ @SuppressWarnings("serial") public class AuditableAdvice extends DelegatingIntroductionInterceptor implements Auditable { private Date lastModifiedDate; //DefaultIntroductionAdvisor @Override public void setLastModifiedDate(Date lastModifiefDate) { // TODO Auto-generated method stub this.lastModifiedDate = lastModifiefDate; } @Override public Date getLastModifiedDate() { // TODO Auto-generated method stub System.out.println("最后一次修改的时间为:"+lastModifiedDate); return lastModifiedDate; } } 这样我们在bean.xml中只需要配置一个类就可以了 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd "> <!-- 声明通知 --> <bean id="aspectUtil" class="cn.csdn.hr.advice.AspectUtil"></bean> <!-- 引入通知 --> <bean id="myAspectAdvice" class="cn.csdn.hr.advice.MyAspectAdvice"></bean> <!-- 配置一个业务bean --> <bean id="employeeServiceBean" class="cn.csdn.hr.service.EmployeeServiceBean"></bean> <!-- 定义xml约束 添加能够使用注解 --> <aop:aspectj-autoproxy /> </beans>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值