上期,我们看到有小伙伴留言说希望讲讲AOP

然后......

别激动,来得及

什么是AOP


AOP是Spring 框架的一个关键组件,全称为Aspect-OrientedProgramming(面向切面编程),目前已是一种比较成熟的编程方式。

AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在编译或运行的时候,再将这些代码应用到需要执行的地方。

注:提取出来的代码应用到需要执行的地方,并不会把源代码加到需要的地方执行,即源代码文件不会更改,但是它会影响最终的机器编译代码

意思就是,有一些通用功能的代码可以提取出来,然后在使用的时候应用进去就可以了,比如表单验证和日志记录等等

AOP术语


Aspect(切面)

通常指封装起来用于插入到指定位置实现某项功能的类

Join point(连接点)

在SpringAOP中,连接点指方法的调用

Pointcut(切入点)

切面与程序流程的交叉点,即那些需要处理的连接点,通常在程序中,切入点指的是类或者方法名

Advice(通知/增强处理)

就是程序实际运行之前或之后执行的方法,也就是AOP加入的代码

Target Object(目标对象)

即需要加入AOP代码的对象

Proxy(代理)

AOP框架动态生成的一个对象,该对象可以作为目标对象使用

Weaving(织入)

把切面连接到其它的应用程序类型或者对象上,并创建一个需要Advice对象的过程

看不懂就先往下看,关于术语等自己会了,自然就好理解多了

这时......

阿音过来知道了小知在学AOP

于是......

阿音非要展示一个关于AOP的小例子

UserDao接口

package com.aop.jdk;

public interface UserDao {

 public void addUser();

}

  

UserDaoImpl

package com.aop.jdk;

public class UserDaoImpl implements UserDao {

 @Override
public void addUser() { System.out.println("新增用户");
} }

JdkProxy

package com.aop.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import com.aop.aspect.MyAspect; /**
* JDK代理类
*/
public class JdkProxy implements InvocationHandler{ // 声明目标类接口
private UserDao userDao; // 创建代理方法
public Object createProxy(UserDao userDao) { this.userDao = userDao; // 1.类加载器
ClassLoader classLoader = JdkProxy.class.getClassLoader(); // 2.被代理对象实现的所有接口
@SuppressWarnings("rawtypes")
Class[] clazz = userDao.getClass().getInterfaces(); // 3.使用代理类,进行增强,返回的是代理后的对象
return Proxy.newProxyInstance(classLoader,clazz,this); } /*
* 所有动态代理类的方法调用,都会交由invoke()方法去处理
* proxy 被代理后的对象
* method 将要执行的方法
* args 执行方法时需要的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { // 声明切面
MyAspect myAspect = new MyAspect(); // 指定位置程序执行前执行这个方法
myAspect.start(); // 在目标类上调用方法
Object obj = method.invoke(userDao, args); // 指定位置程序执行结束后执行
myAspect.end(); return obj;
} }

  

MyAspect

package com.aop.aspect;

/**
* 切面
*/
public class MyAspect { public void start(){
System.out.println("模拟事务处理功能 ...");
} public void end(){
System.out.println("程序结束后执行此处 ...");
} }

  

JdkTest

测试结果项目编写完之后运行该类

package com.aop.test;

import com.aop.jdk.JdkProxy;
import com.aop.jdk.UserDao;
import com.aop.jdk.UserDaoImpl; public class JdkTest { public static void main(String[] args) { // 创建代理对象
JdkProxy jdkProxy = new JdkProxy();
// 创建目标对象
UserDao userDao= new UserDaoImpl();
// 从代理对象中获取增强后的目标对象
UserDao userDao1 = (UserDao) jdkProxy.createProxy(userDao);
// 执行方法
userDao1.addUser();
} }

  

运行之后,我们可以看到以下结果:

我们可以看到,在我们执行新增用户的方法时,依据我们AOP编程,系统自动执行了start方法和end方法

在实际运用中,我们可以把一些通用的方法放到start和end的位置,在需要的方法处加入切面即可

此外,建议大家再了解下AspectJ

AspectJ实现AOP有两种方式:一种是基于XML的声明式,另一种是基于注解的声明式

基于XML的声明式AspectJ要便捷一些,但是存在配置信息多的缺点

基于注解的声明式AspectJ则通过注解的方式减少了很多配置信息

漫画 | Spring AOP的更多相关文章

  1. 漫画 | Spring AOP的底层原理是什么?

    1.Spring中配置的bean是在什么时候实例化的? 2.描述一下Spring中的IOC.AOP和DI IOC和AOP是Spring的两大核心思想 3.谈谈IOC.AOP和DI在项目开发中的应用场景 ...

  2. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

  3. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  4. spring aop

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将 ...

  5. spring aop注解方式与xml方式配置

    注解方式 applicationContext.xml 加入下面配置 <!--Spring Aop 启用自动代理注解 --> <aop:aspectj-autoproxy proxy ...

  6. 基于Spring AOP的JDK动态代理和CGLIB代理

    一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...

  7. Spring AOP详解

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  8. Spring AOP实例——异常处理和记录程序执行时间

    实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...

  9. 从零开始学 Java - Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...

随机推荐

  1. 关于GROUP BY和聚合函数

    可以这样去理解group by和聚合函数 转自 http://www.cnblogs.com/wiseblog/articles/4475936.html 写在前面的话:用了好久group by,今天 ...

  2. Bs4 BeautifulSoup取值

    原文网址:https://blog.csdn.net/u010244522/article/details/79627073 从网页获取HTML数据后,获取对应标签.属性的值 取值方法主要有以下几种: ...

  3. 【五校联考3day2】C

    題意: 現有一平面直角坐標系,有n個點,每一個點必須向某一個方向發射射線,且任意一條射線必須與某一條坐標軸平行.定義一種發射射線的方案是合法的,則方案必須滿足: 1.沒有一條射線交叉 2.沒有一條射線 ...

  4. 跟着刚哥学习Spring框架--Spring容器(二)

    Spring容器 启动Spring容器(实例化容器) -- IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化(加载启动),这样才可以从容器中获取Bean的实例并使用.  Bean是S ...

  5. WebDriver高级应用实例(8)

    8.1使用Log4j在测试过程中打印日志 目的:在测试过程中,使用Log4j打印日志,用于监控和后续调试测试脚本 被测网页的网址: http://www.baidu.com 环境准备: (1)访问ht ...

  6. 前端代码质量保障之代码review

    经验丰富的程序员和一般程序员之间的最大区别,不仅体现在解决问题的能力上, 还体现在日常代码的风格上.掌握一门技术可能需要几月,甚至几周就够了. 好的习惯风格养成却需数年. 团队成员之间需要合作,代码需 ...

  7. Oracle 获取本周、本月、本季、本年的第一天和最后一天

    Oracle 获取本周.本月.本季.本年的第一天和最后一天 --本周 select trunc(sysdate, 'd') + 1 from dual; select trunc(sysdate, ' ...

  8. MVC3学习:Sql Server2005中时间类型DateTime的显示

    在Sql Server2005中,如果将某字段定义成日期时间类型DateTime,那么在视图中会默认显示成年月日时分秒的方式(如 2013/8/6 13:37:33) 如果只想显示成年月日形式,不要时 ...

  9. OpenShift Redhat 搭建NodeJS环境

    https://openshift.redhat.com/ OpenShift 是 redhat 公司推出的一个 PaaS 云计算应用平台,开发者可在上面构建.测试.部署和运行应用程序,它支持 Jav ...

  10. keepalived双机热备,安装部署文档

    keepalived双击热备,安装部署文档: 下载目录:/apps/keepalived-1.2.7.tar.gz 1:---> yum install -y make wget 2:---&g ...