spring对AOP的支持-----知识点:
JDK的动态代理:主要是针对实现了接口的类生成代理
CGLIB:是针对类生成代理,针对指定的类生成一个子类,覆盖里面的方法,所以指定的类不能是final包括方法
实例:目标对象
package com.lovo.spring;
public class UserManagerImpl {
public void addUser(String username, String password) {
System.out.println("---------userManagerImpl.addUser()--------");
}
public void deleteUser(int id) {
System.out.println("---------userManagerImpl.deleteUser()--------");
}
public String findUserById(int id) {
System.out.println("---------userManagerImpl.findUser()--------");
return null;
}
public void modifyUser(int id, String username, String password) {
System.out.println("---------userManagerImpl.modifyUser()--------");
}
//private void checkSecurity(){
// System.out.println("---------userManagerImpl.checkSecurity()--------");
//}
}
代理对象:
package com.lovo.spring;
import org.aspectj.lang.JoinPoint;
public class SecurityHandler {
private void checkSecurity(){
System.out.println("---------------------------checkSecurity222222222222222");
}
}
applicationContext.xml配置文件:
<!-- 可以不配置:spring会用到CGLIB库,但是必须导入库
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
-->
<bean id="securityHandler" clss="com.lovo.spring.SecurityHandler"/>
<bean id="userManager" class="com.lovo.spring.UserManagerImpl"/>
<aop:config>
<aop:aspect id="myAspect" ref="securityHandler">
<aop:pointcut id="allAddMethod" expression="execution(* com.lovo.spring.UserManagerImpl.add*(..))"/>
<aop:before method="checkSecurity" pointcut-ref="allAddMethod"/>
</aop:aspect>
</aop:config>
1:如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2:目标对象实现了接口,可以强制使用CGLIB实现AOP
3:如目标对象没有实现接口,必须采用CGLIB库,spirng会自动在JDK动态代理和CGLIB之间转换
测试类:
package com.lovo.spring;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ClientTest {
/**
* @param args
*/
public static void main(String[] args) {
/**1111*/BeanFactory bf = new ClassPathXmlApplicationContext("applicationContext.xml");
UserManagerImpl userManager = (UserManagerImpl) bf.getBean("userManager");
userManager.addUser("aa", "aa");
// userManager.deleteUser(2);
}
}
在这里:可以在111处采用断点:可以看到userManager对象是一个CGLIB代理,
userManagerImp1$$EnhancerByCGLIB$$..........
如果是实现了接口的JDK动态代理的话:
这里的userManager就是:$Proxy0