一、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、小结:

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

   

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


谢谢浏览 !

    

     

SpringAOP之静态代理的更多相关文章

  1. SpringAOP基础 - 静态代理设计模式

    代理模式在实现过程中,要创建一个接口(社交技巧-接口),代理类(经纪人 - 类)和真实类(范冰冰 - 类)同时实现这个接口. 举个例子: 我们想要找范冰冰吃饭,但是呢,她是大明星,不可能轻易见我们,我 ...

  2. SpringAOP用到了什么代理,以及动态代理与静态代理的区别

    spring aop (面向切面)常用于数据库事务中,使用了2种代理. jdk动态代理:对实现了接口的类生成代理对象.要使用jdk动态代理,要求类必须要实现接口. cglib代理:对类生成代理对象. ...

  3. Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC

    一.为什么需要代理模式 假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: package com.zhangguo.Spring041.aop01; public class Mat ...

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

    前言:    在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总找不到时间去找他,他也没办法.后来,房东想了一个办法,他找到 ...

  5. 动态代理的两种方式,以及区别(静态代理、JDK与CGLIB动态代理、AOP+IoC)

    Spring学习总结(二)——静态代理.JDK与CGLIB动态代理.AOP+IoC   目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用cg ...

  6. Spring AOP之静态代理

    软件151 李飞瑶 一.SpringAOP: ⒈AOP:Aspect Oriented Programming 面向切面编程, 实现的是核心业务和非核心业务之间的的分离,让核心类只做核心业务,代理类只 ...

  7. java 代理模式-静态代理与动态代理

    最近在研究SpringAOP,当然要学习AOP就要知道这么健硕.强大的功能的背后究竟隐藏着怎样不可告人的“秘密”?? 接下来就是查阅了许多资料详细的研究了一下Java的代理模式,感觉还是非常非常重要的 ...

  8. Spring -07 -AOP [面向切面编程] - 使用注解@+ AspectJ 方式实现环绕/前/后等通知 -超简洁 --静态代理/动态代理{JDK/cglib}

    1.spring 不会自动去寻找注解,必须告诉 spring 哪些包下的类中可能有注解;使用注解来取代配置文件.1.1 引入xmlns:context ,指定扫描范围 <context:comp ...

  9. spring——AOP(静态代理、动态代理、AOP)

    一.代理模式 代理模式的分类: 静态代理 动态代理 从租房子开始讲起:中介与房东有同一的目标在于租房 1.静态代理 静态代理角色分析: 抽象角色:一般使用接口或者抽象类来实现(这里为租房接口) pub ...

随机推荐

  1. python基础整理笔记(七)

    一. python的类属性与实例属性的注意点 class TestAtt(): aaa = 10 def main(): # case 1 obj1 = TestAtt() obj2 = TestAt ...

  2. iscroll5 上拉,下拉 加载数据

    我这里的思路是上拉时候只是加载第一页的内容,可根据实际情况修改其中的代码.请勿照搬.样式没怎么调,可以加载gif动画.1.没有数据时候,下拉可以加载数据.2.没有数据时候,点击也可以加载数据.3.其余 ...

  3. 使用printf输出各种格式的字符串( 转载)

    1. 原样输出字符串:    printf("%s", str); 2. 输出指定长度的字符串, 超长时不截断, 不足时右对齐:    printf("%Ns" ...

  4. mysql命令化操作实用小技巧

    ★1.问:如果我的mysql数据库服务器程序在D:\program files\phpstudy\mysql,里,那么我该怎么在cmd命令状态下使用它?      进入cmd状态后,系统默认在当前用户 ...

  5. mySQL中删除unique key的语法

    CREATE TABLE `good_booked` (  `auto_id` int(10) NOT NULL auto_increment,  `good_id` int(11) default ...

  6. 用Navicat Premium 远程连接oracle数据库

    1.安装Navicat Premium软件(我的是11.0.7版本)(假设安装路径为D:\NavicatLite\Navicat Premium) 2.下载 instantclient-basic-n ...

  7. sqlserver 读取xml 字符串方法

    declare @xml xml declare @propertyName varchar(50)  declare @str nvarchar(max)   set @propertyName = ...

  8. javascript的执行和预解析

    很久以前遇到过一个面试题目,的的确确是面试官问我的问题,下面是这个问题的代码部分.由于年少无知,没有回答上,被无情pass了. var u ='hello world'; ;(function(){ ...

  9. 《IO 系统性能》笔记

    近期项目中涉及和别人谈存储架构及选型,将IOPS相关的内容学习下.参考网上资料<IO 系统性能之一:衡量性能的几个指标> 1. 基本概念 1)读写IO操作:对应磁盘的存数据.取数据: 2) ...

  10. 如何用MediaCapture解决二维码扫描问题

    二维码扫描的实现,简单的来说可以分三步走:“成像”.“截图”与“识别”. UWP开发中,最常用的媒体工具非MediaCapture莫属了,下面就来简单介绍一下如何利用MediaCapture来实现扫描 ...