[刘阳Java]_Spring AOP入门_第7讲
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讲的更多相关文章
- [刘阳Java]_Spring IoC原理_第2讲
Spring IoC(DI)是Spring框架的核心,所有对象的生命周期都是由它们来管理.对于弄懂Spring IOC是相当关键,往往我们第一次接触Spring IOC大家都是一头雾水.当然我们这篇文 ...
- [刘阳Java]_Spring AOP基于XML配置介绍_第9讲
基于注解配置的Spring AOP固然简单,但是这节我们会给大家介绍基于XML配置的AOP是如何应用的.为什么这么说了,因为后面我们还会介绍到Spring对Dao操作的事务管理(基于AOP的XML文件 ...
- [刘阳Java]_Spring AOP注解详细介绍_第8讲
这节内容非常关键,我们会比较详细地介绍Spring AOP注解的使用 1. 要使用Spring AOP注解,必须满足如下的事项 导入Aspectj的jar.Spring3.0-AOP.jar.aopa ...
- [刘阳Java]_JVM工作流程_第4讲
程序员写好一段Java源程序-->编译-->字节码-->JVM-->硬件平台(操作系统)
- [刘阳Java]_Java环境搭建_第2讲
1.为什么搭建Java的环境 Java的程序语言不能独立在操作系统上运行 Java程序需要一个JVM(Java虚拟机)才能将程序员写好的Java程序运行在操作系统 Java程序的跨平台(Mac, Li ...
- [刘阳Java]_eayui-searchbox搜索组件_第6讲
EasyUI中搜索框也是常用的基本组件,可以用到条件搜索中 <!DOCTYPE html> <html> <head> <meta charset=" ...
- [刘阳Java]_eayui-pagination分页组件_第5讲
分页组件也是很基本的应用,这里我只给出一段简单的代码 关键注意一点:分页组件可以在上面添加buttons按钮,或者自定义分页组件的外观.这些内容需要自行的查看EasyUI的API文档 <!DOC ...
- [刘阳Java]_easyui-draggable拖动组件_第4讲
easyui-draggable的拖动组件还是比较好用的,它能够快速地实现网页中元素的拖动效果 实现easyui-draggable拖动组件有两种方式:纯HTML方式和JS方式 纯HTML方式实现拖动 ...
- [刘阳Java]_easyui-panel组件入门级_第3讲
EasyUI中的panel组件在前面一节中我们简单告诉了大家代码如何写.这一节我们会从panel的入门级开始讲起走,重点包括它的事件监听,属性tool介绍 1. 事件监听-通过data-options ...
随机推荐
- CUDA 11功能展示
CUDA 11功能展示 CUDA 11 Features Revealed 新的NVIDIA A100 GPU基于NVIDIA安培GPU架构,实现了加速计算的最大一代飞跃.A100 GPU具有革命性的 ...
- eclipse左边的工程列表窗口不见了解决方案
解决eclipse左边的工程列表窗口看不到工程目录的方法: Window->Show View->Project Explorer(如果没有Project Explorer选项,则Wind ...
- Python字符与字节新编
字符 字符是一个信息单位,简单来讲就是一个字母.数字.标点符号.汉字等. 字符的最佳定义是Unicode字符: 它是一个全球化的标准,能表示世界上所有语言的字符.Unicode字符的标识(码位)是以4 ...
- sql server数据库性能优化之2-避免使用CTE公用表达式的递归【by zhang502219048】
数据库优化中的一个实例,记录一下: 1. 原来用了CTE公用表达式的递归,reads高达约40万,看查询执行计划,使用了Nested Loops: 2. 优化去掉递归,改用其它方式实现,reads降低 ...
- CMD批处理(5)——自动以管理员身份运行批处理脚本
在日常运维工作中,为方便对windows用户进行系统安装或配置等,使用Windows自带的批处理(bat文件)是一种最为简单快速的方法. 批处理脚本不会默认已管理员身份运行,一般情况下,我会将脚本命名 ...
- 在vue项目中使用scss,以及vscode适配scss语法(解决使用scss语法编辑器报错)
项目搭建好之后 安装sass 依赖包 npm install --save-dev sass-loader //sass-loader依赖于node-sass npm install --save-d ...
- 《手把手教你》系列基础篇(五)-java+ selenium自动化测试- 创建首个自动化脚本(详细教程)
1.简介 前面几篇宏哥介绍了两种(java和maven)环境搭建和三大浏览器的启动方法,这篇文章宏哥将要介绍第一个自动化测试脚本.前边环境都搭建成功了,浏览器也驱动成功了,那么我们不着急学习其他内容, ...
- ceph-csi组件源码分析(1)-组件介绍与部署yaml分析
更多ceph-csi其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 ceph-csi组件源码分析(1)-组件介绍与部署yaml分析 基于tag v3.0.0 ht ...
- MATLAB导入txt和excel文件技巧汇总:批量导入、单个导入
在使用MATLAB的时候,想必各位一定会遇到导入数据的问题.如果需要导入的数据其数据量巨大的话,那么在MATLAB编辑器中将这些数据复制粘贴进来,显然会在编辑器中占据巨大的篇幅,这是不明智的. 一般来 ...
- 45、django工程(URLconf)
45.1.django URLconf 路由系统介绍: 1.说明: URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表, ...