初学AOP小结
Spring AOP理解
AOP简介
AOP(面向切面编程),可以说时OOP的补充,使用OOP时,我们在日常编写代码的时候,一旦牵涉到大型一点的项目,项目不可或缺的事务处理,安全处理,验证处理。。。等等大量与我们业务核心逻辑无关的但是又需要的代码这里称之为——共生代码,这个时候单纯使用OOP已经开始有点力不从心了,更何况我们项目日后还要升级、扩展,在源码上扩展大量代码也不现实,所以这就是我们学习AOP的原因。
AOP把软件分为两类:核心关注点(主业务代码)和横切关注点(共生代码),将代码分离和组织就是咱们AOP的职责!
我们都知道OOP编写程序是纵向的,而AOP在此基础上横切业务逻辑代码,并且将共生代码织入切点中并无痕迹的恢复程序原本的结构,这个过程就是AOP对两类代码的组织,并没有对原生代码进行修改,就实现了功能的扩展,说明AOP是没有入侵原生代码的。这样一来对AOP功能有点理解了,而共生代码在上面有介绍,学习AOP术语,我们就显得有点入门的感觉了。
AOP术语
- 通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理。
- 连接点(join point): 连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,连接点总是方法的调用。
- 切点(PointCut): 可以插入增强处理的连接点。
- 切面(Aspect): 切面是通知和切点的结合。
- 引入(Introduction):引入允许我们向现有的类添加新的方法或者属性。
- 织入(Weaving): 将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。
概念看起来总是有点懵,并且上述术语,不同的参考书籍上翻译还不一样,所以需要慢慢在应用中理解。
AOP实现
原生代码(核心关注点)TestB:
public class TestB implements C{
@Override
public void add() {
System.out.println("我是TestB的原生代码!");
}
}
共生代码(横切关注点)MyAspect:
public class MyAspect {
//前置通知
public void before(){
System.out.println("我是Before!!!!");
}
//后置通知
public void after(){
System.out.println("我是After!!!!");
}
}
Spring配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置A对象 -->
<bean id="a" class="com.lyl.pojo.TestB"/>
<!-- 配置Aspect 切面类,里面包含了通知 -->
<bean id="aspect" class="com.lyl.schemaAop.MyAspect"/>
<!-- 配置SpringAop组装规则 -->
<aop:config>
<!-- 指明要进行功能扩展(切点)的方法,此处要扩展TestB的add()方法 -->
<aop:pointcut id="point" expression="execution(* com.lyl.pojo.TestB.add(..))"/>
<!-- 切面类的组装 -->
<aop:aspect id="at" ref="aspect">
<!-- method:通知的方法;pointcut-ref:需要组织的目标切点 -->
<!-- 前置通知 -->
<aop:before method="before" pointcut-ref="point"/>
<!-- 后置通知 -->
<aop:after method="after" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
</beans>
结果:
我是Before!!!!
我是TestB的原生代码!
我是After!!!!
AOP小结
从上面的SpringAOP简单实现可以看出,我们AOP的特点:
- AOP的扩展没有入侵原生代码
- OOP纵向,AOP横向,需要增强的原生代码的叫切点,增强过程叫织入
- 我们程序员主要关注的是核心关注点,而AOP关注的是横切关注点,并将其织入我们的核心关注点。
我们需要注意的是:
- AOP并不是一个框架,而是一种设计模式
- AOP最终的作用是松偶、解决代码重用、方便功能扩展,降低程序的复杂度和耦合度,提高开发效率。
- 在AOP中,我们将这些具有公共逻辑的,与其他模块的核心逻辑纠缠在一起的行为称为“横切关注点(Crosscutting Concern)”,因为它跨越了给定编程模型(纵向模型)中的典型职责界限。
随着日后的学习和实践,对于AOP的理解也会越来越深。
初学AOP小结的更多相关文章
- 初学AOP
src\dayday\Count.java package dayday;import org.springframework.stereotype.Component;/** * Created b ...
- Spring AOP小结
一. AOP介绍 AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP ...
- AOP小结
AOP主要采用代理模式来实现的,静态代理(设计模式中的代理模式),动态代理(反射机制,实现InvocationHandler接口),cglib实现(采用继承方式,针对目标类生成子类,并覆盖方法进行增强 ...
- Spring 实践 -AOP
Spring 实践 标签: Java与设计模式 AOP引介 AOP(Aspect Oriented Programing)面向切面编程采用横向抽取机制,以取代传统的纵向继承体系的重复性代码(如性能监控 ...
- spring boot 从开发到上线(三)—AOP 异常监控、上报
在做这个项目的期间,看到一篇很有启发性的文章<程序员你为什么这么累>.对于初级程序员来说,拿到需求,第一反应是用什么技术来尽快的完成任务,这本身并没有问题.但长此以往,不仅被需求的更改搞得 ...
- Spring入门篇——第5章 Spring AOP基本概念
第5章 Spring AOP基本概念 本章介绍Spring中AOP的基本概念和应用. 5-1 AOP基本概念及特点 5-2 配置切面aspect ref:引用另外一个Bean 5-3 配置切入点Poi ...
- Spring之IOC、AOP和事务
IOC 什么是IOC?如果你回答:Spring是个IOC容器,实现原理是反射,没了.这样证明你没有真正理解IOC. IOC的意思是控制反转,还有个外号叫依赖注入(DI).为什么起这么晦涩难懂的名字呢? ...
- Spring(3):AOP面向切面编程
一,AOP介绍 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开 ...
- 【Spring Framework】Spring入门教程(六)Spring AOP使用
Spring的AOP 动态代理模式的缺陷是: 实现类必须要实现接口 -JDK动态代理 无法通过规则制定拦截无需功能增强的方法. Spring-AOP主要弥补了第二个不足,通过规则设置来拦截方法,并对方 ...
随机推荐
- Android中的一些小细节
在代码中获取到的padding .margin.getWidth.event.getX.context.getResources().getDimensionPixelSize(R.dimen.key ...
- LAMP介绍以及Apache安装
一.LAMP架构介绍 1.1 LAMP概述 LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境.LAMP是一个缩写词,具体包 ...
- XCTF-ics-07(floatval函数特性+Linux目录结构特性)
直接进入到项目管理页面,给了三段源码. 第一段 <?php session_start(); if (!isset($_GET[page])) { show_source(__FILE__); ...
- CSS Flex布局完全指南 #flight.Archives002
Title/CSS Flex布局完全指南 #flight.Archives002 序(from Ruanyf) : 网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模 ...
- springboot上传文件路径存放
@Beanpublic EmbeddedServletContainerCustomizer embeddedServletContainerCustomizer() { return (Config ...
- 初识MySQL,关系型数据库&非关系型数据库
初识MySQL,关系型数据库&非关系型数据库 数据库的分类: 关系型数据库:(SQL) MySQL,Oracle,Sql Server,DB2,SQLlite 通过表和表之间,行和列之间的关系 ...
- 特殊回文数 BASIC-9
特殊回文数 代码 import java.util.Scanner; /*123321是一个非常特殊的数,它从左边读和从右边读是一样的. 输入一个正整数n, 编程求所有这样的五位和六位十进制数, 满足 ...
- ElasticSearch版本控制--java实现
一.前言 最近工作中有这样一个ElasticSearch(以下简称ES)写入的场景,Flink处理完数据实时写入ES.现在需要将一批历史数据通过Flink加载到到ES,有两个点需要保证: 对于历史数据 ...
- MyBatis学习04(注解开发)
7.使用注解开发 7.1 面向接口编程 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好 在一个面 ...
- Supervisord远程命令执行漏洞(CVE-2017-11610)复现
Supervisord远程命令执行漏洞(CVE-2017-11610)复现 文章首发在安全客 https://www.anquanke.com/post/id/225451 写在前面 因为工作中遇到了 ...