在上面的两种情况实现AOP中的目标对象UserManagerImpl都实现了接口,如果没有实现接口,该如何做呢?使用CGLIB。
下面简单介绍spring对AOP的支持的几种情况:
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
如何强制使用CGLIB实现AOP?
* 添加CGLIB库,SPRING_HOME/cglib/*.jar
* 在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
下面我们基于上面来做一个使用CGLIB的例子,我们只需修改UserManagerImpl和配置文件,代码如下:
目标对象UserManagerImpl不实现接口:
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.findUserById()--");
return null;
}
public void modifyUser(int id, String username, String password) {
System.out.println("----UserManagerImpl.modifyUser()----");
}
applicationContext.xml
<aop:aspectj-autoproxy proxy-target-class="true"/>
<bean id="securityHandler" class="spring.SecurityHandler"/>
<bean id="userManager" class="spring.UserManagerImpl"/>
<aop:config>
<aop:aspect id="security" ref="securityHandler">
<aop:pointcut id="allAddMethod" expression="execution(* spring.UserManagerImpl.add*(..))"/>
<aop:before method="checkSecurity" pointcut-ref="allAddMethod"/>
</aop:aspect>x
</aop:config>
测试端代码:
public class Client {
public static void main(String[] args) {
BeanFactory factory = new
ClassPathXmlApplicationContext("applicationContext.xml");
UserManagerImpl userManager =
(UserManagerImpl)factory.getBean("userManager");
userManager.addUser("张三", "123");
}
}
JDK动态代理和CGLIB字节码生成的区别?
* JDK动态代理只能对实现了接口的类生成代理,而不能针对类
* CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,因为是继承,所以该类或方法最好不要声明成final
分享到:
相关推荐
Spring使用CGILib作为其代理实现的一部分,特别是在进行代理代理时,如事务管理、AOP切面等。 其次,`spring-objenesis-repack-2.1.jar`则是关于Objenesis库。Objenesis是一个轻量级库,用于在Java中快速实例化无参...
CGLIB是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)的实现中被使用,比如Spring AOP。CGLIB通过字节码操作技术,在运行时动态创建子类并增强方法。在Spring中,当目标对象不支持代理(如final类)...
当Spring框架在进行AOP代理时,如果目标类没有实现接口,它会选择使用CGLIB来创建一个子类并动态地插入拦截器方法。CGLIB通过字节码操作技术生成代理类,这样就可以在运行时扩展或修改已有类的功能,而无需修改原始...
在Spring框架中,CGLIB主要被用于AOP(面向切面编程)的实现。当Spring需要对某个目标对象进行代理,但该对象不支持接口时,就会使用CGLIB。CGLIB通过字节码生成技术,为原始类创建一个子类,并在子类中拦截方法调用...
在Java开发领域,Spring框架是不可或缺的重要组成部分,它为开发者提供了强大的依赖注入、AOP(面向切面编程)以及各种企业级服务。标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是...
当目标对象不支持接口时(即,它只是一个普通的Java类),Spring会利用CGlib创建目标对象的子类,并在子类中拦截方法调用,这样就能实现AOP(面向切面编程)的功能。例如,Spring的事务管理、缓存管理和性能监控等...
CGLIB是一个强大的代码生成库,常被用作Java代理机制,尤其在Spring AOP(面向切面编程)中。当Spring需要为目标对象创建代理以便实现方法拦截时,如果目标类没有实现接口,CGLIB就会派上用场,生成一个该类的子类,...
在Spring框架中,CGLIB被广泛用于AOP(面向切面编程)代理。当目标对象不支持接口或者为了提高性能时,Spring会使用CGLIB代理来创建代理对象。`spring-cglib-repack-3.2.6.jar` 包含了CGLIB库的重新打包版本,可能包含...
在Spring框架中,CGlib被用来实现AOP(面向切面编程)中的代理机制。当目标对象不支持接口(即为final类或者没有接口的类)时,Spring会使用CGlib来创建代理对象。通过这种方式,Spring能够注入切面逻辑,比如日志...
在Spring框架中,CGLIB主要被用来创建代理对象,特别是在没有实现接口的类上进行AOP(面向切面编程)操作。CGLIB通过生成子类并在子类的方法上插入拦截器来实现动态代理。"spring-cglib-repack-3.2.5.jar" 是CGLIB库...
CGLIB是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)的实现中被广泛使用,包括Spring AOP。在Java中,接口是实现动态代理的主要方式,但并非所有的类都能通过接口实现动态代理,例如那些没有接口的类...
当目标对象不支持接口时(即为非接口类型),Spring会使用CGlib创建目标对象的子类,并在子类中织入切面逻辑。CGlib通过字节码技术动态生成一个类的子类,这个子类会在运行时被实例化,从而实现对目标对象的代理。...
CGLIB是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)框架中被广泛使用,包括Spring。在Spring中,CGLIB用于为那些没有实现接口的类创建动态代理。当Spring管理的bean需要被代理以实现AOP功能,如...
在Spring AOP(面向切面编程)中,CGlib被用来动态地创建代理对象,对目标对象进行增强。当Spring的AOP代理无法通过简单地继承来实现时(例如,目标类为final或包含final方法),CGlib就会介入,通过字节码技术生成...
当Spring检测到一个类没有实现任何接口时,它会使用CGLIB来创建一个子类,并在其中插入拦截器方法以实现切面功能。CGLIB还用于其他场景,如动态数据访问对象(DAO)的创建,或者在需要模拟或扩展已有类时。 3. **...
总结起来,Spring使用CGLIB实现AOP功能,主要是通过动态生成目标类的子类并插入拦截代码来实现切面的织入。理解CGLIB的工作原理以及如何在Spring中配置和使用它,对于提升Spring AOP的应用能力至关重要。通过阅读...
首先,`CGLIB`(Code Generation Library)是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)框架中被用到,如Spring AOP,用于创建对象的代理以实现方法拦截。当Spring需要对非接口类进行代理时,通常...
首先,"spring-cglib-repack-3.2.4.jar"是针对CGLIB(Code Generation Library)的一个特殊版本,CGLIB是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)框架中被使用,包括Spring。在Spring中,当目标...