博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring学习之代理
阅读量:4695 次
发布时间:2019-06-09

本文共 2559 字,大约阅读时间需要 8 分钟。

                                     Spring的核心就是IOC和AOP

        IOC就是控制反转:   就是用配置文件的方式给javabean 赋值.

             正常的在程序里;用new 的方式创建一个对象的时候,他就固定了值,

             如果是注入的方式的话可以根据配置文件的配置给他一个值(就变成可改的了).这个好像进一步模式化了程序代码.(个人理解)总有一天可能

            一个程序完成所有的应用吧.只要我改配置文件.

      AOP:面向切面编程:个人理解就是在执行方法的时候做一些事情.让业务更纯净一些,其他的一些必须的功能就切入一段代码完成.如事物.

      而AOP的底层是用代理模式完成的.所以代理模式的理解有助于理解AOP

      一.静态代理:  

            java的代理需要接口:

          所以先定义一个接口:

                TestInterface

  

package po;public interface TestInterface {    String getConten();}

 

实现类:

 

package po.impl;public class TestImpl implements Student {    @Override    public String getConten() {                return "我是真实对象";    }}

 

静态代理类:

package po.impl;public class TestProxy implements TestInterface{    private TestInterface test;            public TestProxy() {            }    public TestProxy(TestInterface test) {                this.test = test;    }    @Override    public String getConten() {                System.out.println("我是增强");         System.out.println(test.getConten());        return null;    }}

 

测试类:

  

public class MYtest {  public  static void main(String[] args) {      //测试 new TestProxy(new TestImpl()).getConten();  }}

 

 

动态代理:  那个接口和实现类不变,不用创建代理类了,java会自动创建代理类

     测试类代码如下

package ui;import java.lang.reflect.Method;import org.springframework.cglib.proxy.InvocationHandler;import org.springframework.cglib.proxy.Proxy;import po.TestImpl;import po.TestInterface;import po.TestInterface;import po.TestInterface;import po.TestProxy;public class MYtest {  public  static void main(String[] args) {          //测试      new TestProxy(new TestImpl()).getConten();     //测试动态代理      final TestInterface stu=new TestImpl();      TestInterface proxy = (TestInterface)Proxy.newProxyInstance(stu.getClass().getClassLoader(),stu.getClass().getInterfaces(),new InvocationHandler() {        @Override        public Object invoke(Object proxy, Method method, Object[] h)                throws Throwable {             System.out.println("我是动态代理增强!!!");             return method.invoke(stu,h);        }    });     System.out.println( proxy.getConten());;        }}

 

       其中调用了Proxy类的newInstance()方法该方法的参数有三个

           1.ClassLoader  :类加载器,new的时候就是这个创建的类,对象.getClass().getClassLoader()的得到改对象的类的类加载器,

           2.Class[]   得到接口数组

           3.InvocationHandler :句柄(我不太懂,就是一个匿名类,就是程序创建的动态代理类,我是这么理解的.)

 其中这部分invoke方法就是执行的动态代理的方法,他的三个参数

1.proxy:  指代我们所代理的那个真实对象

2.method:  指代的是我们所要调用真实对象的某个方法的Method对象
3.args:  指代的是调用真实对象某个方法时接受的参数

@Override        public Object invoke(Object proxy, Method method, Object[] h)                throws Throwable {             System.out.println("我是动态代理增强!!!");             return method.invoke(stu,h);        }

 

转载于:https://www.cnblogs.com/xiangtianxiayu/p/5372145.html

你可能感兴趣的文章
直接量
查看>>
leetcode 115. 不同的子序列(Distinct Subsequences)
查看>>
三元表达式
查看>>
Go初接触之libjpeg-turbo
查看>>
python--生成器协程运算
查看>>
INFT 3030 Concurrent Programming
查看>>
小心了,这个设置会导致你的vm重启时被强制重装系统!
查看>>
邮票面值设计 (动态规划+DFS)
查看>>
解决INSTALL_FAILED_MISSING_SHARED_LIBRARY (转载)
查看>>
Linux内核高端内存
查看>>
HTML列表
查看>>
Redis集群创建报错
查看>>
DispacherServlet 的作用
查看>>
POJ - 1426(Find The Multiple)
查看>>
一张图带你看懂原始dao与SQL动态代理开发的区别-Mybatis
查看>>
2016年10月30日--JavaScript语法
查看>>
MiCode 40: 找小“3”
查看>>
四则运算1.0版本
查看>>
leetcode - Longest Consecutive Sequence
查看>>
20165214 2018-2019-2 《网络对抗技术》Exp5 MSF基础应用 Week8
查看>>