<bean></bean>
<bean/>
<aop:config>
<aop:pointcut expression="execution(public void delete())"/>
<!-- 异常抛出增强 -->
<aop:advisor advice-ref="error" pointcut-ref="pointcut"/>
</aop:config>
</beans>
2.CGLIB代理
CGLIB(CODE GENERLIZE LIBRARY)代理是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明称final的。
如果目标对象没有实现接口,则默认会采用CGLIB代理;
如果目标对象实现了接口,可以强制使用CGLIB实现代理(添加CGLIB库,并在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz){
//设置需要创建子类的类
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//通过字节码技术动态创建子类实例
return enhancer.create();
}
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("前置代理");
//通过代理类调用父类中的方法
Object result = proxy.invokeSuper(obj, args);
System.out.println("后置代理");
return result;
}
test
public class Test {
public static void main(String[] args) {
final UserService service=new UserService();
//1.创建
Enhancer enhancer=new Enhancer();
//2.设置根据哪个类生成子类
enhancer.setSuperclass(service.getClass());
//3.指定回调函数
enhancer.setCallback(new MethodInterceptor() {
//实现MethodInterceptor接口方法
public Object intercept(Object proxy, Method method, Object[] object,
MethodProxy methodproxy) throws Throwable {
//System.out.println("代码增强");
System.out.println("前置代理");
//通过代理类调用父类中的方法
Object invoke = method.invoke(service, object);
System.out.println("后置代理");
return invoke;
}
});
//通过字节码技术动态创建子类实例
UserService proxy = (UserService) enhancer.create();
proxy.delete();
}
}
applicationContext.xml
<bean></bean>
<bean/>
<aop:config>
<aop:pointcut expression="execution(public void delete())"/>
<!-- 异常抛出增强 -->
<aop:advisor advice-ref="error" pointcut-ref="pointcut"/>
</aop:config>
<aop:aspectj-autoproxy proxy-target-class="true"/>