spring有两种代理创建方式:
1.如果目标对象实现了一个(或多个)接口暴露的方法,spring将使用JDK的java.lang.reflect.Proxy类创建代理。
2.如果目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
注意:
1.对于接口创建代理优于对类创建代理,因为这样会产生更加松耦合的系统。
2.标记为fianl的方法不能被通知。 因为spring是为目标类产生子类,任何需要被通知的方法都被复写,将通知织入。而final方法是不能继承的。
spring只支持方法连接点
spring中的通知类型
1.Around MethodInterceptor 拦截对目标对象方法调用
2.Before BeforeAdvice 在目标方法被调用之前调用
3.After AfterReturningAdvice 在目标方法被调用之后调用
4Throws ThrowsAdvice 当目标方法抛出异常是调用
区别:MethodInterceptor 能够控制目标方法是否真的被调用。这一点不同与MethodBeforeAdvice,目标方法总是会被调用,除非抛出异常。
MethodInterceptor让你可以控制返回的对象。就是说你可以返回一个与proceed()方法返回对象完全不同的对象。而AfterReturningAdvice可以获得返回的对象,但是你不能返回一个不同的对象 。