静态代理,jdk动态代理和cjlib动态代理
2017-08-01 19:46
141 查看
1.静态代理
//抽象主题 public interface ISubject { //定义一个方法,request public void request(); } //准备一个真实主题和一个代理主题 public class RealSubject implements ISubject{ public void request() { System.out.println("我是主业务"); } } public class ProxySubject implements ISubject{ //构造一个真是主题并进行封装 private RealSubject real; //定义一个方法 public void request() { //code System.out.println("before"); real.request(); //code System.out.println("after"); } public RealSubject getReal() { return real; } public void setReal(RealSubject real) { this.real = real; } } @Test /** * 静态代理测试 */ public void staticproxyTest(){ ProxySubject proxy=new ProxySubject(); //准备一个真实主题,他在后期代码中会作为代理对象的属性 RealSubject real=new RealSubject(); proxy.setReal(real); proxy.request(); }
2.jdk动态代理
//定义一个接口public interface IUserDAO {
public String add();
public String edit();
}
public class UserDAOImpl implements IUserDAO{
public String add() {
//开启事务
System.out.println("add ok!");
return "add";
//logger
}
public String edit() {
//开启事务
System.out.println("edit ok!");
return "edit";
//开启事务
}
}
@Test
/**
* jdk动态代理测试
*/
public void staticproxyTest() {
//01.先创建出接口实现类
final IUserDAO dao=new UserDAOImpl();//该代理类具有 final 和 public 修饰符,意味着它可以被所有的类访问,但是不能被再度继承
//02.类Proxy
IUserDAO proxy=(IUserDAO) Proxy
.newProxyInstance(dao.getClass() //获取实现类的类加载器
//dao.getClass()或者写成UserDaoImpl.class().getClassLoader()
.getClassLoader(), dao.getClass(). //
getInterfaces(), // 获取实现类接口
new InvocationHandler() { //Invocation(调用 ) Handler (处理)
@Override
/**proxy 代理对象 不能用 如果用了就会无限循环
* method 被代理对象 方法 add()
* args add方法的参数 (代理对象的方法参数)
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//code 1
System.out.println("start Tran");
//真正业务
//执行dao对象的add方法,传入的是args参数,返回值是result
Object result = method.invoke(dao, args);
//code 2
System.out.println("write logger");
return result;
}
});
String add = proxy.add();
System.out.println("======="+add+"=======");//"add"
proxy.edit();
}
3.cjlib动态代理
//重点在于理解他的单测内容public class UserService {
public void delete(){
System.out.println("delete ok!");
}
}
@Test
/**
* cglib动态代理测试
*/
public void cglibProxyTest(){
final UserService service=new UserService();
//cglib动态代理
//01.需要类 Enhancer
Enhancer enhancer=new Enhancer();//导入spring-core4.2.3.RELEASE
enhancer.setSuperclass(service.getClass());
enhancer.setCallback(new org.springframework.cglib.proxy.MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects,
MethodProxy methodProxy) throws Throwable {
System.out.println("before");
method.invoke(service, objects);
System.out.println("after");
return null;
}
});
//02.用方法
UserService proxy= (UserService)enhancer.create();
//03.
proxy.delete();
}
/* CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,
但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,
因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要
9857
更为合适一些。
同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。*/
相关文章推荐
- 设计模式之代理模式(静态代理、JDK动态代理和cglib动态代理)
- JDK的动态(静态)代理机制(转载并整理修改)
- JDK静态代理及动态代理
- java静态代理和动态代理(JDK&cglib)
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
- 代理设计模式(普通静态代理、JDK动态代理、cglib动态代理)
- java静态代理和动态代理(JDK&cglib)
- java静态代理,动态代理(JDK,CGLib)
- java 静态代理,jdk动态代理,CGLIB动态代理详解
- 静态代理和动态代理(JDK动态代理和CGLib动态代理)
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
- Java静态代理和jdk动态代理、Cglib动态代理
- AOP思想个人理解以及实战静态代理、JDK动态代理、CGlib动态代理
- java代理(静态代理和jdk动态代理以及cglib代理)
- 浅谈Java代理(jdk静态代理、动态代理和cglib动态代理)
- 网摘-java静态代理和动态代理例子(jdk动态代理和cglib动态代理)
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- 静态代理、JDK动态代理、CGLIB动态代理、Spring实现AOP、IOC+AOP
- [教程]Java代理(静态,动态jdk和Cglib)简单应用
- Java 代理模式:静态代理、JDK 动态代理和 Cglib 动态代理的区别