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功能
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383
Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理
Spring-AOP-利用java中的动态代理和Spring的拦截器做到AOP
静态代理--不适合企业开发,适合初学者理解代理。 jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口...spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib
动态代理是使用jdk的反射机制,创建对象的...jdk动态代理,必须有接口,目标类必须实现接口, 没有接口时,需要使用cglib动态代理。 动态代理可以在不改变原来目标方法功能的前提下, 可以在代理中增强自己的功能代码。
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用CGLIB实现AOP? * 添加CGLIB库,SPRING_HOME/...
本资源将深入探讨Spring框架中使用的两种关键的动态代理方式:JDK动态代理和CGLib动态代理。这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好...
详细介绍了AOP的核心功能(拦截功能)在底层是如何实现的;介绍了两种实现AOP的动态代理:jdk动态代理和cglib动态代理,并详细描述了它们在代码层面的实现。附有必须的cglib.jar和asm.jar
Cglib最新版本的2个jar包,分别是cglib-3.3.0.jar和cglib-nodep-3.3.0.jar,压缩后上传,方便大家使用。
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 ...6. CGLIB aop-config 7. AOP动态代理配置 8. AOP自动识别动态代理配置
通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB是一个好的选择。 二、CGLIB原理 CGLIB原理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。...
jdk和cglib实现的AOP实际上会在内存生成动态代理对象,还有什么其他办法实现AOP?经提示答出AspectJ以及实现原理 Spring中的对象的作用域 Singleton对象引用Prototype会发生什么 项目中怎样使用微服务? 两个服务...
使用JDK中的Proxy技术实现AOP 使用CGLib实现AOP功能
JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口,如果想代理没有实现接口的类,就可以使用Cglib实现. Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口.它广泛的...
spring中动态代理机制的实现原理及AOP实现原理,JDK的反射,cglib类。
spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理
CGlib的Proxy实现AOP的示例、JDK的Proxy实现AOP的示例、通过spring注解方式实现AOP
SpringAOP动态代理 Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB ...CGLIB(Code Generation Library)是一个代码生成的类库,可以在运行时动态生成一个目标类的子类,并覆盖其中的方法来实现代理。
SpringBoot下的Spring——DAY04——动态代理总结、AOP、自定义注解进行拦截、动态获取注解参数、通知方法 1.动态代理总结 1.1 JDK动态代理特点 1.2 CGlib动态代理 1.2.1 CGLib特点说明 1.3 动态代理的作用 2 Spring...