`

aop jdk cglib方法实现

 
阅读更多

aop实现方式有两种,一种是jdk用接口实现,一种是cglib生成子类实现

 

jdk方式

这种方式必须是针对接口编程,下面给出示例代码

 

业务接口类

public interface UserService {

public void saveString(User user, String str);

}

业务实现类

public class UserServiceImpl implements UserService {

 

@Override

public void saveString(User user, String str) {

System.out.println("保存str:" + str);

}

 

}

 

生成代理类工厂

public class ProxyFactory implements InvocationHandler {

 

private Object targectObject;

 

public Object createProxyInstance(Object obj) {

this.targectObject = obj;

return Proxy.newProxyInstance(this.targectObject.getClass().getClassLoader(), this.targectObject.getClass().getInterfaces(), this);

 

}

 

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

UserService userService = (UserService) this.targectObject;

return method.invoke(userService, args);

}

 

}

 

这个代理工厂可以不实现jdk中的InvocationHandler,这个handler是在Proxy.newProxyInstance的时候,需要有个处理,这里直接放这个工厂里面,是共用了targectObject这个对象,一般写法,是要独立出来。

 

测试代码

public static void main(String[] args) {

ProxyFactory pf = new ProxyFactory();

UserService userService = new UserServiceImpl();

UserService service = (UserService) pf.createProxyInstance(userService);

service.saveString(new User(), "123");

 

}

 

 

 

cglib方式

该方式是针对类编程的,可以无接口

只给出代理工厂的代码,业务代码同上

public class CglibProxyFactory implements MethodInterceptor {

 

private Object targetObject;

 

public Object createIntance(Object obj) {

this.targetObject = obj;

Enhancer enhancer = new Enhancer();

enhancer.setSuperclass(this.targetObject.getClass());

enhancer.setCallback(this);

return enhancer.create();

}

 

@Override

public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {

UserService userService = (UserService) this.targetObject;

return method.invoke(userService, args);

}

 

}

同上,该工厂同样实现了cglib的MethodInterceptor ,该接口中的方法是为了enhancer.setCallback使用,一般也独立出来,这里方便处理就放一起了

 

测试代码

public static void main(String[] args) {

CglibProxyFactory cpf = new CglibProxyFactory();

UserService userService = new UserServiceImpl();

UserService service = (UserService) cpf.createIntance(userService);

service.saveString(new User(), "123");

 

}

 

 

 

 

 

分享到:
评论

相关推荐

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    AOP之JDK动态代理和CGLib动态代理

    AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383

    Spring框架中JDK动态代理和cglib动态代理

    Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理

    Spring-AOP-JDK动态代理

    Spring-AOP-利用java中的动态代理和Spring的拦截器做到AOP

    cglib aop spring 动态代理

    静态代理--不适合企业开发,适合初学者理解代理。 jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口...spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib

    JDK动态代理(AOP)使用及原理分析视频教程课件

    动态代理是使用jdk的反射机制,创建对象的...jdk动态代理,必须有接口,目标类必须实现接口, 没有接口时,需要使用cglib动态代理。 动态代理可以在不改变原来目标方法功能的前提下, 可以在代理中增强自己的功能代码。

    spring_aop4.rar_Home Home_jar 转换_spring AOP jar

    2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用CGLIB实现AOP? * 添加CGLIB库,SPRING_HOME/...

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    本资源将深入探讨Spring框架中使用的两种关键的动态代理方式:JDK动态代理和CGLib动态代理。这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好...

    AOP的实现代码

    详细介绍了AOP的核心功能(拦截功能)在底层是如何实现的;介绍了两种实现AOP的动态代理:jdk动态代理和cglib动态代理,并详细描述了它们在代码层面的实现。附有必须的cglib.jar和asm.jar

    Cglib3.3.0最新版jar包

    Cglib最新版本的2个jar包,分别是cglib-3.3.0.jar和cglib-nodep-3.3.0.jar,压缩后上传,方便大家使用。

    Spring aop 之 静态代理 动态代理 Aspectj aop-config 等实现方式

    主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 ...6. CGLIB aop-config 7. AOP动态代理配置 8. AOP自动识别动态代理配置

    cglib.jar下载

    通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。 二、CGLIB原理 CGLIB原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。...

    2020年春招最新阿里Java面试题集锦

    jdk和cglib实现的AOP实际上会在内存生成动态代理对象,还有什么其他办法实现AOP?经提示答出AspectJ以及实现原理 Spring中的对象的作用域 Singleton对象引用Prototype会发生什么 项目中怎样使用微服务? 两个服务...

    JAVA动态代理

    使用JDK中的Proxy技术实现AOP 使用CGLib实现AOP功能

    cglib必须导入的包和案例

    JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口,如果想代理没有实现接口的类,就可以使用Cglib实现. Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口.它广泛的...

    代理机制及AOP原理实现

    spring中动态代理机制的实现原理及AOP实现原理,JDK的反射,cglib类。

    spring之AOP(动态代理)

    spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理

    AOP编程示例

    CGlib的Proxy实现AOP的示例、JDK的Proxy实现AOP的示例、通过spring注解方式实现AOP

    Spring框架+SpringAOP动态代理

    SpringAOP动态代理 Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB ...CGLIB(Code Generation Library)是一个代码生成的类库,可以在运行时动态生成一个目标类的子类,并覆盖其中的方法来实现代理。

    SpringBoot下的SpringAOP-day04-源代码

    SpringBoot下的Spring——DAY04——动态代理总结、AOP、自定义注解进行拦截、动态获取注解参数、通知方法 1.动态代理总结 1.1 JDK动态代理特点 1.2 CGlib动态代理 1.2.1 CGLib特点说明 1.3 动态代理的作用 2 Spring...

Global site tag (gtag.js) - Google Analytics