cglib代理学习笔记
来源:互联网 发布:mac book air能吃鸡吗 编辑:程序博客网 时间:2024/05/27 09:46
1.cglib和静态代理和动态代理的区别?
静态代理和动态代理都需要去实现某个接口,然后才能使用,特别是静态代理,一次只能服务一个类,动态代理好一点,可以服务所有的类,但是还是要实现接口,这样有点烦,但是cglib完美的解决了这个问题,可以强行给某个类加入方法,不需要去实现某个接口
2.如何实现
a.需要加方法的类:
package com.lilei.test.proxytest;/** * Created by Administrator on 2017/9/26. */public class HelloImp1 { public void say(String name) { System.out.println("Hello! "+name); } public void eat(String name) { System.out.println("eat "+name); }}
b.cglib代理类
package com.lilei.test.proxytest;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/** * Created by Administrator on 2017/9/27. */public class CGlibProxy implements MethodInterceptor{ private static CGlibProxy cGlibProxy; private CGlibProxy(){ } public static CGlibProxy getInstance(){ if (cGlibProxy == null){ return new CGlibProxy(); } return cGlibProxy; }// private Object target;//// public CGlibProxy(Object target) {// this.target = target;// } public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { before(); Object result = proxy.invokeSuper(obj,args); after(); return result; } private void before(){ System.out.println("Before"); } private void after(){ System.out.println("After"); } /** * 获取代理 * @param cls * @param <T> * @return */ public <T> T getProxy(Class<?> cls){ Enhancer en = new Enhancer();//工具类 en.setSuperclass(cls);//设置超类 en.setCallback(this);//设置回调函数 return (T) en.create(); }}
c .springDemo.xml配置文件,将cglib代理类和想要服务的类关联起来
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/beans/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.lilei.test.AddviceTest"/> <bean id="transactionManager" class="com.lilei.test.AddviceTest.GreetingThrowAdvice" /> <bean id="greetingIml" class="com.lilei.test.AddviceTest.GreetingImp" /> <bean id ="greetingIntoAdvice" class="com.lilei.test.AddviceTest.GreetingIntroAdvice" /> <bean id="greetingAroundAdvice" class="com.lilei.test.AddviceTest.GreetingImp" /> <!--<aop:aspectj-autoproxy proxy-target-class="true"/>--> <!--配置一个切面--> <bean id="greetingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice" ref="greetingIntoAdvice" /> <!--增强--> <property name="pattern" value="com.lilei.test.AddviceTest.GreetingIntroAdvice.good.*"/><!--正则表达式--> </bean> <!--配置一个代理--> <bean id="greetingProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <!--<property name="interfaces" value="com.lilei.test.AddviceTest.Apology"/>--><!--需要动态实现的接口--> <property name="target" ref="greetingIml"/><!--目标类--> <!--<property name="interceptorNames" value="greetingIntoAdvice" />--><!--引入增强--> <!-- <property name="interceptorNames" value="greetingAdvisor" />--> <property name="interceptorNames" value="transactionManager" /> <property name="proxyTargetClass" value="true"/> </bean></beans>
d.cglib测试类
package com.lilei.test.proxytest;/** * Created by Administrator on 2017/9/28. */public class CGlibProxyTest { public static void main(String[] args) {// CGlibProxy cGlibProxy = new CGlibProxy();// HelloImp1 hello = cGlibProxy.getProxy(HelloImp1.class); HelloImp1 hello = CGlibProxy.getInstance().getProxy(HelloImp1.class); hello.say("lieli"); hello.eat("lieli1"); }}
阅读全文
1 0
- cglib代理学习笔记
- jdk/cglib动态代理学习笔记
- 浅谈CGLIB动态代理和JDK动态代理 学习笔记
- CGLIB动态代理学习
- cglib动态代理学习
- (学习笔记)Java的JDK动态代理与CGLIB动态代理实现
- Java 代理学习笔记 —— 浅析Cglib动态代理实现
- spring学习笔记cglib
- CGLIB学习笔记
- spring 学习基础笔记 包括spring 的代理 JDK CGLIB 事物 AOP 以及各种注入
- Spring学习笔记--AOP的简略实现(基于J2SE动态代理与CgLib)
- spring学习笔记(7)AOP前夕[2]CGLib动态代理实例解析
- JDK动态 代理 & CgLib 学习总结
- cglib代理
- cglib代理
- CGLIB代理
- cglib 代理
- cglib代理
- Expected one result (or null) to be returned by selectOne(), but found: 4
- Linux中表示“时间”的结构体和相关函数
- C#生成唯一值的方法汇总
- 根据电机位置对混合动力汽车的定义
- 表单的勾选删除
- cglib代理学习笔记
- 懒人读算法(三)-添加新区间
- 文件系统读写--page cache机制
- Android项目该如何选择targetSdkVersion
- 基于pf_ring特性的libpcap库安装与配置
- UIButton 扩大点击响应区域
- SSM综合项目实战(TTSC) -- day02 Dubbo注册中心,通用Mapper,分页插件
- 金融科技&大数据产品推荐:Hyperchain--国产自主可控的企业级联盟区块链平台
- 比特币遭俄罗斯央行封禁,阿里成立全球研究机构“达摩院” | 大数据24小时