通知类型全部采用注解方式
* @Before 前置通知
* @AfterReturning 后置通知,目标对象方法执行成功
* @AfterThrowing 异常通知
* @After 最终通知
*/
// @Before(value="execution(public * com.baidu.demo1.*.save(..))")
// @AfterReturning(value="execution(public * com.baidu.demo1.*.save(..))")
// @AfterThrowing(value="execution(public * com.baidu.demo1.*.save(..))")
// @After(value="execution(public * com.baidu.demo1.*.save(..))")
public void log(){
System.out.println("记录日志...");
}
/**
* 环绕通知
*/
// @Around(value="execution(public * com.baidu.demo1.*.save(..))")
@Around(value="MyAnnoAspect.fn()")
public void arond(ProceedingJoinPoint pp){
try {
System.out.println("记录日志...");
// 让目标对象方法执行
pp.proceed();
System.out.println("记录日志...");
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* 定义切入点的表达式
*/
@Pointcut(value="execution(public * com.baidu.demo1.*.save(..))")
public void fn(){}
}
基于子类的动态代理:
package com.baidu.demo2;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
/**
* 使用cglib方式生成代理对象
* 不用实现接口
* @author Administrator
*/
public class MyCglibProxy {
/**
* 获取到代理对象
* @return
*/
public static RoleServiceImpl getProxy(final RoleServiceImpl role){
Enhancer e = new Enhancer();
// 设置父类
e.setSuperclass(role.getClass());
// 设置回调函数
e.setCallback(new MethodInterceptor() {
// 调用代理对象的方法,那么intercept方法就会执行
public Object intercept(Object arg0, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
// 让目标对象方法执行
Object invoke = methodProxy.invoke(role, args);
// 增强
System.out.println("记录日志...");
return invoke;
}
});
// 创建代理对象
Object proxy = e.create();
// 把代理对象返回
return (RoleServiceImpl) proxy;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 管理service -->
<bean id="userService" class="com.baidu.demo1.UserServiceImpl"/>
<!-- 先配置切面类 -->
<bean id="myXmlAspect" class="com.baidu.demo1.MyXmlAspect"/>
<!-- 配置AOP的增强
<aop:config>
-->
<!-- 配置切面 = 切入点 (表达式)+ 通知
<aop:aspect ref=&qu |