AOP技术个人认为是能够完善(改善)面向对象编程OOP。为什么这么说,我们得先从AOP的概念说起,然后通过一段简单的例子加以佐证。这样子大家就可以慢慢地了解AOP

1. AOP概念

  • AOP为Aspect Oriented Programming的缩写,含义:面向切面的编程。

2. AOP主要作用是什么,为什么要提出AOP概念,AOP技术到底能用到哪些实际的开发场景里面去

  • AOP技术主要的用做在日志记录,性能统计,安全控制,事务处理,异常处理等等
  • 例如日志功能,日志代码往往横向地散布在所有对象层次中。而这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用
  • AOP技术恰恰相反,它利用一种称为"横切"的技术,将公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面
  • 所谓"切面",简单说就是那些与业务无关,但是所有业务模块都要用到的公共代码,我们就把这些功能类似的公共代码封装成一个Java类,这个Java类也就叫做"切面"
  • 有了AOP这种技术,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

3. AOP核心概念

  • 切面,Aspect:其实就是我们需要定义的AOP类,它对功能类似的代码进行封装。例如:日志类,安全控制类,事务管理类等
  • 关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
  • 连接点,Join Point:程序执行过程中的某一点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法
  • 切入点,Pointcut:一系列连接点的集合,对连接点进行拦截的定义
  • 通知(建议,Advice):AOP框架在特定的连接点上执行的动作(代码),通知分为前置、后置、异常、最终、环绕通知五类
  • 目标对象,Target object:要被代理的对象
  • 织入(weave):将切面应用到目标对象并导致代理对象创建的过程
  • 引入,Introduction:简单说就是AOP中的方法

4. Spring创建代理的规则有两种

  • 默认使用JDK动态代理,为任何接口实例创建代理
  • 类代理,当需要代理一个类而不是接口的时候,Spring会采用CGLIB方式完成

5. Spring AOP的代码实现步骤

  • 定义切面,即AOP类
  • 定义通知
  • 定义切入点语法

6. 下面我就来完成一个demo来实现一个基础的Spring AOP(简单的日志记录例子),这里我们采用注解的方式来实现。后面我们也给介绍基于XML文件配置的AOP

  • 创建AOP类
package com.spring.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component; @Aspect
public class LogAop { @Before("execution(public void com.spring.dao.impl.StudentDaoImpl.*(..))")
public void logBefore() {
System.out.println("方法执行之前加载日志");
}
}
  • 创建一个StudentDao接口
package com.spring.dao;

public interface StudentDao {
public void insert();
}
  • 创建实现StudentDao接口的类
package com.spring.dao.impl;

import com.spring.dao.StudentDao;

public class StudentDaoImpl implements StudentDao {

 @Override
public void insert() {
System.out.println("method insert");
} }
  • 创建一个Service类
package com.spring.services;

import com.spring.dao.StudentDao;

public class StudentServices {
private StudentDao dao; public void setDao(StudentDaodao) {
this.dao = dao;
} public void insert() {
dao.insert();
}
}
  • 创建一个JUnit测试类
package com.spring.junit;

import static org.junit.Assert.*;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.spring.dao.StudentDao;
import com.spring.services.StudentServices; public class Test_AOP { @Test
public void testInsert() {
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
StudentServices ss = (StudentServices) ac.getBean("studentServices");
ss.insert();
} }
  • 创建bean-aop-annotation.xml文件,此文件开启一个AOP切面注解功能的配置文件
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> <bean id="studentServices" class="com.spring.services.StudentServices">
    <property name="dao" ref="studentDao"></property>
</bean> <bean id="studentDao" class="com.spring.dao.impl.StudentDaoImpl">
</bean> <bean id="logAop" class="com.spring.aop.LogAop"></bean>
</beans>

[刘阳Java]_Spring AOP入门_第7讲的更多相关文章

  1. [刘阳Java]_Spring IoC原理_第2讲

    Spring IoC(DI)是Spring框架的核心,所有对象的生命周期都是由它们来管理.对于弄懂Spring IOC是相当关键,往往我们第一次接触Spring IOC大家都是一头雾水.当然我们这篇文 ...

  2. [刘阳Java]_Spring AOP基于XML配置介绍_第9讲

    基于注解配置的Spring AOP固然简单,但是这节我们会给大家介绍基于XML配置的AOP是如何应用的.为什么这么说了,因为后面我们还会介绍到Spring对Dao操作的事务管理(基于AOP的XML文件 ...

  3. [刘阳Java]_Spring AOP注解详细介绍_第8讲

    这节内容非常关键,我们会比较详细地介绍Spring AOP注解的使用 1. 要使用Spring AOP注解,必须满足如下的事项 导入Aspectj的jar.Spring3.0-AOP.jar.aopa ...

  4. [刘阳Java]_JVM工作流程_第4讲

    程序员写好一段Java源程序-->编译-->字节码-->JVM-->硬件平台(操作系统)

  5. [刘阳Java]_Java环境搭建_第2讲

    1.为什么搭建Java的环境 Java的程序语言不能独立在操作系统上运行 Java程序需要一个JVM(Java虚拟机)才能将程序员写好的Java程序运行在操作系统 Java程序的跨平台(Mac, Li ...

  6. [刘阳Java]_eayui-searchbox搜索组件_第6讲

    EasyUI中搜索框也是常用的基本组件,可以用到条件搜索中 <!DOCTYPE html> <html> <head> <meta charset=" ...

  7. [刘阳Java]_eayui-pagination分页组件_第5讲

    分页组件也是很基本的应用,这里我只给出一段简单的代码 关键注意一点:分页组件可以在上面添加buttons按钮,或者自定义分页组件的外观.这些内容需要自行的查看EasyUI的API文档 <!DOC ...

  8. [刘阳Java]_easyui-draggable拖动组件_第4讲

    easyui-draggable的拖动组件还是比较好用的,它能够快速地实现网页中元素的拖动效果 实现easyui-draggable拖动组件有两种方式:纯HTML方式和JS方式 纯HTML方式实现拖动 ...

  9. [刘阳Java]_easyui-panel组件入门级_第3讲

    EasyUI中的panel组件在前面一节中我们简单告诉了大家代码如何写.这一节我们会从panel的入门级开始讲起走,重点包括它的事件监听,属性tool介绍 1. 事件监听-通过data-options ...

随机推荐

  1. RADAR毫米波雷达传感器

    RADAR毫米波雷达传感器 TI 利用先进的集成式射频 CMOS 雷达技术提供品类齐全的 60GHz 和 77GHz 传感器产品系列 通过高性能集成射频互补金属氧化物半导体 (CMOS) 雷达技术,可 ...

  2. the rust book 的简单入门笔记

    rust learning day 1 (2021/05/27) 学了常量,变量,数据类型,控制流,所有权 char 的宽度是4字节,一个 unicode 的宽度 控制流条件都不要括号 rust 中的 ...

  3. SQL进阶总结(二)

    2.第二个特性----以集合为单位进行操作 在我们以往面向过程语言不同,SQL是一门面向集合的一门语言.由于习惯了面向过程的思考方式,导致我们在使用SQL时往往也陷入之前的思维定式. 我们现在分别创建 ...

  4. 最短路径问题,BFS,408方向,思路与实现分析

    最短路径问题,BFS,408方向,思路与实现分析 继上回挖下的坑,不知道大家有没有认真看最小生成树呢?很简单,这回也讲讲正常难度的,看不懂就来这里看看,讲的很好~~ 最短路径问题 说起这个问题,先说个 ...

  5. 九、配置Tomcat集群

    配置Tomcat集群所需服务器三台:192.168.1.5(调度服务器).192.168.1.10(WEB1),192.168.1.20(WEB2) 1.调度服务器设置 [root@proxy ~]# ...

  6. Linux面试题(史上最全、持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  7. 听说你还不知道Java代码是怎么运行的?

    作为一名Java程序员,我们需要知道Java代码是怎么运行的.最近复习了深入理解Java虚拟机这本书,做了一下笔记,希望对大家有帮助,如果有不正确的地方,欢迎提出,感激不尽. java 代码运行主要流 ...

  8. Luat Inside | 致敬经典,使用Air724UG制作简易贪吃蛇

    作者简介: 打盹的消防车--活跃于Luat社群的新生代全能开发者,东北小伙儿爽朗幽默.好学敏思,更是实力行动派.幼年曾手握火红炽铁而后全然无恙,堪称魔幻经历:如今热衷于各类嵌入式软硬件研究,快意物联江 ...

  9. 利用SPI机制实现责任链模式中的处理类热插拔

    最近看到责任链模式的时候每增加一个处理类,就必须在责任链的实现类中手动增加到责任链中,具体代码基本就是list.add(new FilterImpl()),可以看到每次增加一个处理类,就必须添加一行上 ...

  10. 带你掌握C++中三种类成员初始化方式

    摘要:在C++11之后,声明时初始化->初始化列表->构造函数初始化. 本文分享自华为云社区<如何编写高效.优雅.可信代码系列(3)--类成员初始化的三种方式>,原文作者:我是 ...