静态代理,jdk动态代理和cjlib动态代理
来源:互联网 发布:ubuntu查看显卡使用率 编辑:程序博客网 时间:2024/06/06 07:08
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方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。*/
阅读全文
0 0
- 静态代理,jdk动态代理和cjlib动态代理
- Java动态代理和cjlib动态代理的区别
- Java静态代理和jdk动态代理、Cglib动态代理
- jdk代理和cjlib代理的区别
- jdk代理(一) 静态代理和动态代理使用
- 静态代理和动态代理(JDK动态代理和CGLib动态代理)
- 静态代理和动态代理
- 静态代理和动态代理
- 静态代理和动态代理
- 静态代理和动态代理
- 动态代理和静态代理
- 静态代理和动态代理
- 静态代理和动态代理
- 静态代理和动态代理
- 动态代理和静态代理
- 静态代理和动态代理
- 动态代理和静态代理
- 动态代理和静态代理
- redis集群环境安装(参照redis中文官网,中间遇到了一些问题,so,记录一下)
- 【NYOJ-71】 独木舟上的旅行
- CSU-ACM2017暑期训练6-bfs C
- hdu 1003 Max Sum
- Android软件开发之盘点自定义View界面大合集
- 静态代理,jdk动态代理和cjlib动态代理
- ORA-12541:TNS:无监听程序,配置Oracle数据库监听程序
- Unity 中的Transform组件
- RequireJS一点点
- 喷水装置(二)
- 剑指offer编程Java实现pdf——持续更新中...
- Dubbo学习
- 杭电acm—1082 Matrix Chain Multiplication
- oracle database 11g express 版学习 (sqlplus)