Spring 第一章

Spring是一种为了减缓程序开发复杂性开发的一种基于AOP和IOC等思想的集合框架。

AOP:(AOP为Aspect Oriented Programming的缩写,即面向切面编程(也叫面向方面),是一种可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。

如下运用了动态代理的实例

Animal.java :委托类(被代理的类),注:委托类实际是一个接口,这里为了方便描述,所以这里用委托类

1 public interface Animal {
2     public void run();
3     public void jump();
4 }  

Dog.java 实现了委托类的子类

public class Dog implements Animal{
    public void run(){
        System.out.println("小狗开始跑!");
    }
    public void jump(){
        System.out.println("小狗开始跳!");
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * InvocationHandle接口的实现类的实例相当于一个拦截器,作用是拦截被代理(委托)对象中的方法
 *
 * @author Administrator
 *
 */

public class MyProxy  implements InvocationHandler{  

    private Object targetObject;
    /**
     * 通过该构造方法传入该拦截类需要拦截(绑定)的委托类对象
     *  * @param targetObject 委托对象
     */
    public MyProxy(Object targetObject){
        this.targetObject = targetObject;
    }
    /**
     * 返回一个代理类
     * @param target
     * @return
     */
//    public Object createProxyInstance(Object targetObject) {
//        return
//    }  

    /**
     * @param proxy:指被代理的对象。
     * @param method:要调用的方法
     * @param args:方法调用时所需要的参数
     */
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        //注入需要调用的方法  (额外功能)
        command();
        //执行被代理对象的方法,如果方法有返回值则赋值给ret
        Object ret = method.invoke(targetObject, args);
        //注入需要调用的方法  (额外功能)
        award();
        return ret;
    }  

    private void command() {
        System.out.println("驯兽师发出命令!");
    }
    private void award(){
        System.out.println("驯兽师给与奖励!");
    }
} 

MyProxy.java:拦截类(都必须实现InvocationHandler接口,覆盖里面的invoke方法),其作用直观地说,就是把委托类(Animal)中的每一个方法都等价于invoke方法。

当在用代理实例(详见Test.java中的注解)调用对应的方法时,实际上是在执行invoke方法。此外还可以自己在invoke方法里面添加自己想要添加的内容,这样就保证了在原有功能不变的基础上增加了

额外的功能的目的,详见下面的代码中的注释。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * InvocationHandle接口的实现类的实例相当于一个拦截器,作用是拦截被代理(委托)对象中的方法
 *
 * @author Administrator
 *
 */

public class MyProxy  implements InvocationHandler{  

    private Object targetObject;
    /**
     * 通过该构造方法传入该拦截类需要拦截(绑定)的委托类(Animal)对象
     *  * @param targetObject 委托类对象
     */
    public MyProxy(Object targetObject){
        this.targetObject = targetObject;
    }
    /**
     * 返回一个代理类
     * @param target
     * @return
     */
//    public Object createProxyInstance(Object targetObject) {
//        return
//    }  

    /**
     * @param proxy:指被代理的对象。
     * @param method:要调用的方法
     * @param args:方法调用时所需要的参数
     */
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        //注入需要调用的方法
        command();
        //执行被代理对象的方法,如果方法有返回值则赋值给ret
        Object ret = method.invoke(targetObject, args);
        //注入需要调用的方法
        award();
        return ret;
    }  

    private void command() {
        System.out.println("驯兽师发出命令!");
    }
    private void award(){
        System.out.println("驯兽师给与奖励!");
    }
} 

Test.java

import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {
        //(Animal)委托类对象
        Animal animal = new Dog();
        // 确定(MyProxy)拦截类需要拦截的对象(animal),并产生一个拦截类对象(hander)
        //该对象的作用是拦截委托类(animal)中的指定方法。
        MyProxy hander = new MyProxy(animal);
        /**
         * 产生委托类(Animal)对象的代理的实例(animalProxy)
         * new ProxyInstance(委托类对象的类加载器,委托类对象所实现的所有接口,拦截类对象)
         */
        Animal animalProxy = (Animal) Proxy.newProxyInstance(animal.getClass().getClassLoader(),
                animal.getClass().getInterfaces(),
                hander);
        /**
         * 当用代理实例(animalProxy)调用委托类(Animal)里面的对应的方法时,会自动转到拦截类
         * (MyProxy)中的invoke方法去执行(该方法的执行是通过反射来实现的)
         */
        //对
        animalProxy.run();  //实际上会执行拦截类(Proxy)中的(invoke方法)
        animalProxy.jump();
    }
} 

 以上实例其实不是很规范,当更容易理解动态代理的执行过程。相对规范的写法如下

Animal.java

public interface Animal {
    public void run();
    public void jump();
}  

Dog.java

1 public class Dog implements Animal{
2     public void run(){
3         System.out.println("小狗开始跑!");
4     }
5     public void jump(){
6         System.out.println("小狗开始跳!");
7     }
8 }

MyProxy.java

package com.yhs.aop.example;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * InvocationHandle接口的实现类的实例相当于一个拦截器,作用是拦截被代理(委托)对象中的方法
 *
 * @author Administrator
 *
 */

public class MyProxy  implements InvocationHandler{  

    private Object targetObject;
    /**
     * 通过该方法传入该拦截类需要拦截(绑定)的委托类对象
     *  * @param targetObject 委托对象
     */
    public void bind(Object targetObject){
        this.targetObject =targetObject;
    }
    /**
     * 返回一个代理类的实例
     * @param target
     * @return
     */
    public Object createProxyInstance() {
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                targetObject.getClass().getInterfaces(), this);
    }  

    /**
     * @param proxy:指被代理的对象。
     * @param method:要调用的方法
     * @param args:方法调用时所需要的参数
     */
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        //注入需要调用的方法
        command();
        //执行被代理对象的方法,如果方法有返回值则赋值给ret
        Object ret = method.invoke(targetObject, args);
        //注入需要调用的方法
        award();
        return ret;
    }  

    private void command() {
        System.out.println("驯兽师发出命令!");
    }
    private void award(){
        System.out.println("驯兽师给与奖励!");
    }
} 

Test.java

package com.yhs.aop.example;

import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {
        //(Animal)委托类对象
        Animal animal = new Dog();
        //产生一个拦截类对象(hander),该对象的作用是拦截委托类(animal)中的指定方法。
        MyProxy hander = new MyProxy();
        //确定(MyProxy)拦截类需要拦截(绑定)的对象(animal)
        hander.bind(animal);
        //产生委托类(animal)的代理的实例(animalProxy)
          Animal animalProxy = (Animal) hander.createProxyInstance();
        /**
         * 当用代理实例(animalProxy)调用委托类(Animal)里面的对应的方法时,会自动转到拦截类
         * (MyProxy)里从InvocationHander接口的实现方法invoke去执行(该方法的执行时通过反射来实现的)
         */
        //对
        animalProxy.run();
        animalProxy.jump();
    }
} 
时间: 2024-10-16 00:38:18

Spring 第一章的相关文章

第一章:spring mvc 的hello world -<蒋永录帮帮你>

一:web.xml配置 <!-- Spring MVC配置 --> <servlet> <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name&g

第一章 第一个spring boot程序

环境: jdk:1.8.0_73 maven:3.3.9 spring-boot:1.2.5.RELEASE(在pom.xml中指定了) 注意:关于spring-boot的支持, 最少使用jdk7(jdk6也可以,可能需要额外配置,没试过,官方推荐jdk8) maven至少使用3.2 1.首先进入一个文件夹,例如"~/Desktop/project",然后按照"第一章 企业项目开发--maven+springmvc+spring+mybatis+velocity整合"

第一章 spring核心概念

一.Spring作用:管理项目中各种业务Bean(service类.Dao类.Action类),实例化类,属性赋值 二.Spring IOC(Inversion of Control )控制反转,也被称为依赖注入(Dependency Injection[DI]),是面向对象编程 中的一种设计理念,用来减轻程序代码之间的耦合度. IOC原理:侧重原理 在业务代码中不使用我们之间司空见惯的关键字new来构建一个业务实例,而是在配置文件中.通过xml节点来告知容器如何对内存中构建的对应类型的对象名称

OSGi原理与最佳实践:第一章 OSGi框架简介(5)Spring-DM

OSGi原理与最佳实践:第一章 OSGi框架简介(5)Spring-DM 由  ValRay 发布 已被浏览8409次 共有3条评论 已被2个人收藏 2013-08-16 21:29 顶(1) 踩(0) osgi原理与最佳实践 1.3 Spring-DM 1.3.1 简介 Spring-DM 指的是 Spring Dynamic Modules.Spring-DM 的主要目的是能够方便地将 Spring 框架 和OSGi框架结合在一起,使得使用Spring的应用程序可以方便简单地部署在OSGi环

第一章:认识Yii

第一章:认识Yii 认识Yii 在过去几年中,框架迅速发展,几乎在Web应用开发中,每个人都会涉及到一个新生框架,Web开发框架会帮助你加快你的应用程序发布,你只需迅速的把你的想法在框架的白板上书写功能代码.随着Web应用的实现具有共同特征,现有的框架方案已经满足这些要求,在今天还有什么理由要从头开始你的下一个Web应用呢?今天的Web开发,除程序自身语言外,一个现代化.灵活的和可扩展的框架,几乎是一个至关重要的编程工具,此外,如果语言与框架两个部份有特别的互补性,结果是将一个非常强大的工具包:

《淘宝技术这十年》读书笔记——第一章 第二章

引言 ? ? 这本书的作者是子柳先生,子柳本名赵超,2004年加入淘宝网.历任开发工程师.项目经理.产品经理.测试经理,2009年随着淘宝系统的大规模重构和人才的迅速扩张,创办了"淘宝技术大学",因培养内外部工程师众多,人称"校长". ? ? 之所以读这本书,主要想了解淘宝的技术/业务发展过程中遇到过哪些问题,以及他们怎么解决的.在阅读的过程中有很多不懂的地方,主要是知识面确实涵盖的太广,就当拓展视野吧. ? ? 第一章 ? ? 淘宝架构初版 ? ? 淘宝的第一版源

2017.2.20 activiti实战--第一章--认识Activiti

学习资料:<Activiti实战> 第一章 认识Activiti 内容概览:讲解activiti的特点.接口概览.架构等基本信息. 1.3 Activiti的特点 1.使用mybatis 2.原生支持spring,可以轻松集成spring 3.引擎的Service接口 Activiti引擎提供了7大Service接口,均通过processEngine获取,支持链式API风格. Service接口 作用 RepositoryService 流程仓库服务,管理流程仓库,比如部署.删除.读取流程资源

第一章 Web MVC简介 —— SpringMVC

第一章 Web MVC简介 -- SpringMVC Web MVC简介 1.1.Web开发中的请求-响应模型: 在Web世界里,具体步骤如下: 1.  Web浏览器(如IE)发起请求,如访问http://sishuok.com 2.  Web服务器(如Tomcat)接收请求,处理请求(比如用户新增,则将把用户保存一下),最后产生响应(一般为html). 3.web服务器处理完成后,返回内容给web客户端(一般就是我们的浏览器),客户端对接收的内容进行处理(如web浏览器将会对接收到的html内

淘宝技术这十年 第一章 第二章

作者:子柳先生,本名赵超,2004年加入淘宝网,取花名子柳.历任开发工程师.项目经理.产品经理.测试经理,2009年随着淘宝系统的大规模重构和人才的迅速扩张,创办了"淘宝技术大学",培养内外部工程师众多,人称"校长". ? ? 这本书,主要想了解淘宝的技术/业务发展过程,遇到了哪些问题,怎么解决的.在阅读的过程中有很多不懂的地方,纯属拓展视野,的确如书中所说,不同阶段的读者会有不一样的收货,我也会不止一次的读下去的. ? ? 第一章 ? ? 淘宝的第一版源代码直接从