zoukankan      html  css  js  c++  java
  • 浅谈Java中的AOP面向切面的变成和控制反转IOC

    https://blog.csdn.net/hi_kevin/article/details/7325554

    https://www.cnblogs.com/zedosu/p/6632260.html

    Spring中的AOP之代理模式

    springAOP指的是在spring中的AOP,什么是AOP,相对于java中的面向对象(oop),在面向对象中一些公共的行为,像日志记录,权限验证等如果都使用面向对象来做,会在每个业务方法中都写上重复的代码,造成代码的冗余。
    而AOP指的是面向切面编程,定义一个切面,用切面去切相应的方法,就可以织入相关的逻辑。
    面向切面编程使用代理模式

    一、代理模式
    代理模式作为23种经典设计模式之一,其比较官方的定义为“为其他对象提供一种代理以控制对这个对象的访问”,简单点说就是,之前A类自己做一件事,在使用代理之后,A类不直接去做,而是由A类的代理类B来去做。代理类其实是在之前类的基础上做了一层封装。java中有静态代理、JDK动态代理、CGLib动态代理的方式。静态代理指的是代理类是在编译期就存在的,相反动态代理则是在程序运行期动态生成的,

    二、静态代理
    静态代理,简单点来说就是在程序运行之前,代理类和被代理类的关系已经确定。静态代理的实现方式一般有以下几个步骤,首先要定义一个公共的接口,供代理类和被代理类实现,如下

    public interface AnimalService {
    
            void eat();
            void talk();
        }
        
        
        public class DogServiceImlp implements AnimalService{
    
            @Override
            public void eat() {
                System.out.println("我爱吃骨头");
            }
    
            @Override
            public void talk() {
                System.out.println("汪----汪----汪-----");
            }
        }
        
        
        public class CatServiceImpl implements AnimalService{
    
            @Override
            public void eat() {
                System.out.println("我爱吃鱼");
            }
    
            @Override
            public void talk() {
                System.out.println("喵---喵---喵---");
            }
        }
    

    编写代理

    public class CatProxy implements AnimalService {
    
    
            private CatServiceImpl cat = new CatServiceImpl();
    
            @Override
            public void eat() {
                System.out.println("代理操作,开启事务");
                cat.eat();
                System.out.println("代理操作,关闭事务");
            }
    
    
            @Override
            public void talk() {
                System.out.println("代理操作,开启事务");
                cat.talk();
                System.out.println("代理操作,关闭事务");
    
            }
        }
    

      

    使用代理和不使用代理的调用方式

    @Test
        public void ttt() {
            CatServiceImpl cat = new CatServiceImpl();
            cat.eat();
            System.out.println("-------------------");
            cat.talk();
    
    
            AnimalService cat2 = new CatProxy();
            cat2.eat();
            System.out.println("-------------------");
            cat2.talk();
    
        }
    

    对比,使用静态代理和不使用静态代理,可以发现使用了代理之后,可以在被代理方法的执行前或后加入别的代码,实现诸如权限及日志的操作。

    但,静态代理也存在一定的问题,如果被代理方法很多,就要为每个方法进行代理,增加了代码维护的成本。有没有其他的方式可以减少代码的维护,那就是动态代理。

    三、JDK动态代理
    JDK提供了动态代理的方式,可以生成代理类,被代理类和接口沿用静态代理中的接口类和接口实现类,接口实现类为被代理类,下面看代理类,

      

      

  • 相关阅读:
    学习数据结构的网站
    线程的自动释放、挂起、运行
    centos7 odbc mysql
    c++和c不同
    Linux挂载u盘作为本地yum源安装gcc
    构建基于JAVASCRIPT的移动WEB CMS入门——简介(转载)
    数据库SQL优化大总结之 百万级数据库优化方案
    webgl 刷底色的基本步骤
    前端下载文件流并且获取heads中的filename文件名且解决中文乱码的方法
    Python little knowledge
  • 原文地址:https://www.cnblogs.com/qianjinyan/p/11139588.html
Copyright © 2011-2022 走看看