Spring中实现AOP

2014-11-24 07:23:25 · 作者: · 浏览: 0

1. AOP代理对象
注意在实现代理模式的时候要对目标对象编写代理类,目标对象必须实现了某些接口才行。当要对没有实现接口的目标类进行实现代理时可以用Spring的lib包中的cglib包实现:
编写的代理工厂类为
[java]
public class CglibProxyFactory implements MethodInterceptor{
private Object targetObject;

public Object createProxyInstance(Object targetObject) {
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());
enhancer.setCallback(this);
return enhancer.create();
}

@Override
public Object intercept(Object arg0, Method arg1, Object[]arg2,
MethodProxy arg3) throws Throwable {
PersonServiceBean bean = (PersonServiceBean) this.targetObject;
Object result = null;
if (bean.getUser() != null) {
result = arg3.invoke(targetObject, arg2);
}

return result;
}
}



2. spring利用注解进行实现AOP
首先要编写好目标对象,也就是bean,然后实现好相应的切面对象;在beans.xml中配置好两者的bean属性。关键的是在切面对象中实现注解的标识:

[java]
@Aspect
public class MyInterceptor {

@Pointcut("execution(* com.lcq.service.impl.PersonServiceBean.*(..))")
private void anyMethod() {
};// 声明一个切入点

@Before("anyMethod() &&args(name)")
public void doAccessCheck(String name) {
System.out.println("name:" + name);
System.out.println("前置通知");
}

@AfterReturning(pointcut = "anyMethod()", returning = "result")
public void doAfterReturning(String result) {
System.out.println("后置通知 :" + result);
System.out.println("后置通知");
}

@After("anyMethod()")

public void doAfter() {
System.out.println("最终通知");
}

@AfterThrowing("anyMethod()")
public void doAfterThrowing() {
System.out.println("例外通知");
}

@Around("anyMethod()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("进入方法");
Object result = pjp.proceed();
System.out.println("退出方法");
return result;
}
}


3. spring利用xml配置的方式实现AOP,利用xml进行的配置除了xml中的配置不同外,其他的Java类相似
详细的xml配置为
[java]
< xml version="1.0"encoding="UTF-8" >
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

aspectj-autoproxy />




expression="execution(*com.lcq.service..*.*(..))" />

method="doAfterReturning"/>
method="doAfterThrowing"/>






总体感觉使用xml的配置方式比较好点,在Java类中编写一些注解,看上去别扭,在xml中的配置则显得明了。

摘自liuchangqing123