2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat

Similar documents
untitled

new 进行创建对象, 是程序主动去创建依赖对象 ; 而 IoC 是有专门一个容器来创建这些对象, 即由 Ioc 容器来控制对象的创建 ; 谁控制谁? 当然是 IoC 容器控制了对象 ; 控制什么? 那就是主要控制了外部资源获取 ( 不只是对象包括比如文件等 ) 为何是反转, 哪些方面反转了 : 有

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

"+handlermethod.getbean().getclass().getname()); public void aftercompletion(httpservletrequest req, HttpServletResponse resp, Object handler, Excepti

EJB-Programming-4-cn.doc

Chapter 9: Objects and Classes

IoC容器和Dependency Injection模式.doc

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

Java应用框架Spring实验指导书.doc

PrintWriter s = new PrintWriter(writer); ex.printstacktrace(s); mv.addobject("exception", writer.tostring()); mv.setviewname("error"); return

设计模式 Design Patterns


Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

chp6.ppt

EJB-Programming-3.PDF

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

内 容 提 要 将 JAVA 开 发 环 境 迁 移 到 Linux 系 统 上 是 现 在 很 多 公 司 的 现 实 想 法, 而 在 Linux 上 配 置 JAVA 开 发 环 境 是 步 入 Linux 下 JAVA 程 序 开 发 的 第 一 步, 本 文 图 文 并 茂 地 全 程 指

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

「西醫基層總額支付委員會《第28次委員會議紀錄

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

Stateless Session Beans(无状态bean)的学习

输入 project name 选择完成

D C 93 2

電機工程系認可證照清單 /7/1

1.2. Sql 映射配置 小风 Java 实战系列教程 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//dtd Mapper 3.0//EN" "

《大话设计模式》第一章

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

JBuilder Weblogic

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

回 页 首 相 关 的 类 和 接 口 要 了 解 Java 动 态 代 理 的 机 制, 首 先 需 要 了 解 以 下 相 关 的 类 或 接 口 : java.lang.reflect.proxy: 这 是 Java 动 态 代 理 机 制 的 主 类, 它 提 供 了 一 组 静 态 方 法

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

深入Spring之第五章 Spring AOP应用

<!-- import outer proper

设计模式 Design Patterns

Microsoft PowerPoint - ch6 [相容模式]

基于CDIO一体化理念的课程教学大纲设计

Java

1.5招募说明书(草案)

Java 1 Java String Date

untitled

软件工程文档编制

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

Chapter 9: Objects and Classes

JavaIO.PDF

Microsoft PowerPoint - 09Future

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

使用 XFire 与 Spring 开发 Web Service 2 实现功能与特点 基于 J2EE 平台的 Web Service 服务 开发方便, 配置简单 设计接口 实现服务 配置暴露接口 XFire 将自动生成对应的 wsdl 支持高级详细配置 与 Spring 无缝集成 运行环境 JDK

第03章 控制反转(Spring IoC)

untitled

Spring 的入门程序 依赖注入的概念 依赖注入的实现方式 Spring 的核心容器 Spring 的入门程序 依赖注入的概念 依赖注入的实现方式 依赖注入的概念 了解 Spring 的概念和优点 理解 Spring 中的 IoC 和 DI 思想 掌握 ApplicationContext 容器的

2 Java 语 言 程 序 设 计 教 程 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

云数据库 RDS SDK

Microsoft Word - 01.DOC

北 风 网 讲 师 原 创 作 品 ---- 仅 供 学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见

Microsoft Word - ch04三校.doc

untitled

OSWorkflow Documentation

Guava学习之Resources

使用MapReduce读取XML文件

TWLOM060929

javaexample-02.pdf

Java ¿ª·¢ 2.0: Óà Hadoop MapReduce ½øÐдóÊý¾Ý·ÖÎö

(Microsoft Word - \272\364\263q\245|\244A_ _\304\254\253\330\336\263__\272\353\302\262\263\370\247i.doc)

附录J:Eclipse教程

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

untitled

Android Service

将 MD5 的工具类拷贝到项目中 二 微服务模块的搭建 我们将权限的查询放到一个单独的模块中, 这个模块提供接口供给消费者远程调用 (RPC), 这次范例是微服开发的雏形, 在以后你使用 springcloud 的时候会使用到今天的概念 1 使用 maven 创建新的模块 (microboot-sh

拦截器(Interceptor)的学习

在Spring中使用Kafka:Producer篇

FileMaker 15 ODBC 和 JDBC 指南

建模与图形思考

RunPC2_.doc

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

untitled

RxJava

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

FileMaker 16 ODBC 和 JDBC 指南

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

4.1 AMI MQSeries API AMI MQI AMI / / AMI JavaC C++ AMI / AMI AMI - / /

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

J2EE MVC with Webwork2 Xwork, to J2EE MVC with Webwork2 Xwork

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

Struts2自定义类型转换.doc

Java程序设计

untitled

绘本阅读手册 第3辑.indd

Microsoft Word - 扉页.doc

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

本章学习目标 小风 Java 实战系列教程 Shiro 核心功能 Shiro 的 Web 集成 Spring 与 Shiro 整合 SpringBoot 整合 Shiro 1. Shiro 核心功能 1.1. RBAC 模型 在 RBAC 的模型, 涉及到三个关键的元素 : 1) 用户 : 系统的使

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

服务框架 HSF 使用与配置 一江更新时间 : 目录 HSF 常用 OPS 和开发工具介绍... 1 HSF 的使用和配置... 2 下载和安装 HSF... 2 服务开发与部署... 5 服务查询 服务调用 HSFUNIT 测试包的使用 HSF

IOC

Transcription:

本章学习目标 小风 Java 实战系列教程 AOP 思想概述 AOP 底层技术实现 AOP 术语介绍 SpringAOP 的 XML 方式 HelloWorld SpringAOP 的 XML 方式配置细节 SpringAOP 的注解方式 SpringAOP 的零配置方式 1. AOP 思想概述 1.1. AOP 思想简介 1.2. AOP 的作用

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,update 方 法执行之前记录日志 2.1. 接口代理 (JDK 动态代理 ) public class JDKProxyUtils { /** * 使用 JDK 动态代理获取代理对象 * target: 目标对象 * @return */ public static Object getproxy(final Object target){ return Proxy.newProxyInstance( target.getclass().getclassloader(), // 和目标对象一样的 类加载器 target.getclass().getinterfaces(), // 目标对象的接口列表 new InvocationHandler() { //invoke: 这个方法在每次调用代理类对象的时候被执行啦!!! @Override

public Object invoke(object proxy, Method method, Object[] args) throws Throwable { System.out.println(" 记录日志 "); // 调用目标对象的方法 return method.invoke(target, args); ); 注意 :JDK 动态代理必须是基于接口的代理! 如果目标对象没有接口, 那么只能子类代理! 2.2. 子类代理 (Cglib 方式 ) 2.2.1. 导入 cglib 的 jar 包 2.2.2. 编写 Cglib 子类代理代码 public class CglibProxyUtils { /**

* 使用 Cglib 工具创建目标对象的子类对象 * @param target * @return */ public static Object getproxy(final Object target){ return Enhancer.create(CustomerServiceImpl2.class, new MethodInterceptor() { //intercept: 每次代理类对象执行方法的时候执行该方法 @Override public Object intercept(object arg0, Method method, Object[] arg2, MethodProxy arg3) throws Throwable { System.out.println(" 记录日志 "); // 调用目标对象的方法 return method.invoke(target, arg2); ); 3. AOP 术语介绍 1) 目标对象 (Target) 2) 代理对象 (Proxy) 3) 连接点 (Joinpoint) 4) 切入点 (Pointcut) 5) 通知 ( 增强 )(Advice) 6) 切面 (Aspect Advisor)

7) 织入 ( 切入 )(weaving) 小风 Java 实战系列教程 4. SpringAOP 的 XML 方式 4.1. HelloWolrd 入门程序 4.1.1. 导入 spring 的 aop 相关 jar 包 注意 : 使用了 aspectj 插件, 作用是简化 Spring 的 XML 方式 AOP 编程

4.1.2. 编写目标类 ( 有接口的情况 ) /** * 目标对象 * @author lenovo * */ public class CustomerServiceImpl implements CustomerService { @Override public void save() { System.out.println(" 执行 save 方法 "); @Override public void update() { System.out.println(" 执行 update 方法 ");

4.1.3. 编写切面类 小风 Java 实战系列教程 /** * Spring 的 AOP 的切面类 * @author lenovo * */ public class MyAspect1 { /** * 通知方法 */ public void log(){ System.out.println(" 使用 spring 的 AOP 切入日志..."); 4.1.4. 编写 applicationcontext.xml( 重点 ) 引入 aop 新的名称空间 : <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p"

xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- spring 的 AOP 编写 -- XML 方式 --> <!-- 1. 创建目标对象 --> <bean id="customerservice" class="cn.sm1234.service.impl.customerserviceimpl"/> <!-- 2. 创建切面类对象 --> <bean id="myaspect1" class="cn.sm1234.apsect.myaspect1"/> <!-- 3. 配置 AOP 切面 --> <aop:config> <!-- 切面 = 通知 + 切入点 --> <aop:aspect ref="myaspect1"> <aop:before method="log" pointcut-ref="pt"/> <aop:pointcut expression="execution(public void cn.sm1234.service.impl.customerserviceimpl.*())" id="pt"/> </aop:aspect> </aop:config> </beans>

4.1.5. 编写测试代码 小风 Java 实战系列教程 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class Demo1 { @Resource private CustomerService customerservice; @Test public void test1(){ customerservice.save(); customerservice.update(); 4.2. SpringAOP 的 XML 配置细节 4.2.1. 切入点表达式 <aop:config> <aop:aspect ref="myaspect1"> <aop:before method="log" pointcut-ref="pt"/> <!-- 切入点表达式的语法 1. execution(): 代表切入方式, 固定语法 2. public: 方法的修饰符, 通常为 public 方法 3. void: 方法的返回值 可以使用通配符 : * 4. cn.sm1234.service.impl: 类所在的包

4.1 可以使用通配符 : * (* 只能匹配一级目录 ) 4.2 可以使用 *..* 匹配任意级目录 5.CustomerServiceImpl: 类名称 5.1 可以使用通配符 : * ( 匹配任意字符 ) 6. save() : 代表方法 6.1 可以使用通配符 : * ( 匹配任意字符 ) 7. 方法的参数 7.1 可以使用通配符 :.. ( 匹配任何参数类型的方法 ) --> <aop:pointcut expression="execution(public * cn.sm1234.*..*.*serviceimpl.*(..))" id="pt"/> </aop:aspect> </aop:config> 4.2.2. 通知类型 4.2.2.1. 前置通知 在方法的前面执行 4.2.2.2. 最终通知 在方法的最后执行, 无论方法是否出现异常, 通知都会被执行 4.2.2.3. 后置通知 在方法的最后执行, 只有在方法成功执行之后才被执行

4.2.2.4. 异常通知 在方法出现异常的时候执行 4.2.2.5. 环绕通知 在方法的前后执行 <aop:config> <aop:aspect ref="myaspect1"> <!-- <aop:before method="before" pointcut-ref="pt"/> --> <!-- <aop:after method="after" pointcut-ref="pt"/> --> <!-- <aop:after-returning method="afterreturning" pointcut-ref="pt"/> --> <!-- <aop:after-throwing method="afterthrowing" pointcut-ref="pt"/> --> <aop:around method="around" pointcut-ref="pt"/> <aop:pointcut expression="execution(public * cn.sm1234.service.impl.customerserviceimpl.*(..))" id="pt"/> </aop:aspect> </aop:config>

5. SpringAOP 的注解方式 小风 Java 实战系列教程 5.1. HelloWorld 的入门程序 5.1.1. 导入 spring 的 aop 相关 jar 包 注意 : 使用了 aspectj 插件, 作用是简化 Spring 的 XML 方式 AOP 编程 5.1.2. 编写目标类 ( 有接口的情况 ) /** * 目标对象 * @author lenovo * */

public class CustomerServiceImpl implements CustomerService { 小风 Java 实战系列教程 @Override public void save() { System.out.println(" 执行 save 方法 "); @Override public void update() { System.out.println(" 执行 update 方法 "); 5.1.3. 编写切面类, 添加切面相关的注解 /** * 注解版本的切面类 * @author lenovo * */ @Aspect public class MyAspect { @Before(value="execution(public * cn.sm1234.service.impl.customerserviceimpl.*.(..))") public void log(){ System.out.println(" 记录日志 ");

5.1.4. 编写 applicationcontext.xml( 重点 ) 引入 aop 新的名称空间 : <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- spring 的 AOP 编写之注解方式 --> <!-- 1. 创建目标对象 --> <bean id="customerservice" class="cn.sm1234.service.impl.customerserviceimpl"/> <!-- 2. 创建切面类对象 -->

<bean id="myaspect" class="cn.sm1234.apsect.myaspect"/> 小风 Java 实战系列教程 <!-- 3. 开启 AOP 切面注解 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans> 5.1.5. 编写测试 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class Demo1 { @Resource private CustomerService customerservice; @Test public void test1(){ customerservice.save(10); customerservice.update(); @Before(value = "execution(public * cn.sm1234.service.impl.customerserviceimpl.*(..))") public void before() { System.out.println(" 执行前置通知..."); // 最终通知

@After(value = "execution(public * cn.sm1234.service.impl.customerserviceimpl.*(..))") public void after() { System.out.println(" 执行最终通知..."); // 后置通知 @AfterReturning(value = "execution(public * cn.sm1234.service.impl.customerserviceimpl.*(..))") public void afterreturning() { System.out.println(" 执行后置通知..."); // 异常通知 @AfterThrowing(value = "execution(public * cn.sm1234.service.impl.customerserviceimpl.*(..))") public void afterthrowing() { System.out.println(" 执行异常通知..."); // 环绕通知 @Around(value = "execution(public * cn.sm1234.service.impl.customerserviceimpl.*(..))") public void around(proceedingjoinpoint jp) { System.out.println(" 前面执行的代码..."); // 执行目标的方法

try { jp.proceed(); catch (Throwable e) { e.printstacktrace(); System.out.println(" 后面执行的代码..."); 6. SpringAOP 的零配置方式 /** * Spring 配置类 * @author lenovo * */ @Configurable @ComponentScan(basePackages="cn.sm1234") @EnableAspectJAutoProxy // 开启 AOP 注解功能 public class SpringConfig { @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes=SpringConfig.class) public class Demo1 { @Resource private CustomerService customerservice;

@Test public void test1(){ customerservice.save(10); customerservice.update();