[刘阳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 ...
随机推荐
- 可视化反投射:坍塌尺寸的概率恢复:ICCV9论文解读
可视化反投射:坍塌尺寸的概率恢复:ICCV9论文解读 Visual Deprojection: Probabilistic Recovery of Collapsed Dimensions 论文链接: ...
- SLAM的通用框架:GSLAM
SLAM的通用框架:GSLAM GSLAM: A General SLAM Framework and Benchmark 论文链接: http://openaccess.thecvf.com/con ...
- TensorFlow神经网络集成方案
TensorFlow神经网络集成方案 创造张力流create_tensorflow_neuropod 将TensorFlow模型打包为neuropod包. create_tensorflow_neur ...
- TensorRT Analysis Report分析报告
TensorRT Analysis Report 一.介绍 TensorRT是一个高性能的深度学习推理(Inference)优化器,可以为深度学习应用提供低延迟.高吞吐率的部署推理.TensorRT可 ...
- Git操作_从github远程仓库克隆到本地仓库, 本地代码提交
实现目的: 从github远程仓库克隆到本地仓库:本地代码提交到远程仓库. 一.从github远程仓库克隆到本地仓库: 命令行切换到指定的仓库想存放的目录,执行如下命令:git clone 远程仓库 ...
- Java 将PPT幻灯片转为HTML
本文以Java程序代码为例展示如何通过格式转换的方式将PPT幻灯片文档转为HTML文件.这里的PPT幻灯片可以是.ppt/.pptx/.pps/.ppsx/.potx等格式. 代码实现思路:[加载PP ...
- DarkGreenTrip博客搭建成功
本博客(https://www.cnblogs.com/zhangshuhao1116)自2021年6月19日由 Shu-How Z 搭建成功,2018年搭建过hexo+next.Wordpress ...
- Docker笔记--ubuntu安装docker
Docker笔记--ubuntu安装docker 1.更换国内软件源,推荐中国科技大学的源,稳定速度快(可选) sudo cp /etc/apt/sources.list /etc/apt/sourc ...
- kubelet分析-pvc扩容源码分析
kubernetes ceph-csi分析目录导航 存储的扩容分为controller端操作与node端操作两大步骤,controller端操作由external-resizer来调用ceph完成,而 ...
- HTTPD之二————HTTPD服务详解————httpd的配置文件常见设置
HTTPD之二----HTTPD服务详解----httpd的配置文件常见设置 HTTP服务器应用 http服务器程序 httpd apache nginx lighttpd 应用程序服务器 IIS,a ...