目录
XML形式的编码回顾
package aop;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
Object ret = null;
System.out.println("运行在原始方法之前");
ret = methodInvocation.proceed();
System.out.println("运行在原始方法之后");
return ret;
}
}
XML中配置
<!-- 原始对象-->
<bean id="userDao" class="core.UserDaoImpl"></bean>
<!-- 额外功能-->
<bean id="around" class="aop.MyAspect"></bean>
<!--Proxy -target-class 默认false,运行JDK,true,运行cglib-->
<aop:config proxy-target-class="true">
<!-- 定义切入点-->
<aop:pointcut id="pc" expression="within(core..*)"/>
<!-- 组装-->
<aop:advisor advice-ref="around" pointcut-ref="pc"></aop:advisor>
</aop:config>
注解方式的使用
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
/**
* aop额外功能 类注解
* 表示切面类
*/
@Aspect
public class MyAspect1 {
/**
* 这个方法必须是空实现,返回值是void
*/
@Pointcut("within(core..*)")
public void pointcut(){};
/**
* 这是自定义aop实现类额外功能方法,必须加上@Around注解
* @param joinPoint 这个参数的作用同MethodInterceptor【spring】中MethodInvocation methodInvocation
* @return 原始方法运行结果的返回值
*/
// 该注解表示额外功能类,里面的value值是切入点表达式
// @Around("within(core..*)")
// 为了其他的额外功能重用切入点,避免重复的书写切入点
@Around("pointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
Object ret = null;
System.out.println("原始方法运行之前");
ret = joinPoint.proceed();
System.out.println("原始方法运行之后");
return ret;
}
}
配置文件中:
<!-- 原始对象-->
<bean id="userDao" class="core.UserDaoImpl"></bean>
<!--额外功能 包括了切入点。-->
<bean id="around" class="aop.MyAspect1"></bean>
<!--自动组装,proxy-target-class指定代理类型 cglib true JDK false-->
<aop:aspectj-autoproxy proxy-target-class="false"/>
运行结果: