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
分享到:
相关推荐
CGLIB能够为没有接口的类生成子类,在Spring框架中,当需要为一个没有接口的类创建代理对象时,会选择CGLIB来生成代理。 现在,我们来详细探讨如何简单模拟Spring框架中的CGLIB代理。要进行模拟,首先需要了解CGLIB...
CGLIB通过字节码操作技术,在运行时动态创建子类并增强方法。在Spring中,当目标对象不支持代理(如final类)或者没有接口时,Spring会使用CGLIB来生成代理对象,实现对目标对象的拦截和增强。"spring-cglib-repack-...
CGLIB通过字节码操作技术生成代理类,这样就可以在运行时扩展或修改已有类的功能,而无需修改原始代码。 CGLIB的主要优点包括: 1. 高性能:相对于其他动态代理库(如Java的反射API或JDK动态代理),CGLIB的代理...
CGLIB通过字节码生成技术,为原始类创建一个子类,并在子类中拦截方法调用,实现事务管理、日志记录、性能监控等切面功能。3.2.5是CGLIB的一个版本号,表明这是CGLIB库的第3.2.5次更新,包含了之前版本的改进和修复...
CGLIB 动态代理使用 ASM 字节码工具来生成代理类。CGLIB 动态代理可以代理没有接口的类,這是因为 CGLIB 动态代理可以生成一个原类的子类,然后 override 原类的方法来实现代理。 在 Spring AOP 框架中,默认情况下...
CGLIB通过字节码技术生成代理类,可以在运行时动态扩展目标类并添加新的方法或属性。`spring-cglib-repack-3.2.6.jar`是Spring框架使用的CGLIB库的打包版本,可能包含了针对某些特定环境或冲突的修复。 其次,`...
Objenesis通过使用字节码技术绕过Java的常规构造器,实现对类的快速实例化,这对于Spring框架中的某些功能,如测试和模拟,非常有用。 这两个jar包在Spring 4.0中作为依赖项存在,是因为Spring框架广泛地利用了动态...
CGlib通过字节码技术动态生成一个类的子类,这个子类会在运行时被实例化,从而实现对目标对象的代理。CGlib的核心组件包括Enhancer、Callback和MethodInterceptor等,它们协同工作,使得Spring可以在不修改原有代码...
CGLIB通过字节码技术生成子类并在运行时增强目标类的功能,这对于AOP代理和Mock测试非常有用。因此,在分析Spring源码时,理解CGLIB的工作原理有助于深入理解Spring AOP的实现。 其次,"spring-objenesis-repack-...
为了深入理解Spring框架如何使用CGLIB和Objenesis,开发者通常会查看源代码,了解它们如何集成到Spring的AOP代理机制中,以及如何通过API进行定制。 总的来说,"spring-cglib-repack-3.2.0.jar"和"spring-objenesis...
当Spring的AOP代理无法通过简单地继承来实现时(例如,目标类为final或包含final方法),CGlib就会介入,通过字节码技术生成目标类的一个子类,以此来实现对目标方法的拦截和增强。CGlib的核心是ASM库,ASM是一个...
CGLIB通过字节码技术生成一个目标类的子类,并在子类中拦截方法调用,实现代理逻辑。spring-cglib-repack-3.2.0.jar是CGLIB的一个打包版本,用于Spring源码编译,确保了AOP功能的正常实现。 2. **Objenesis** ...
CGLIB的运作原理是通过字节码技术在运行时动态生成一个新的类,这个新类继承自原来的类,并且在新类中添加了额外的方法以实现对目标类的拦截。当Spring的AOP需要为目标对象创建代理时,如果目标类没有实现接口,...
CGLIB的代理对象比JDK动态代理稍微慢一些,因为它涉及到字节码生成,但它的灵活性更高。 在性能方面,JDK动态代理由于不涉及字节码生成,所以在运行时的性能通常优于CGLIB。然而,如果目标类的方法很多,CGLIB可能...
在Spring中,Objenesis用于初始化无参构造器的对象,特别是在CGLIB生成的代理类中,可能需要避免调用默认构造器,这时候Objenesis就能发挥作用。Objenesis能够优化实例化过程,对于某些不支持无参构造函数或构造函数...
CGLIB通过字节码技术生成代理类,能够在运行时动态创建子类并扩展目标对象,从而实现代理功能。这种代理方式相对于Java自带的JDK动态代理(基于接口的代理)来说,对目标类没有接口限制,更具有灵活性。 要使用...
Spring框架在运行时对字节码进行操作,以实现AOP(面向切面编程)功能,比如代理、方法增强等。ASM库的repack版本是为了避免与应用中可能存在的其他ASM版本冲突,确保Spring的正常工作。 其次,CGLIB(Code ...
在Spring中,ASM主要用于AOP(面向切面编程)的实现,通过字节码操作,Spring可以在运行时动态生成代理类,以实现在不修改原有代码的情况下插入切面逻辑。spring-asm-repack-5.0.4.jar是ASM库的一个特定版本,与...
CGLib的核心是通过ASM库来操作字节码生成新的类,这些新生成的类是对原始类的扩展,通常用于在运行时动态创建目标对象的代理,以实现额外的功能,如AOP(面向切面编程)中的方法拦截。ASM库是一个底层的Java字节码...
因此,在实际开发中通常建议使用像 CGLIB 这样的高级抽象层,以简化字节码操作的过程。 #### 图1: CGLIB 库及其与其他框架的关系 该图展示了 CGLIB 库与一些流行的框架之间的关系,包括但不限于 Spring AOP 和 ...