Spring框架的AOP编程,最通俗的语言解释,易懂易学
第七章:AOP技术
前言:
AOP技术是根据动态代理设计模式进行的技术。动态代理技术分jdk动态代理和cglib动态代理
jdk动态代理特点:
(1)继承java.lang.reflect.proxy类
(2)实现了真实类实现的接口
(3)真实类和代理类之间的关系是:他们都实现了相同的接口
cglib动态代理特点:
特点:
(1)代理类是真实类的子类
注:本片文章主要理解AOP编程,至于动态代理技术不做过多介绍,有需要的话,可以留言,下篇文章可以进行讲解。
7.1:AOP原理概述
AOP:Aspect Oriented Programming,面向切面编程
传统形式,web项目执行流程:
缺点:
(1)Bad Smell现象,指一些代码逻辑出现了在了不合适的层次。
例如:在service层有数据库的事务处理代码,不合乎规范

改进:
AOP编程:
本质上,属于动态代理设计模式

切面编程:类似于在链式程序指定流程中,在service层处进行截断,此处的断层成为切面,此处的service处的程序运行为竖向,可以看作service层的强化操作。
概念:
(1)Point(切点):表示要对哪个方法进行增强
(2)Advice(通知):表示额外增加的功能
(3)Aspect(切面):就是代理对象,(切面+切点)
(4)Weaving(织入):将通知添加到切点中的操作,生成动态代理的过程
7.2:AOP实现过程
7.2.1:导包
1. 日志包:
commons-logging.jar
2. Spring核心包:
spring-core.jar
spring-beans.jar
spring-context.jar
spring-expression.jar
3. aop依赖的jar包:
spring-aop.jar
aopalliance.jar -aop联盟提供的对aop的具体实现
7.2.2:测试用的service代码
spring支持两种动态代理的实现:
(1)如果提供了接口,就用jdk动态代理
(2)如果没有提供接口,就用cglib动态代理
7.2.3:提供通知
spring中的通知类型:
(1)前置通知:在切点方法调用前操作,MethodBeforeAdvice
(2)后置操作:在切点方法掉用后操作,AfterReturningAdvice
(3)异常通知:在切点方法执行发生异常时执行,ThrowsAdvice
(4)环绕通知:包含了前置通知、后置通知和异常通知,MethodInterceptor
public class DemoBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("我是前置通知....");
}
}
7.2.4:配置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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置service对象-->
<bean id="userService" class="com.bjsxt.service.impl.UserServiceImpl" />
<bean id="testService" class="com.bjsxt.service.TestService" />
<!--配置通知对象-->
<bean id="demoBefore" class="com.bjsxt.advice.DemoBeforeAdvice" />
<!--配置织入, 生成动态代理-->
<bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--配置目标对象-->
<property name="targetName" value="userService" />
<!--配置通知-->
<property name="interceptorNames">
<array>
<value>demoBefore</value>
</array>
</property>
</bean>
<bean id="testProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetName" value="testService" />
<property name="interceptorNames">
<array>
<value>demoBefore</value>
</array>
</property>
</bean>
</beans>
7.2.5:测试代码
public class TestAOP {
@Test
public void testAop2() {
//cglib动态代理
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
TestService testProxy = context.getBean("testProxy", TestService.class);
System.out.println(testProxy.getClass().getName());
System.out.println(testProxy.getClass().getSuperclass().getName());
testProxy.test();
}
@Test
public void testAop() {
//jdk动态代理
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("proxy", UserService.class);
System.out.println(userService.getClass().getName());
userService.demo();
}
}
Spring框架的AOP编程,最通俗的语言解释,易懂易学的更多相关文章
- 使用spring框架进行aop编程实现方法调用前日志输出
aop编程 之使用spring框架实现方法调用前日志输出 使用spring框架实现AOP编程首先需要搭建spring框架环境: 使用Spring框架实现AOP工程编程之后,不需要我们去写代理工厂了,工 ...
- 10.Spring——框架的AOP
1.Spring 框架的 AOP 2.Spring 中基于 AOP 的 XML架构 3.Spring 中基于 AOP 的 @AspectJ 1.Spring 框架的 AOP Spring 框架的一个关 ...
- Spring入门3.AOP编程
Spring入门3.AOP编程 代码下载: 链接: http://pan.baidu.com/s/11mYEO 密码: x7wa 前言: 前面学习的知识是Spring在Java项目中的IoC或DJ,这 ...
- Spring 框架的 AOP 简介
Spring 框架的 AOP Spring 框架的一个关键组件是面向方面的编程(AOP)(也称为面向切面编程)框架. 面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点. 跨一个应用程序的多 ...
- Spring框架之AOP源码完全解析
Spring框架之AOP源码完全解析 Spring可以说是Java企业开发里最重要的技术.Spring两大核心IOC(Inversion of Control控制反转)和AOP(Aspect Orie ...
- Spring框架的AOP技术(注解方式)
1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...
- 谁能用通俗的语言解释一下什么是 RPC 框架
转载自知乎:https://www.zhihu.com/question/25536695 知乎上很多问题的答案还是很好的,R大就经常在上面回答问题~ 谁能用通俗的语言解释一下什么是 RPC 框架? ...
- Spring框架(4)---AOP讲解铺垫
AOP讲解铺垫 不得不说,刚开始去理解这个Aop是有点难理解的,主要还是新的概念比较多,对于初学者一下子不一定马上能够快速吸收,所以我先对什么事Aop做一个解释: 首先说明:本文不是自己所写 ...
- Spring框架及AOP
Spring核心概念 Spring框架大约由20个功能模块组成,这些模块主分为六个部分: Core Container :基础部分,提供了IoC特性. Data Access/Integration ...
随机推荐
- docker的简单操作和端口映射
一:简介 Docker镜像 在Docker中容器是基于镜像启动的 镜像是启动容器的核心 镜像采用分层设计,最顶层为读写层 使用快照COW技术,确保底层不丢失 通过ifconfig(ip a)来查看d ...
- javascript系列--认识并理解构造函数,原型和原型链
一.前言 介绍构造函数,原型,原型链.比如说经常会被问道:symbol是不是构造函数:constructor属性是否只读:prototype.[[Prototype]]和__proto__的区别:什么 ...
- windows server 2008的系统备份
添加windows server backup功能,打开运行“服务器管理器”->“功能”选项, 点击“添加功能”,选择“Windows Server Backup”,选择下一步安装该功能. 点击 ...
- Qt应用程序主窗口之二:拖放操作与打印文档
一.拖放操作 对于一个实用的应用程序,不仅希望能从文件菜单中打开一个文件,更希望可以通过拖动直接将桌面上的文件拖入程序界面上来打开,就像可以将.pro文件拖入Creator中来打开整个项目一样.Qt中 ...
- mapreduce 变量共享
mapreduce 全局变量共享 在编写MapReduce程序时,经常会遇到这样的问题,全局变量如何保存?如何让每个处理都能获取保存的这些全局变量?使用全局变量是不可避免的,但是 在MapRdeuce ...
- .net中加密与解密
.Net中的加密解密 引言 在一些比较重要的应用场景中,通过网络传递数据需要进行加密以保证安全.本文将简单地介绍了加密解密的一些概念,以及相关的数字签名.证书,最后介绍了如何在.NET中对数据进行对称 ...
- Effective.Java第45-55条(规范相关)
45. 明智谨慎地使用Stream 46. 优先考虑流中无副作用的函数 47. 优先使用Collection而不是Stream作为方法的返回类型 48. 谨慎使用流并行 49. 检查参数有效 ...
- SpringBoot:3.SpringBoot使用Spring-data-jpa实现数据库访问
做Web开发,首先要能将数据渲染到网页中展示,其次是要获取数据库数据展示到视图层,在前面的文章SpringBoot整合Thymeleaf模板引擎渲染web视图,我们实现了从后端数据展示到视图层,那么下 ...
- 关于mysql的null相关查询的一些坑
我们先看一下效果,然后在解释,示例如下: mysql> create table test5 (a int not null,b int,c varchar(10)); Query OK, 0 ...
- Java学习:线程的安全问题
线程的安全问题 模拟卖票案例创建三个的线程,同时开启,对共享的票进行出售 public class RunnableImpl implementsc Runnable{ //定义一个多线程共享的票源 ...