AOP

一、AOP概念

​ AOP即面向切面编程。我们先来理解下为什么会需要AOP?

​ 如果在编程时多个类中有重复出现的代码,那么我们就应该考虑将这些重复代码抽取出来定义成一个抽象类,这种情况我们称为纵向抽取。但是如果这些重复的代码是分散在各个业务逻辑中的,比如事务控制中有大量的try-catch-finally代码,这些重复代码嵌套在主要的业务逻辑代码中,我们用上面的方法就抽取不了,这时我们就可以通过横向切割的方式,把这些重复代码抽取到一个独立的模块中,在以后调用对应的业务逻辑方法时,又将这些重复代码横向切入进去。从而达到让业务逻辑类保持最初的单纯。

​ 我们用一个例子来说明。如下图:是一个对数据库进行操作的步骤:

​ 1、连接数据库

​ 2、执行SQL语句

​ 3、是否有异常,有就回滚事务,没有就提交事务

​ 4、关闭资源

​ 我们可以看到每次对数据库进行一次操作后,都会有如下的步骤,其中的1-3-4步骤都是重复的,而作为开发人员我们每次真正需要关心的只是步骤2的SQL语句执行(因为这在每个操作中是不一样的),而对于其他的我们则可以交由AOP去实现这些步骤,我们只需通过注解或者XML的配置来告诉AOP我们需要在那些类下的哪些方法中切入这些重复的代码,这样在编写代码时我们就只需关注核心逻辑代码,而在运行时AOP会对我们需要加入重复代码的方法进行拦截,并将这些重复代码切入进去。

​ 值得一提的是AOP并不是Spring框架特有的,Spring只是支持AOP编程的框架之一,且SpringAOP是一种基于方法拦截的AOP,也就是说Spring只能支持方法拦截的AOP。

二、AOP术语

1、切面(Aspect):切面由切点和增加(需要切入的代码、方法也叫通知)组成,它既包括了横切逻辑的定义,也包括了连接点的定义,SpringAOP就是将切面所定义的横切逻辑织入到切面所制定的连接点中。

2、增强、通知(Advice):是切面的方法,也就是一段需要切入到目标对象的代码。根据他在代理对象真实方法调用前、后和逻辑分为以下几种:

前置通知(before):在真实对象方法调用前执行

后置通知(after):在真实对象方法调用后执行

返回通知(afterReturning):在执行业务代码后无异常执行

异常通知(afterThrowing):在执行业务代码发送异常后执行

环绕通知(around):最强的通知,可以取代原对象方法。但使用也较复杂

3、切点(Pointcut):告诉SpringAOP在什么时候启动拦截并织入对应的流程中。

4、连接点(join point):连接点对应的是一个具体的方法,比如通过切点的正则表达式去判断那些方法是连接点。

5、织入(Weaving):织入就是将增强添加到目标具体连接点上的过程。

三、基于纯注解的AOP实现:

主要步骤:

​ 1、创建业务逻辑接口,实现接口

​ 2、创建切面,切面中包含切点和需要切入的方法

​ 3、创建AOP配置类,启动Aspectj自动代理、扫描bean、生成切面类

​ 4、测试AOP

1、创建一个接口 里面的方法就是我们的连接点,也就是我们需要拦截这个方法并将通知织入

package com.test.aop;public interface Student {void getName();
}

2、创建这个接口的实现

package com.test.aop;import org.springframework.stereotype.Component;@Component
public class StudentImpl implements Student {@Overridepublic void getName() {System.out.println("我叫唐鹏,我自豪");}
}

3、创建切面,并定义切点和逻辑方法

package com.test.aop;import org.aspectj.lang.annotation.*;@Aspect
public class TestAspect {@Pointcut("execution(* com.test.aop.*.getName(..))")public void pointCut(){}@Before("pointCut()")public void before(){System.out.println("=====前置:小么小么小二郎哟,背着书包上学堂咯");}@After("pointCut()")public void after(){System.out.println("=====后置:终于放学了!");}@AfterReturning("pointCut()")public void afterReturning(){System.out.println("=====返回:今天真呀真高兴");}@AfterThrowing("pointCut()")public void afterThrowing(){System.out.println("=====异常:oh 我考试考了0分,可不高兴");}
}

4、创建AOP配置类

package com.test.aop;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;//启用Aspectj自动代理
@EnableAspectJAutoProxy
//配置扫描的包  这是扫描bean的配置
@ComponentScan("com.test")
public class AopConfig {//生成切面类,自定义的类里面设置了切点@Beanpublic TestAspect getTestAspect(){return new TestAspect();}
}

5、测试AOP

package com.test.aop;import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class TestMain {public static void main(String[] args) {//因为是采用注解所以使用AnnotationConfigAopApplicationContext来实现ApplicationContext ac = new AnnotationConfigApplicationContext(AopConfig.class);Student tp = (Student) ac.getBean("studentImpl");tp.getName();}
}

6、结果打印

=====前置:小么小么小二郎哟,背着书包上学堂咯
我叫唐鹏,我自豪
=====后置:终于放学了!
=====返回:今天真呀真高兴

四、基于纯XML开发AOP的方式:

基本步骤:

​ 1、同样先创建接口和接口实现类

​ 2、创建切面类和切入方法,因为是采用XML的方式,所以这里不需要指明他是个切面类,也不需要指定切入方法对应的切入点。,只需要生成对应的方法和方法代码即可。

​ 3、创建spirng配置文件

​ 4、测试

1、接口和实现同上,这里就不在给出。(注意如果是在不同包下使用相同类名,注意包的引用)

2、编写切面类

package com.test.aopXml;public class TestAspect {public void before(){System.out.println("=====XML前置:小么小么小二郎哟,背着书包上学堂咯");}public void after(){System.out.println("=====XML后置:终于放学了!");}public void afterReturning(){System.out.println("=====XML返回:今天真呀真高兴");}public void afterThrowing(){System.out.println("=====XML异常:oh 我考试考了0分,可不高兴");}}

3、spring的配置文件applicationContext.xml 注意放在resources源码文件下面

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><bean id ="student" class="com.test.aopXml.StudentImpl"/><bean id ="testAspect" class="com.test.aopXml.TestAspect"/><!--aop配置--><aop:config ><!--定义切面,和切点配置--><aop:aspect ref="testAspect"><!--定义需要重复使用的切点--><aop:pointcut id="pointCut" expression="execution(* com.test.aopXml.StudentImpl.*(..))"/><!--定义切点,method是指切面类中对应的方法名--><aop:before method="before" pointcut-ref="pointCut"/><aop:after method="after" pointcut-ref="pointCut"/><aop:after-returning method="afterReturning" pointcut-ref="pointCut"/><aop:after-throwing method="afterThrowing" pointcut-ref="pointCut"/></aop:aspect></aop:config></beans>

4、测试

package com.test.aopXml;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestMain {public static void main(String[] args) {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");Student student = (Student) ac.getBean("student");student.getName();}
}

5、测试结果

=====XML前置:小么小么小二郎哟,背着书包上学堂咯
我叫唐鹏,我自豪
=====XML后置:终于放学了!
=====XML返回:今天真呀真高兴

五、注解和XML混合开发的方式

注解和XML混合使用:切点信息定义在切面类,xml中只需要开启对aspectj自动代理和配置扫描就好

步骤如下:

​ 1、同样给出接口和实现类

​ 2、编写切面类,切面类需要加入容器,让ioc管理

​ 3、配置applicationContext1.xml文件

​ 4、测试

1、接口和实现同上

2、编写切面类,这里切面类加上了@Component注解 而在使用纯注解时是没有加上的

package com.test.aop;import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Component
@Aspect
public class TestAspect {@Pointcut("execution(* com.test.aop.*.getName(..))")public void pointCut(){}@Before("pointCut()")public void before(){System.out.println("=====混合前置:小么小么小二郎哟,背着书包上学堂咯");}@After("pointCut()")public void after(){System.out.println("=====混合后置:终于放学了!");}@AfterReturning("pointCut()")public void afterReturning(){System.out.println("=====混合返回:今天真呀真高兴");}@AfterThrowing("pointCut()")public void afterThrowing(){System.out.println("=====混合异常:oh 我考试考了0分,可不高兴");}
}

3、applicationContext1.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!--此配置是为了让spring知道我们配置了切面,让他扫描bean的时候注意到切面类--><aop:aspectj-autoproxy/><!--扫描bean--><context:component-scan base-package="com.test.aop"/></beans>

4、测试

package com.test.aop;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestMain {public static void main(String[] args) {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext1.xml");Student student = (Student) ac.getBean("studentImpl");student.getName();}
}

5、测试结果

=====混合前置:小么小么小二郎哟,背着书包上学堂咯
我叫唐鹏,我自豪
=====混合后置:终于放学了!
=====混合返回:今天真呀真高兴

AOP的理解以及实现相关推荐

  1. IOC和AOP概念理解

    IOC和AOP概念理解总结: IOC:控制反转 是一种降低对象之间耦合关系的设计思想,面试的时候最好能说出来个例子,加深理解.例子:租房子,以前租房子需要一个房子一个房子找,费时费力,然后现在加入一个 ...

  2. Spring框架:谈谈对IOC和AOP的理解

    在java面试中,如果我们被问及Spring框架的相关问题,那么一定避不开对Spring中的IOC和AOP的理解和使用,本文就简单谈论对于Spring中IOC和AOP的理解. 一.IOC的理解 1.1 ...

  3. SpringIOC 和AOP 的理解

    SpringIOC 和AOP 的理解 IOC(含义.举例.作用):控制反转,是一种设计思想,将原本需要自己手动创建的对象交由Spring框架来管理.(对象A需要对象B,原本是需要A自己创建对象B,现在 ...

  4. spring框架AOP的理解,程序高类聚的体现

    本文主要介绍AOP思想,而不是Spring,Spring在本文只做为理解AOP的工具和例子,所以也不打算介绍Spring的Aspect.Join point.Advice.AOP proxy等概念,那 ...

  5. 对IOC,AOP的理解

    (1)  ioc,意思是Inversion of control,(反转控制),控制反转,就是交换控制权的意思.现在一般不使用这个词,一般使用dependency injection(依赖注入).依赖 ...

  6. Spring AOP概念理解 (通俗易懂)【转】

    1.我所知道的aop 初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下子让你不知所措,心想着:怪不得很多人都和我说aop多难多难.当我看进去以后 ...

  7. Spring的IoC与AOP的理解

    1.Spring它到底是什么? Spring是一个开源的Java应用程序开发框架,为了解决企业应用开发的复杂性而创建的.   在spring中,它会认为一切Java类都是资源,而资源就是Bean,容纳 ...

  8. springIOC和AOP的理解

    Spring的IOC理解 1.IOC 控制反转,是指创建对象的控制权转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到spring容器中,并由容器根据配置文件去创建实例和管理各个实例 ...

  9. 谈谈自己对Spring中IOC和AOP的理解

    Spring框架的核心思想主要是IOC和AOP的思想 IOC IOC概念 Spring中的IOC AOP AOP概念 百度百科的解释 个人理解 AOP思想 IOC IOC概念 所谓IOC即 Inver ...

最新文章

  1. 英雄难过棍子关html游戏开发,《英雄难过棍子关》评测:看我变长再变长!
  2. egg前面加什么_跟 egg 有关的英语多半是贬义,goose egg 也八九不离十
  3. 【CyberSecurityLearning 34】Linux脚本编写(Shell脚本)
  4. Nginx 负载均衡4种模式
  5. 实例61:python
  6. Pick!闲鱼亿级商品库中的秒级实时选品
  7. springboot细节挖掘(知识积累)
  8. [转]vb高效编程(优化)
  9. ear的英语怎么念_Dog是“狗”,ear是“耳朵”,Dog ear真不是“狗耳朵”
  10. c++ 之 关键字--explicit
  11. springboot 自定义webroot的目录
  12. 相机视场角和焦距_相机视场角估计
  13. QQ抢车位游戏PhysicalDataModel
  14. arcgis绘核密度分布图
  15. 计算机主机版最重要的部件,电脑配件中到底哪个最为重要
  16. 台式机内存和服务器内存型号,台式机内存和服务器内存区分
  17. PhotoShop入门(第一个案例)
  18. 加密与解密第三版光盘ISO资料
  19. android平台如何实现b s模式,基于B/S架构的Android手机管理系统的设计与实现
  20. php 心电图,用canvas画心电图的示例代码

热门文章

  1. 怎样办理微信公众平台迁移公证?
  2. 国家标准《信息技术 人工智能 知识图谱技术框架》第三次编辑会成功召开
  3. Page Peel View
  4. [源码阅读]VDO-SLAM笔记[1] Track()中动态obj部分
  5. 『正睿OI 2019SC Day3』
  6. 第一个PWA程序-聊天室
  7. 患癌女孩冯莹的爱情梦想
  8. C语言中extern的作用
  9. 现代人的困扰,“高刺激”的诱惑
  10. 阿里云服务器实现 frp 内网穿透