SpringAOP之静态代理

一、SpringAOP:

   

   ⒈AOP:Aspect Oriented Programming 面向切面编程, 实现的是核心业务和非核心业务之间的的分离,让核心类只做核心业务,代理类只做非核心业务。

    目的:  

      ⑴、把核心业务和非核心业务进行分离    

       ⑵、把多个非核心业务处理(点)变成一个切面(之前的非核心业务代码需要写多次变成只需要写一次。)

   ⒊要求:只有当核心类中有多个业务需要进行处理的时候使用AOP较为合理,如果只有一个业务需要被处理那么就没有必要使用AOP了。

二、静态代理:

   1、需要知道核心类(被代理类)是哪一个类,并且有什么方法。 

   2、非核心的代码需要重复写多次,显得代码的结构臃肿,形成代码冗余。

   3、非核心类(代理类)需要实现核心类(被代理类)实现的接口,也就是他们需要实现共同的接口,但是以核心类实现的接口(被代理类)为准。

三、动态代理:

   1、不需要知道核心类(被代理类)具体是什么类。

   2、非核心类(代理类)需要实现InvocationHandler接口。   

四、静态代理示例:

    1、业务介绍:

      假定高三学生为核心类,学生的家人是代理类。高三学生需要做的核心业务有:在家学习(studyAtHome)、在学校学习(studyAtHome);家人需要做的非核心业务为:准备饭菜(买、洗、炒、煮饭)。准备补品(购买、熬制、加佐料)。

    2、具体代码:

      ⑴、创建一个高三学生的接口:G3Student

        

package aop_001;

//首先定义一个接口,用来高三学生来是实现,
//在这个接口中声明一个在家学习和一个在学校学习的方法
public interface G3Student {

    public void studyAtHome(String core);
    public void studyAtSchool(String core);

}

  

       ⑵、创建一个高三学生实现类:G3Student_boy,并且这个类实现高三学生接口(G3Student)

  

package aop_001;

//定义一个高三男孩的类(目标对象、核心对象、target对象),实现了高三学生的接口。
public class G3Student_boy implements G3Student {

    //高三男孩 的第一个业务流程:在家学习
    public void studyAtHome(String core) {
       //核心的事情在家学习。
        System.out.println(core+"在HOME学习");

    }

    //高三男孩 的第二个业务流程:在学校学习
    public void studyAtSchool(String core) {
       //核心的事情在家学习。
        System.out.println(core+"在SCHOOOL学习");

    }

}

     

        ⑶、创建一个高三学生的代理类:G3Student_proxy,并且实现了高三学生接口:G3Student。红色字体需要理解

package aop_001;
/*
*    代理对象(G3Student_proxy)的目的是帮助核心对象(G3Student_boy / G3Student_girl)做非核心的事情。
*    但是代理对象(G3Student_proxy)必须和核心对象(G3Student_boy / G3Student_girl)实现共同的接口。
*/
public class G3Student_proxy implements G3Student {

    //定义一个高三学生接口 作为属性,目的是就是在处理完代理需要做的事情之后调用高三男孩或者是高三女孩需要做的核心业务,
    //但是不是代理具体去做这些核心的事情,只是调用它们而已。
    private G3Student G3S;

    //创建一个代理的参数为 高三学生接口 的构造函数,判断但传入的字符串为boy就构造一个高三男孩的实例,如果传入的参数为girl就构造一个高三女孩的实例。
    public G3Student_proxy(String sex) {
        if("boy".equals(sex)){
            G3S = new G3Student_boy();
        }else if("girl".equals(sex)){
            G3S = new G3Student_girl();
        }
    }
    public void studyAtHome(String core){

        //这个是代理(G3Student_proxy)准备饭菜的需要做的流程:
        System.out.println("代理:准备买菜");
        System.out.println("代理:准备洗菜");
        System.out.println("代理:准备炒菜");
        System.out.println("代理:准备煮饭");
        System.out.println("-----------------");  

        //通过定义的属性,并且在调用G3Student_proxy的含参数的构造函数创建相对应的实例,调用这个具体的实例的方法
        G3S.studyAtHome(core);
     //这个是代理(G3Student_proxy)准备补品的需要做的流程:
        System.out.println("-----------------");
        System.out.println("代理 :购买补品");
        System.out.println("代理 :熬制部品");
        System.out.println("代理 :加入佐料");
        System.out.println();

    }

    public void studyAtSchool(String core) {

        //这个是代理准备(G3Student_proxy)饭菜的需要做的流程:
        System.out.println("代理:准备买菜");
        System.out.println("代理:准备洗菜");
        System.out.println("代理:准备炒菜");
        System.out.println("代理:准备煮饭");
        System.out.println("-----------------");

        //通过定义的属性,并且在调用G3Student_proxy的含参数的构造函数创建相对应的实例,调用这个具体的实例的方法
        G3S.studyAtSchool(core);
        System.out.println("-----------------");
        //这个是代理(G3Student_proxy)准备补品的需要做的流程:
        System.out.println("代理 :购买补品");
        System.out.println("代理 :熬制部品");
        System.out.println("代理 :加入佐料");
        System.out.println();

    }
}

        

        ⑷、进行测试:定义一个测试类 Test

package aop_001;

public class Test {

    public static void main(String[] args) {

        //创建一个代理对象,并且传入相对应的参数构造出具体的实例
        G3Student b = new G3Student_proxy("boy");
        //通过这个代理对象执行相关的方法(代理对象和核心对象有共同接口)
        b.studyAtHome("小明");
        b.studyAtSchool("小明");

    }

}

        测试结果:

                               

   3、小结:

      由上面的例子我们可以简单模拟一个静态代理的实例,但是我们发现,这个代理做的事情会因为核心对象业务多而变得多起来,而且这些代理做的事情都是相同的没有变化的:

   

      并且,如果我们要修改这些流程中的某一个流程的时候会发现要改多处,而且都是相同的代码,所以这个时候使用动态代理就可以轻松解决这个问题。



谢谢浏览 !

    

     

时间: 2024-08-01 21:03:12

SpringAOP之静态代理的相关文章

SpringAOP - 静态代理实践(下)

说明 昨天进行了两个方法的静态代理(方法抽象),那么更多方法的静态代理会是怎样呢 现在我们在昨天实践的基础上再进行一次静态代理,昨日实践链接: Spring AOP - 静态代理实践 今日对应目录,所有操作对应以下操作进行: 下面我们开始今天的实践~ 一.xml中配置全注解 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org

Java静态代理与动态代理模式的实现

前言:    在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总没有时间见面,他也没办法.后来,房东想了一个办法,他找到了一个人代替自己和小王洽谈,房东本人不用出面,他只要把他的对房客的要求告诉他找的那个人,那个人和你商量就可以了,这样就可以完成租房这件事了.这种现实场景比比皆是,所呈现出来的其实就是代理模式的原型的一种.我们把焦点转向编程,你是否在编程中经常遇见这样一个问题,对于访问某个对象,我们希望给它的方法前加入一

侃侃静态代理和动态代理

前言: 在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总没有时间见面,他也没办法.后来,房东想了一个办法,他找到了一个人代替自己和小王洽谈,房东本人不用出面,他只要把他的对房客的要求告诉他找的那个人,那个人和你商量就可以了,这样就可以完成租房这件事了.这种现实场景比比皆是,所呈现出来的其实就是代理模式的原型的一种.我们把焦点转向编程,你是否在编程中经常遇见这样一个问题,对于访问某个对象,我们希望给它的方法前加入一个标记

AOP、静态代理、JDK动态代理、CGLIB动态代理、Spring实现AOP、IOC+AOP

一.为什么需要代理模式 假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: 1 package com.zhangguo.Spring041.aop01; 2 3 public class Math { 4 //加 5 public int add(int n1,int n2){ 6 int result=n1+n2; 7 System.out.println(n1+"+"+n2+"="+result); 8 return result; 9 } 1

Spring静态代理与动态代理

代理模式 1.什么是代理模式? 真实生活中有一种房屋中介是这样的,租客根本就不知道房东是谁,一切签合同.交租金.交钥匙等操作都直接和中介公司发生.我们把这种模式称之为代理模式. 代理模式:客户端直接使用的都是代理对象,不知道目标对象是谁,此时代理对象可以在客户端和目标对象之间起到中介的作用. 2.特点 代理对象完全包含目标对象,客户端使用的都是代理对象的方法,和目标对象没有直接关系 3.职责 把不是目标对象该做的事情从目标对象上撇开——职责清晰. 4.分类 静态代理:在程序运行前就已经存在代理类

Spring框架静态代理和动态代理

1.域属性注入 创建实体类Student package com.spring.entity; public class Student { //普通属性 private Integer id; private String name; //域属性 private Car car; public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public Integer getId() {

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

SpringAop_静态代理模式

package com.spring.proxy; public interface PersonDao { public void savePerson(); } package com.spring.proxy; public class PersonDaoImpl implements PersonDao { @Override public void savePerson() { System.out.println("save person"); } } package co

静态代理和动态代理

所谓的代理设计就是指由一个代理主题来操作真实主题,真实主题运行详细的业务操作.而代理主题负责其它相关业务的处理. 系统中常常有这样的需求:在某些操作前须要进行验证操作,比方:在加入/删除操作时,先进性用户信息验证,确认该用户是否拥有这些操作的权限.代码例如以下: //UserManager接口: public interface UserManager { public void addUser(String username, String password); public void del