- 浏览: 936708 次
- 性别:
- 来自: 重庆
文章分类
- 全部博客 (453)
- Windows phone 7 (0)
- Andriod (47)
- iPhone (1)
- Web (30)
- J2EE (34)
- stucts 2学习笔记 (34)
- 开发项目 (3)
- spring学习笔记 (24)
- EJB学习笔记 (6)
- Hibernate学习笔记 (15)
- JPA学习笔记 (8)
- Jsp (11)
- ajax (7)
- 异常收集模块 (1)
- jquery (2)
- phoneGap (2)
- jquery Mobile (0)
- java面试总结 (5)
- Object-C (0)
- javascript (6)
- Eclipse (5)
- 支付集成 (2)
- Weblogic (1)
- Dubbox (5)
- Redis (10)
- linux (21)
- Codis (2)
- React Native (0)
- Mysql (6)
- Docker (3)
- 自动化部署 (1)
- 项目Bug管理平台 (2)
- 负载均衡 (1)
- Mycat (2)
- Java基础知识 (16)
- 数据库 (7)
- Maven (17)
- Kafka (21)
- logs (2)
- 大并发 (2)
- 消息中间件 (2)
- 分布式锁 (3)
- 算法 (4)
- 数字证书原理,公钥私钥 (0)
- 数字证书原理 (1)
- 公钥私钥 (1)
- zookeeper (4)
- Hbase (9)
- Hadoop (2)
- storm (2)
- 通信协议 (1)
- Hive (3)
- git (1)
- JVM (2)
- 大数据相关算法 (1)
- idea (5)
- 将博客搬至CSDN (1)
- 设计模式 (2)
- 表达式 (1)
- 代码审查工具 (0)
- 开源项目 (1)
- PyCharm (0)
- python (6)
- Kubernetes (1)
- swagger (1)
- Maven中mirrors和repository的关系 (0)
- RabbitMQ (3)
- redisson (1)
- k8s (2)
- Mac (1)
最新评论
-
misisipi101:
假设库已经分为32个,那么要扩展到64个,怎样做呢
订单分库分表实践总结以及关键步骤 -
mfkxk298:
简单明了的例子,解决了问题,谢谢啦!
关于ListView中notifyDataSetChanged()刷新数据不更新原因 -
whbwang:
" target="_blank" ...
java web开发 高并发处理 -
suguoqian:
...
java web开发 高并发处理 -
xiangnanyujing:
Dubbox+Redis3.0+Spring+Hibernate+zookeeper实现消息推送核心搭建
知识点
【
使用前提条件:
【
/*
* 如果这个代理的类没有实现接口就不能使用JDK中的动态代理
* 这时需要使用第三方的.jar CGLIB实现代理
*
*/
】
public class CGLIBProxy implements MethodInterceptor {
private Object targetObject;//代理的目标对象
public Object createProxyInstance(Object targetObject){
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();//该类用于生成代理对象
enhancer.setSuperclass(this.targetObject.getClass());//设置父类
enhancer.setCallback(this);//设置回调用对象为本身
return enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
return methodProxy.invoke(this.targetObject, args);
}
}
CGLIB可以生成目标类的子类,并重写父类非final修饰符的方法。
】
实现步骤:
第一步:在spring解压包中找到cglib-nodep-2.1_3.jar文件并导入
第四步:编写PersonServerCGLIB类
public class PersonServerCGLIB {
private IPersonDao personDao;
private String name;
public PersonServerCGLIB(){}
/*
* 通过构造器来注入依赖对象
*/
public PersonServerCGLIB(IPersonDao personDao, String name) {
this.name = name;
this.personDao = personDao;
}
public PersonServerCGLIB(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IPersonDao getPersonDao() {
return personDao;
}
// @Resource(name="mypersonDao")
// @Autowired
public void setPersonDao(IPersonDao personDao) {
this.personDao = personDao;
}
public void save() {
System.out.println("Test CGLIB Proxy");
}
}
第三步:编写CGLIB代理类
public class createCGLIBProxy implements MethodInterceptor{
/*
* 如果这个代理的类没有实现接口就不能使用JDK中的动态代理
* 这时需要使用第三方的.jar CGLIB实现代理
*
*/
private Object targeObject;
public Object createCGLIBProxy(Object targeObject)
{
this.targeObject=targeObject;
Enhancer enhancer=new Enhancer();
//设置父类 这里代理类需要继承这个父类 和JDK实现类似
enhancer.setSuperclass(this.targeObject.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object object, Method method, Object[] arg2,
MethodProxy methodProxy) throws Throwable {
Object object1=null;
PersonServerCGLIB personServer=(PersonServerCGLIB)this.targeObject;
if(personServer.getName()!=null || "".equals(personServer.getName()))
{
object1=methodProxy.invoke(this.targeObject, arg2);
}
return object1;
}
}
第四步 :编写单元测
@Test
public void TestCGLIBProxy()
{
createCGLIBProxy proxy=new createCGLIBProxy();
//PersonServer personServer=(PersonServer)proxy.createProxyInstance(new PersonServer("liyong"));
//这里转换为代理类而不是接口原因是这个类没有实现任何接口
PersonServerCGLIB personServer=(PersonServerCGLIB)proxy.createCGLIBProxy(new PersonServerCGLIB("liyong"));
personServer.save();
}
【
使用前提条件:
【
/*
* 如果这个代理的类没有实现接口就不能使用JDK中的动态代理
* 这时需要使用第三方的.jar CGLIB实现代理
*
*/
】
public class CGLIBProxy implements MethodInterceptor {
private Object targetObject;//代理的目标对象
public Object createProxyInstance(Object targetObject){
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer();//该类用于生成代理对象
enhancer.setSuperclass(this.targetObject.getClass());//设置父类
enhancer.setCallback(this);//设置回调用对象为本身
return enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
return methodProxy.invoke(this.targetObject, args);
}
}
CGLIB可以生成目标类的子类,并重写父类非final修饰符的方法。
】
实现步骤:
第一步:在spring解压包中找到cglib-nodep-2.1_3.jar文件并导入
第四步:编写PersonServerCGLIB类
public class PersonServerCGLIB {
private IPersonDao personDao;
private String name;
public PersonServerCGLIB(){}
/*
* 通过构造器来注入依赖对象
*/
public PersonServerCGLIB(IPersonDao personDao, String name) {
this.name = name;
this.personDao = personDao;
}
public PersonServerCGLIB(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IPersonDao getPersonDao() {
return personDao;
}
// @Resource(name="mypersonDao")
// @Autowired
public void setPersonDao(IPersonDao personDao) {
this.personDao = personDao;
}
public void save() {
System.out.println("Test CGLIB Proxy");
}
}
第三步:编写CGLIB代理类
public class createCGLIBProxy implements MethodInterceptor{
/*
* 如果这个代理的类没有实现接口就不能使用JDK中的动态代理
* 这时需要使用第三方的.jar CGLIB实现代理
*
*/
private Object targeObject;
public Object createCGLIBProxy(Object targeObject)
{
this.targeObject=targeObject;
Enhancer enhancer=new Enhancer();
//设置父类 这里代理类需要继承这个父类 和JDK实现类似
enhancer.setSuperclass(this.targeObject.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object object, Method method, Object[] arg2,
MethodProxy methodProxy) throws Throwable {
Object object1=null;
PersonServerCGLIB personServer=(PersonServerCGLIB)this.targeObject;
if(personServer.getName()!=null || "".equals(personServer.getName()))
{
object1=methodProxy.invoke(this.targeObject, arg2);
}
return object1;
}
}
第四步 :编写单元测
@Test
public void TestCGLIBProxy()
{
createCGLIBProxy proxy=new createCGLIBProxy();
//PersonServer personServer=(PersonServer)proxy.createProxyInstance(new PersonServer("liyong"));
//这里转换为代理类而不是接口原因是这个类没有实现任何接口
PersonServerCGLIB personServer=(PersonServerCGLIB)proxy.createCGLIBProxy(new PersonServerCGLIB("liyong"));
personServer.save();
}
发表评论
-
Spring 5 中文解析之核心篇-IoC容器
2020-08-27 11:23 436关于本书 本书 本书编写主要目的在于翻 ... -
Spring Boot Profile使用
2018-06-26 19:06 598Spring Boot使用@Profile注解可以实现不同 ... -
Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别
2016-06-22 09:36 699Spring事务配置的五种方式 前段时间对Sprin ... -
Spring中@Autowired注解、@Resource注解的区别
2016-06-13 22:25 773Spring不但支持自己定义的@Autowired注解, ... -
Spring实现AOP的4种方式
2016-06-13 21:41 981先了解AOP的相关术语:1.通知(Advice):通知定义了 ... -
SpringMvc HttpClient上传参数
2016-05-04 21:58 3022SpringMVC代码示例如下: @RequestM ... -
重庆APP开发 重庆Android 重庆Ios 爬虫科技 重庆爬虫科技
2014-10-06 12:03 9<!--[if gte mso 9]><x ... -
spring中的事务学习
2012-05-11 09:11 1167/* * spring默认情况下会对unchecked会进行事 ... -
Spring+JDBC组合开发及环境搭建
2012-05-11 09:11 1609知识点; 【 <1、使用Spring+JDBC集成步骤 ... -
基于基于XML配置方式声明切面
2012-05-11 09:11 1514知识点: 【 //普通的java 类 public clas ... -
基于注解方式声明切面(AOP)
2012-05-10 10:55 1660基础知识: 【 首先启动对@AspectJ注解的支持(蓝色部 ... -
使用Spring进行面向切面(AOP)编程
2012-05-10 10:55 1155基础知识: 【 要进行AOP编程,首先我们要在spring的配 ... -
AOP中的概念
2012-05-10 10:55 953基础知识 【 Aspect(切面):指横切性关注点的抽象即为切 ... -
JDK动态代理
2012-05-10 10:55 1225知识点 【 public class JDKProxy imp ... -
通过在classpath自动扫描方式把组件纳入spring容器中管理
2012-05-09 09:39 1409知识点 : 【 前面的例子我们都是使用XML的bean定义来 ... -
依赖注入--手工装配
2012-05-09 09:39 1202知识点: 【 手工装配依赖对象,在这种方式中又有两种编程方式 ... -
集合类型的装配
2012-05-09 09:39 1096知识点: 【 第一:设置集合属性 public class ... -
bean的生命周期
2012-05-05 22:41 0bean的生命周期: 如下配置: <bean id=& ... -
bean的生命周期
2012-05-09 09:39 1105bean的生命周期: 如下配置: <bean id=& ... -
注入依赖对象
2012-05-08 12:06 996知识点: 【 基本类型 ...
相关推荐
cglib生成的代理的class
CGLIB 动态代理使用 ASM 字节码工具来生成代理类。CGLIB 动态代理可以代理没有接口的类,這是因为 CGLIB 动态代理可以生成一个原类的子类,然后 override 原类的方法来实现代理。 在 Spring AOP 框架中,默认情况下...
在实体类没有实现任何接口的情况下,Hibernate会使用CGLIB生成代理对象,以便在保存或更新实体时能够自动跟踪属性的变化。 至于"aspectj",这通常指的是AspectJ,一个强大的AOP框架,它可以与CGLIB结合使用,提供更...
在内存占用上,两者差别不大,但CGLIB生成的代理类可能略微增加内存负担。 在工具支持上,Spring框架对两者都有很好的支持。Spring AOP默认使用JDK动态代理,但如果目标类没有实现接口,它会自动切换到CGLIB。在...
2. **Proxy类**:用于创建动态代理对象,通过`newProxyInstance()`静态方法,传入类加载器、接口数组和InvocationHandler实例来生成代理对象。 3. **实现过程**:首先,你需要定义一个接口,然后创建实现该接口的...
CGLIB通过字节码技术生成代理类,能够在运行时动态创建子类并扩展目标对象,从而实现代理功能。这种代理方式相对于Java自带的JDK动态代理(基于接口的代理)来说,对目标类没有接口限制,更具有灵活性。 要使用...
我们可以通过`Enhancer`创建一个增强器实例,然后设置回调函数(Callback),最后通过`enhancer.create()`方法生成代理对象。回调函数通常是`MethodInterceptor`,它包含了一个`intercept`方法,这个方法会在目标...
- `Enhancer`是CGLIB的主要入口,它扮演了工厂的角色,通过它可以配置代理对象的行为,并生成代理子类。 - 使用Enhancer时,需要设置回调接口`Callback`,如`MethodInterceptor`,并指定被代理的目标类。 2. **...
- target/classes:编译后的class文件,包括目标类的class文件,以及由CGLib生成的子类class文件 - 测试代码:展示如何使用Enhancer创建代理对象并调用方法 这两个项目可以帮助我们深入了解JDK和CGLib动态代理的...
而CGLIB的使用稍微复杂一些,需要通过Enhancer类配置回调函数和目标对象,然后调用create()方法生成代理。 安全性方面,由于JDK动态代理遵循接口,所以在类型检查和编译时期就能发现问题。而CGLIB在运行时生成子类...
- **JDK代理**:JDK动态代理使用反射和InvocationHandler接口生成一个实现了目标接口的新类。在运行时,这个新类的实例作为代理对象,它的方法调用都会转发到InvocationHandler的`invoke()`方法。 - **CGLIB代理**...
- 创建Enhancer实例:Enhancer是Cglib的核心类,它负责生成代理对象。 - 设置被代理的目标对象:通过setSuperclass()方法设置目标类的Class对象。 - 设置回调机制:通过setCallback()或setCallbacks()方法设置回...
3. 生成代理对象:通过Enhancer.create()方法,我们可以得到目标类的代理对象。这个代理对象是目标类的子类,它在运行时被动态创建。 4. 调用方法:通过代理对象调用目标类的方法,实际上会触发MethodInterceptor的...
- CGlib生成的代理类会继承目标类,所以如果目标类声明为final,CGlib将无法创建代理。 - 对于包含final方法的目标类,CGlib也无法在这些方法上添加拦截器。 - 如果目标类中包含静态方法,CGlib代理不会影响静态方法...
使用CGLib代理的基本步骤如下: 1. 引入依赖:首先,你需要将这两个jar包引入到你的项目中,无论是Maven、Gradle还是传统的类路径管理方式。 2. 创建Enhancer对象:CGLib的代理功能主要通过Enhancer类来实现。...
如果代理的目标类已经实现了接口,那么通常推荐使用JDK的动态代理,因为JDK动态代理不需要生成新的字节码,而是基于接口创建代理对象。 6. **CGLIB与Spring AOP**: 在Spring框架中,如果目标类没有实现接口,...
ASM库能够读取、修改和生成Class文件,这对于CGLib动态生成代理类至关重要。CGLib通过ASM解析类的字节码,然后在原有字节码的基础上插入新的字节码以实现动态增强。ASM的使用使得CGLib能够在运行时高效地创建和修改...
2. 使用Proxy.newProxyInstance()方法,传入目标接口、InvocationHandler实例以及类加载器,生成代理对象。 3. 通过代理对象调用接口方法,实际会触发InvocationHandler的invoke()方法。 然而,Java动态代理有一个...
2. 创建Enhancer对象:这是CGlib的核心类,用于生成代理对象。 3. 设置回调函数:通过setCallback方法,设置方法拦截器,例如MethodInterceptor。 4. 生成代理对象:通过Enhancer.create()方法生成代理对象,这个...
CGLib通过生成目标对象的子类来实现代理,它会动态地创建一个新的类,这个类继承自目标类,并覆盖其方法以插入切面逻辑。CGLib的优点是它可以代理任何类,无需目标对象实现接口,但相比JDK动态代理,它的运行效率较...