精华内容
下载资源
问答
  • 什么AOPAOP(Aspect-Oriented-Programing)面向切面编程,是一种编程理念。该理念能够是那些为多个业务所共有,却与业务逻辑没有关系的模块抽取出来,形成一个切面。这样可以减少重复代码,并使业务逻辑保持...

    什么是AOP?

    AOP(Aspect-Oriented-Programing)面向切面编程,是一种编程理念。该理念能够是那些为多个业务所共有,却与业务逻辑没有关系的模块抽取出来,形成一个切面。这样可以减少重复代码,并使业务逻辑保持简单,是代码易于维护和扩展。
    Spring中是怎么实现AOP的?
    Spring是通过JDK动态代理和CGLib(Code Generation Library)字节码生成技术,来实现AOP的,默认在对象存在接口时,使用JDK动态代理,否则使用CGLib。

    先看下静态代理

    在这里插入图片描述

    public class AopTest {
        public static void main(String[] args) {
            Student student=new Student("lily");
            student.speak();
        }
    }
    
    public interface IStudent {
        void speak();
    }
    
    public class Student implements IStudent{
        String name;
    
        public Student(String name) {
            this.name = name;
        }
    
        public void speak(){
            System.out.println("my name is "+name);
        }
    }
    

    执行main 方法得到

    my name is lily
    

    如果我们想在student对象speak之前都加一个句,“hello !”,怎么实现呢?
    可以使用代理模式,即新写一个类继承Istudent,然后传入student。

    public class StudentProxy implements Humen{
        Student student;
        public StudentProxy(Student student) {
        this.student=student;
        }
    
        @Override
        public void speak() {
            System.out.println("hello !");
            student.speak();
        }
    }
    
    public class AopTest {
        public static void main(String[] args) {
            Student student=new Student("lily");
            StudentProxy studentProxy=new StudentProxy(student);
            studentProxy.speak();
        }
    }
    

    执行得到:

    hello !
    my name is lily
    

    静态代理成功。

    如果有多个方法都要代理呢,那么我们就要在静态代理中写对应个数的代理方法。这很显然不够灵活。

    那么就引出了动态代理。

    public class DynamicProxy implements InvocationHandler {
        private Object object;
    
        public DynamicProxy(Object object) {
            this.object = object;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("hello !");
            Object result=method.invoke(object,args);
            return result;
        }
    }
    

    建立一个某功能的动态代理类,可以用来校验,或者记录日志,即我们常用的AOP功能。
    继承自InvocationHandler,并将想要增强的功能写在invoke重写方法里。

    使用

    public class AopTest {
        public static void main(String[] args) {
            Student student=new Student("lily");
            //使用动态代理类代理对象
            DynamicProxy dynamicProxy=new DynamicProxy(student);
            //使用该代理类
            IStudent student1=(IStudent) Proxy.newProxyInstance(IStudent.class.getClassLoader(),new Class[]{IStudent.class},dynamicProxy);
            student1.speak();
        }
    }
    

    结果:

    hello !
    my name is lily
    

    成功代理该对象。

    添加一个ask 方法

    public interface IStudent {
        void speak();
        void ask();
    }
    public class Student implements IStudent{
        String name;
    
        public Student(String name) {
            this.name = name;
        }
    
        public void speak(){
            System.out.println("my name is "+name);
        }
        public void ask(){
            System.out.println("who is "+name);
        }
    }
    

    调用:

    public class AopTest {
        public static void main(String[] args) {
            Student student=new Student("lily");
            //使用动态代理类代理对象
            DynamicProxy dynamicProxy=new DynamicProxy(student);
            //使用该代理类
            IStudent student1=(IStudent) Proxy.newProxyInstance(IStudent.class.getClassLoader(),new Class[]{IStudent.class},dynamicProxy);
            student1.speak();
            student.ask();
        }
    }
    

    结果:

    hello !
    my name is lily
    hello !
    who is lily
    

    ask方法也被代理了。

    使用动态代理的流程为:

    1.写动态代理类,继承自InvocationHandler 并重写invoke方法,在该方法中进行增强。
    2.通过代理类传入希望被代理对象,生成动态代理对象
    3.将动态代理对象传入Proxy静态方法newProxyInstance,得到已被代理的对象
    4.通过已被代理对象执行方法

    关于动态代理和CGLib应用的具体代码,见:这篇文章

    展开全文
  • AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程)。它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式。 在传统的业务处理代码中,通常都会进行事务处理、日志记录...

    AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程)。它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式。

    在传统的业务处理代码中,通常都会进行事务处理、日志记录等操作。虽然使用OOP可以通过组合或者继承的方式来达到代码的重用,但如果要实现某个功能(如日志记录),同样的代码仍然会分散到各个方法中。这样,如果想要关闭某个功能,或者对其进行修改,就必须要修改所有的相关方法。这不但增加了开发人员的工作量,而且提高了代码的出错率。

    为了解决这一问题,AOP思想随之产生。AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。这种采用横向抽取机制的方式,采用传统的OOP思想显然是无法办到的,因为OOP只能实现父子关系的纵向的重用。虽然AOP是一种新的编程思想,但却不是OOP的替代品,它只是OOP的延伸和补充。

    在AOP思想中,类与切面的关系如图1所示。
    AOP是什么
    图1 类与切面的关系

    从图1可以看出,通过Aspect(切面)分别在Class1和Class2的方法中加入了事务、日志、权限和异常等功能。

    AOP的使用,使开发人员在编写业务逻辑时可以专心于核心业务,而不用过多的关注于其他业务逻辑的实现,这不但提高了开发效率,而且增强了代码的可维护性。

    目前最流行的AOP框架有两个,分别为Spring AOP和AspectJ。Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期间通过代理方式向目标类织入增强的代码。AspectJ是一个基于Java语言的AOP框架,从Spring2.0开始,Spring AOP引入了对AspectJ的支持,AspectJ扩展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的织入。

    展开全文
  • Spring Aop到底有什么用处?

    千次阅读 2019-07-23 14:18:31
    假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如 但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。 ...

    假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如

    1

    但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。

    2

    但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。

    通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置插入这些功能。这样的思想,被称为面向切面编程,亦即AOP。

    3

    为了在指定位置执行这些横向的功能,需要知道指定的是什么地方

    4

    例如上图,方法级别的aop实现,在一个程序执行链条中,把method2称为切点,也就是说在method2执行时会执行横切的功能,那么是在method2之前还是之后呢,又是执行什么呢?这些都由advice(通知)来指定。advice有5种类型,分别是

    通知类型简介
    Before(前置通知)目标方法调用之前执行
    After(后置通知)目标方法调用之后执行
    After-returning(返回通知)目标方法执行成功后执行
    After-throwing(异常通知)目标方法抛出异常后执行
    Around(环绕通知)相当于合并了前置和后置

    把切点和通知合在一起就是切面了,一个切面指定了在何时何地执行何种方法。在spring aop中如此定义这个切面:

    @Aspect
    @Component
    public class UserAspect {
     
        @Before("execution(* com.aop.service.impl.UserServiceImpl.login(..))")
        public void loginLog(){
            System.out.println("user login");
        }
     
    }
    

    使用注解@Aspect将某个特定的类声明为切面,这样,该类下的方法就可以声明为横向的功能点后插入到指定位置。使用execution表达式声明在这个切点,格式如下 5

    第一个位置指定了方法的返回值,*号代表任意类型的返回值,然后是所在的类和方法名,*号同样代表任意,就是该类中任意的方法,在上一个例子中方法名是login,则是指定了该类中的login方法。然后最后一个参数是方法入参,因为java中支持重载,所以这个参数可以帮助你更精确的进行定位。两点表示任意参数类型。这样,execution表达式告诉了程序该在何地执行通知。而被诸如@Before注解修饰的方法就是通知的内容,也就是做什么。

    至此,我们就可以使用spring aop,但是还有两点需要得到注意

    1. 将切面类声明为一个bean
    2. 切点指定的方法所在的类也同样需由spring注入才能生效
    展开全文
  • https://blog.csdn.net/ljxzdn/article/details/79404353
    展开全文
  • 1分钟让你明白AOP什么及它的好处

    万次阅读 多人点赞 2018-02-28 19:58:52
    大家应该明白一个道理,所有广为人用的框架/技术等.... 记住这两条,然后我们来看看AOP到底是什么,以及在什么地方能够让我们少写代码?1.AOP什么?面向切面编程,能够让我们在不影响原有功能的前提下,为软件横向扩展 ...
  • 什么AOP 全称是 Aspect Oriented Programming 即:面向切面编程。是OOP的延续,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型。简单的说他就是把我们程序重复的代码抽取出来,在需要执行的时候使用...
  • 我们使用AOP好处

    万次阅读 2017-10-16 13:43:28
    我将从最基础的原始代码–>使用设计模式(装饰器模式与代理)–>使用AOP三个层次来讲解一下我们使用AOP好处
  • 什么AOP,AOP的优点是什么

    千次阅读 2018-08-08 14:06:33
    AOP(Aspect oriented Propramming)即面向切面编程,它的作用主要是改变了OOP(Object Oriented Programming)面向对象编程的不足。
  • Spring AOP什么

    千次阅读 2019-03-23 19:53:53
    文章目录什么是面向切面编程使用 AOP 简化代码AOP 如何大规模运作横切关注点什么是 Spring AOP?总结 虽然 AOP 不经常被讨论,但是它在 Spring 中有着广泛的应用。对你来说,也许是时候去熟悉 AOP 并让它为你所用了...
  • 对于AOP的简单理解 面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承、多态和封装。...这样做的好处是降低了代码的复杂程度,使类可重用。 但是人们也发现,在分散代
  • 利用AOP好处就是可以对业务逻辑进行隔离,降低耦合度,提高程序的可重用性,同时提高了开发的效率。开源的AOP不少,我这里用的KingAOP. 1 项目结构 2 定义一个日志记录的实体类User和LoggingAspect切面日志类 ...
  • 什么AOP切面编程

    2020-09-05 22:07:29
    AOP(Aspect Oriented Programming)称为面向切面编程,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,...
  • 有什么好处? ioc:Inversion of Control 控制反转 作用:对象的创建,初始化,分配,管理,销毁 都不由程序来做 而是交给spring容器来做 好处:写程序的时候,有时我们的需求发生改变,不修改源代码,配置文件...
  • 到底什么是 IoC 和 AOP,区别是什么?一文搞懂

    千次阅读 多人点赞 2020-05-28 16:31:33
    什么AOPAOP 解决了什么问题? AOP什么叫做切面编程? 首先声明:IoC & AOP 不是 Spring 提出来的,它们在 Spring 之前其实已经存在了,只不过当时更加偏向于理论。Spring 在技术层次将这两个思想进行...
  • AOP好处

    千次阅读 2018-09-13 19:54:05
    使用AOP三个层次来讲解一下我们使用AOP好处,希望这篇文章可以对大家有益。 原始代码的写法 既然要通过代码来演示,那必须要例子,这里我的例子为: 一个接口Daoinsert、delete、update三个方法,在...
  • springAOP什么?通俗易懂

    千次阅读 2018-11-24 10:47:04
    或者说面向对象有什么好处呢?我想大家也知道,无非就是编写出可维护,可扩展,可复用,灵活性好的代码,也就是为了少写代码而多写代码.但它一些弊端,OOP引入封装、继承和多态等概念来建立一种对象层次结构,是吧,也就是...
  • 什么要使用AOP

    千次阅读 2018-05-16 22:44:13
    什么要使用AOP每个技术的诞生都是为了解决问题的,而AOP是为了解决什么问题的呢?发现问题 假设我们要实现一个计算器功能,要求 - 能够实现基本的加减乘除计算功能 - 要求实现日志功能 实现上面的需求比较直接...
  • 什么AOP? 1.AOP概念介绍  所谓AOP就是面向切面编程。  功能: 让重复代码与核心业务分离! aop好处: 不用写几遍重复代码,写一次就够了。 开发者只需要关注核心业务; 运行时期,执行核心业务代码时候动态...
  • Spring AOP使用的好处

    千次阅读 2018-12-07 15:47:24
    1.通知自定义 2.切面获得返回值 3.解耦和 4.统一管理权限,统一管理异常抛出
  • AOP什么

    千次阅读 2018-06-25 14:14:23
    软件工程一个基本原则叫做“关注点分离”(Concern Separation),通俗的理解就是不同的问题交给不同的部分去解决,每部分专注于解决自己的问题。这年头互联网也天天强调要专注嘛!这其实也是一种“分治”或者...
  • 1. 1.问题: 代码混乱:越来越多的非业务需求(日志和验证等)加入后, 原有的业务方法急剧膨胀. 每个方法在处理核心逻辑的同时还必须兼顾其他多个关注点. 代码分散: 以日志需求为例, 只是为了... AOP(Aspect Ori...
  • AOP,全称Apect Oriented Programming,译为面向切面编程,简单的说它可以帮我们把程序中重复的代码抽取出去,在需要执行的时候,使用动态代理技术,在不修改源码的基础上,对我们已的方法进行增强。 AOP的作用及...
  • AOP什么? 2016年11月07日 10:29:17 软件工程一个基本原则叫做“关注点分离”(Concern Separation),通俗的理解就是不同的问题交给不同的部分去解决,每部分专注于解决自己的问题。这年头...
  • IoC与AOP

    2019-12-07 15:42:32
    IOC,DI和AOP全写的英文单词? 控制反转(IoC:...根据你的理解,讲讲什么是IOC,以及依赖注入带给我们的好处? 控制反转(依赖注入)就是对组件对象控制权的转移,从程序代码本身转移到了外部容器,通过容器...
  • 使用AOP三个层次来讲解一下我们使用AOP好处,希望这篇文章可以对大家有益。 原始代码的写法 既然要通过代码来演示,那必须要例子,这里我的例子为: 一个接口Daoinsert、delete、update三个方法,在...
  • 在xml中xmlns:xsi=...
  • 首先来说一下什么是ioc?ioc的定义是什么? Ioc IoC (Inversion of control )控制反转/反转控制。它是一种思想不是一个技术实现。描述的是:Java 开发领域对象的创建以及管理的问题。 例如:现有类 A 依赖于类 B ...
  • 什么是代理 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能 简单点说 就是在不修改...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,431
精华内容 16,572
关键字:

aop有什么好处