使用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>


你可能感兴趣的:(AOP,Date,object,Class,interface,encoding)