JDK的Proxy实现代理要求被代理的目标对象必须实现一个接口,而如果目标对象没有实现接口则不能使用Proxy来代理。不过我们也可以借助cglib来实现代理,这样目标对象不必实现接口.
要代理的对象:com.spring305.test.aopCglib.UserDao.java
public class UserDao {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public UserDao(String name) {
this.name = name;
}
public UserDao() {
// TODO Auto-generated constructor stub
}
public void print1() {
System.out.println(UserDao.class.toString() + " print1()");
}
public void print2() {
System.out.println(UserDao.class.toString() + " print2()");
}
}
com.spring305.test.aopCglib.CglibFactory.java
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibFactory implements MethodInterceptor {
private Object target;
public Object createUserDao(Object target) {
this.target = target;
//用enhancer类来创建代理对象
Enhancer enhancer = new Enhancer();
//设置父类,即为目标类
enhancer.setSuperclass(this.target.getClass());
// cglib创建的代理对象,其实就是继承了要代理的目标类,然后对目标类中所有非final方法进行覆盖,但在覆盖方法时会添加一些拦截代码。
// 注册回调器,回调下面intercept
enhancer.setCallback(this);
//返回创建的代理对象
return enhancer.create();
}
@Override
//参数依次代表:代理对象本身,被拦截到的方法,方法的参数,方法的代理对象
//切面,指横切性关注点的抽象,与类相似,但是两者的关注点不同,类是对物体特征的抽象
//连接点:指那些被拦截到的点,spring只支持方法类型的连接点
//切入点:指我们要对连接点进行拦截的定义
//通知:拦截到连接点后做的事情即为通知
//Target,目标对象:代理的目标对象
//织入:将aspectJ应用到target对象,并导致proxy对象创建的过程
//引入:在不修改类代码前提下,引入可以在运行期为类动态地添加一些方法或者field
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {//环绕通知
UserDao udi = (UserDao) target;
Object result = null;
if (udi.getName() != null) {
// 前置通知 advice()
try {
result = methodProxy.invoke(target, args);
// 后置通知 afterAdvice()
} catch (Exception e) {
e.printStackTrace();
// 例外通知 exceptionAdvice
} finally {
// 最终通知 finalyAdvice
}
}
return result;
}
}
测试:
@Test
public void cglibTest(){
CglibFactory test = new CglibFactory();
//UserDao dao = (UserDao)test.createUserDao(new UserDao());
UserDao dao = (UserDao)test.createUserDao(new UserDao("aa"));
dao.print1();
dao.print2();
}
分享到:
相关推荐
spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理
Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB 代理。 JDK 动态代理:用于代理实现了接口的类。Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于代理没有实现接口的...
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...
基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...
Spring AOP实现方法之一:CGLIB 实现AOP功能
Spring_AOP笔记Spring_AOP笔记Spring_AOP笔记Spring_AOP笔记Spring_AOP笔记Spring_AOP笔记Spring_AOP笔记
如果想使用CGLIB的技术来生成代理对象,那么需要引入CGLIB的开发的jar包,在Spring框架核心包中已经引入了CGLIB的开发包了。所以直接引入Spring核心开发包即可!
Spring-AOP-利用java中的动态代理和Spring的拦截器做到AOP
静态代理--不适合企业开发,适合初学者理解代理。... 3.cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。 spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib
死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序
Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现.doc
spring3 spring-aop chm 类图
Spring框架是一个开放源代码的J2EE应用程序框架,是对bean的生命周期进行管理的轻量...Spring框架主要由七部分组成,分别是Spring Core,Spring AOP,Spring ORM,Spring DAO,Spring Context,Spring Web和Spring Web MVC。
使用Spring配置文件实现AOP
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
spring aop 编程,cglib ,切面编程
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383