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

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

                       

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

 

 


 

               谢谢浏览 !

     

 

 

 

 

     

转载于:https://www.cnblogs.com/demoMeng/p/5880909.html

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值