初学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主要弥补了第二个不足,通过规则设置来拦截方法,并对方 ...
随机推荐
- pointnet.pytorch代码解析
pointnet.pytorch代码解析 代码运行 Training cd utils python train_classification.py --dataset <dataset pat ...
- JVM学习笔记-第六章-类文件结构
JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...
- Java基础技术多线程与并发面试【笔记】
Java基础技术多线程与并发 什么是线程死锁? 死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去,我们就可以称 ...
- SpringBoot开发五-社区首页开发
需求介绍-社区首页 根据之前的学习,我们一般都是先按照DAO->Service->Controller这个顺序去开发 分布实现: 开发社区首页,显示前十个帖子. 开发分页组件,分页显示所有 ...
- nohup 启动命令
start.sh #!/bin/bash nohup $PWD/node_exporter > /dev/null 2>&1 &
- 尝试通过 JDBC 将 UTF-8 插入 MySQL 时出现“乱码”
这是我的连接设置方式: Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true& ...
- 为什么网络损伤仪WANsim中没有流量通过
在使用网络损伤仪 WANsim 的过程中,有时候发现网损仪中没有流量通过.有些小伙伴可能会想:自己所有配置都是正确的 ,为什么会没有流量通过呢? 有可能,是你忽略了一些东西. 下面,我总结了一些导致网 ...
- JavaWeb学习笔记(五)
本文内容 1. JSP: 1. 指令 2. 注释 3. 内置对象 2. MVC开发模式 3. EL表达式 4. JSTL标签 5. 三层架构 JSP: 1. 指令 * 作用:用于配置JSP页面,导入资 ...
- Python使用flask架构、跨域
from flask import Flask import json from flask_cors import CORS Server = Flask(__name__) cors = CORS ...
- C#设计模式---单例模式(Singleton Pattern)
一.定义 从"单例"字面意思上理解为一个类只有一个实例.官方定义:确保一个类只有一个实例,并提供一个全局访问点. 二.实现 下面以实现一个日志记录类为例,描述单例模式. 1 usi ...