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()")
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: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">
总体感觉使用xml的配置方式比较好点,在Java类中编写一些注解,看上去别扭,在xml中的配置则显得明了。
摘自liuchangqing123