Spring学习之代理

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);
        }
时间: 2024-10-25 06:51:16

Spring学习之代理的相关文章

Spring学习笔记--代理

静态代理 1.静态代理的角色分析(UML画图推荐使用StarUML软件) 抽象角色---一般使用接口或者抽象类来实现. 真是角色---被代理的角色. 代理角色---代理真实角色-代理真是角色后一般会做一些附属操作. 客户-------使用代理角色来进行一些操作. 2.代码的实现(房东-中介-客户) Rent.java--抽象角色 package cn.sxt.staticproxy; public interface Rent { public void rent(); } Host.java-

不错的Spring学习笔记(转)

Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是spring.jar和commons-logging.jar.此外为了便于测试加入了JUnit包.   在Myeclipse中创建Java项目.   编写一个接口类,为了简单,只加入了一个方法.   Java代码   1.package com.szy.spring.interfacebean;  

设计模式(二)学习----动态代理

动态代理:动态代理是指在实现阶段不需要关心代理谁,而在运行阶段才指定代理哪一个对象.Spring AOP采用的核心思想就是动态代理设计模式.  下面看动态代理的UML类图: 下面思考问题:invocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的? 动态代理类: package com.lp.ecjtu.DynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect

Spring学习之第一个AOP程序

IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组合,OOP 最大问题就是无法解耦组件进行开发,比如我们上边举例,而 AOP 就是为了克服这个问题而出现的,它来进行这种耦合的分离.AOP 为开发者提供一种进行横切关注点(比如日志关注点)分离并织入的机制,把横切关注点分离,然后通过某种技术织入到系统中,从而无耦

spring学习二:根据spring原理自己写个spring

请先看我另一篇文章:"Spring学习一:IOC(控制反转)和AOP(面向切面)的xml配置和注解方式"中大概知道他的简单用法 那我自己想写一个简单sping,注解的方式以后再写 方式:1.解析xml配置 2.使用java的反射机制生产动态代理对象 3.扫描类上的注解,再用反射(没写) 代码如下(简单实现,重原理轻代码,不喜勿喷) xml配置我就直接用我上一篇spring-test的配置了,代码也用上一篇的,但解析的时候是用自己写的,没有用调用任何spring API代码 <?x

Spring学习系列笔记之Spring心得

1 解释一下Dependency injection(DI依赖注入)和IOC(Inversion of control,控制反转)? 答:1.1:Dependency injection(DI依赖注入): 就是说将一个目标与目标对象之间的依赖通过Spring容器来实现注入,这样使得与传统的通过自己写代码来创建对象的方式完全颠倒过来了,这就是控制反转的由来吧. 我觉得用口头举例子来说明DI更方便,更清晰.通过DI机制,降低了替换业务对象的复杂性. 依赖注入主要有两种方式来实现: a:设值注入.  

spring学习(三) ———— spring事务操作

前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTemplate? spring提供用于操作数据库模版,类似Dbutils,通俗点讲,我们操作数据库,spring也会帮我们提供一个操作数据库的工具供我们使用,而不用我们自己手动编写连接数据库,获取结果集等等操作,这个工具就是JdbcTemplate.跟Dbutils一样,想要使用JdbcTemplate

Struts2 + Spring 学习(一)搭建struts开发环境

·为Web应用增加Struts2支持 1. 登陆struts2官网下载struts2的最新版,本文所用的是Struts 2.3.16.2 我们所下载的压缩包内内容应给如下 其中,apps包含了struts2的实例应用,docs包含了struts2的相关文档,lib包含了Struts2框架的核心类库以及struts2的第三方插件类库,src包含了struc包含了struts2框架的全部源码. 2. 在Eclipse新建Web工程,将是所用到的类库放到WEB-INF/路径下 3. 编辑Web应用的w

Spring学习记录(十二)---AOP理解

Spring核心之二:AOP(Aspect Oriented Programming) --- 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 专业术语: Joinpoint(连接点): 所谓连接点是指那些被拦截到的点.在spri