第七章: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编程,最通俗的语言解释,易懂易学的更多相关文章

  1. 使用spring框架进行aop编程实现方法调用前日志输出

    aop编程 之使用spring框架实现方法调用前日志输出 使用spring框架实现AOP编程首先需要搭建spring框架环境: 使用Spring框架实现AOP工程编程之后,不需要我们去写代理工厂了,工 ...

  2. 10.Spring——框架的AOP

    1.Spring 框架的 AOP 2.Spring 中基于 AOP 的 XML架构 3.Spring 中基于 AOP 的 @AspectJ 1.Spring 框架的 AOP Spring 框架的一个关 ...

  3. Spring入门3.AOP编程

    Spring入门3.AOP编程 代码下载: 链接: http://pan.baidu.com/s/11mYEO 密码: x7wa 前言: 前面学习的知识是Spring在Java项目中的IoC或DJ,这 ...

  4. Spring 框架的 AOP 简介

    Spring 框架的 AOP Spring 框架的一个关键组件是面向方面的编程(AOP)(也称为面向切面编程)框架. 面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点. 跨一个应用程序的多 ...

  5. Spring框架之AOP源码完全解析

    Spring框架之AOP源码完全解析 Spring可以说是Java企业开发里最重要的技术.Spring两大核心IOC(Inversion of Control控制反转)和AOP(Aspect Orie ...

  6. Spring框架的AOP技术(注解方式)

    1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...

  7. 谁能用通俗的语言解释一下什么是 RPC 框架

    转载自知乎:https://www.zhihu.com/question/25536695 知乎上很多问题的答案还是很好的,R大就经常在上面回答问题~ 谁能用通俗的语言解释一下什么是 RPC 框架? ...

  8. Spring框架(4)---AOP讲解铺垫

    AOP讲解铺垫      不得不说,刚开始去理解这个Aop是有点难理解的,主要还是新的概念比较多,对于初学者一下子不一定马上能够快速吸收,所以我先对什么事Aop做一个解释: 首先说明:本文不是自己所写 ...

  9. Spring框架及AOP

    Spring核心概念 Spring框架大约由20个功能模块组成,这些模块主分为六个部分: Core Container :基础部分,提供了IoC特性. Data Access/Integration ...

随机推荐

  1. 第六章深入python的set和dict

    1.collections中的abc MutableMapping是Mapping的子类 Mapping是Collection的子类 Collection是Sized,Iterable,Contain ...

  2. ESA2GJK1DH1K升级篇: 远程升级准备工作: 安装Web服务器

    前言 大家可以安装Apache,Tomcat,nginx 等Web服务器软件,这篇文章安装 OpenResty 作为Web服务器软件,该软件安装在云端电脑,如果想 安装到自己本地电脑实现该功能,可使用 ...

  3. jsonp原理,跨域请求头处理

    一.jsonp(解决跨域)思路介绍: 因浏览器的同源策略不会拦截link标签内的src请求,所以利用这一点,我们把后端开放的接口路径放在src内, 其在发送请求后会自动接收返回的东西,所以我们可以给要 ...

  4. js之juery

    目录 JQuery 属性选择器: 操作标签 文本操作 属性操作 文档处理 事件 JQuery 属性选择器: 属性选择器: [attribute] [attribute=value]// 属性等于 [a ...

  5. JavaScript插件开发

    一.前言 通过 "WWW" 原则我们来了解 JavaScript 插件这个东西 第一个 W "What" -- 是什么?什么是插件,我就不照搬书本上的抽象概念了 ...

  6. nexus没有授权导致的错误

    错误详情信息: 错误信息: [ERROR] Failed to execute goal on project blog: Could not resolve dependencies for pro ...

  7. SQL2008R2下数据库修复一例

    某天访问某个数据库的时候,系统报错.连上去看了一下,服务器是SQL2008R2.由于有上次修复的经验,先使用DBCC查看数据库情况. DBCC的返回: XXXXXXXXXXX发生异常数据库 ID 7, ...

  8. 第七节:Asp.Net Core内置日志和整合NLog(未完)

    一. Asp.Net Core内置日志 1. 默认支持三种输出方式:控制台.调试(底部输出窗口).EventSource,当然也可以在Program类中通过logging.ClearProviders ...

  9. golang socket与Linux socket比较分析

    在posix标准推出后,socket在各大主流OS平台上都得到了很好的支持.而Golang是自带runtime的跨平台编程语言,Go中提供给开发者的socket API是建立在操作系统原生socket ...

  10. 12. Scala模式匹配

    12.1 match 12.1.1 基本介绍 Scala中的模式匹配类似于Java中的switch语法,但是更加强大 模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需 ...