Java后端精选技术:Spring框架简介( 三 )


Java后端精选技术:Spring框架简介

文章插图
 
<?xml version="1.0" encoding="UTF-8"?>是标准的XML头 , xmlns引用的是一些命名空间 , 两个一般在工程中自动生成 。后面的内容由用户输入 , 主要表示实例化SMSReportGenerator , 实例化ReportService并把SMSReportGenerator的对象smsReportGenerator赋值给ReportService的属性reportGenerator , 完成依赖注入 。
5、Spring中的面向切面编程
A、日志问题以及延伸
在例子的需求中有一条是:需要记录日志 , 以便出错时系统管理员查账 。回顾例子中的代码 , 在每个方法中都加了日志操作:
Java后端精选技术:Spring框架简介

文章插图
 

Java后端精选技术:Spring框架简介

文章插图
 
可以看出在每个方法的开始与结尾都调用了日志输出 , 这种零散的日志操作存在着一些隐患 , 会导致维护的困难 。比如日志输出的格式发送了变化 , 那么无论模块A还是模块B的程序员都要对每个方法每个输出逐条修改 , 极容易遗漏 , 造成日志输出风格的不一致 。又比如不用Log4j日志输出工具更换其他工具 , 如果遗漏一个将会出现严重BUG 。
与日志输出相似的问题在编程中经常遇到 , 这种跨越好几个模块的功能和需求被称为横切关注点 , 典型的有日志、验证、事务管理等 。
Java后端精选技术:Spring框架简介

文章插图
 
 
横切关注点容易导致代码混乱、代码分散的问题 。而如何将很切关注点模块化是本节的重点 。
 
B、代理模式
传统的面向对象方法很难实现很切关注点的模块化 。一般的实现方式是使用设计模式中的代理模式 。代理模式的原理是使用一个代理将对象包装起来 , 这个代理对象就取代了原有对象 , 任何对原对象的调用都首先经过代理 , 代理可以完成一些额外的任务 , 所以代理模式能够实现横切关注点 。
Java后端精选技术:Spring框架简介

文章插图
 
 
可能在有些程序中有很多横切关注点 , 那么只需要在代理外再加几层代理即可 。以银行账单为例介绍一个种用JAVA Reflection API动态代理实现的横切关注点模块化方法 。系统提供了一个InvocationHandler接口:
//系统提供的代理接口 public interface InvocationHandler {public Object invoke(Object proxy, Method method, Object[] args) throw Throwable; } 
我们需要实现这个接口来创建一个日志代理 , 实现代码如下:
Java后端精选技术:Spring框架简介

文章插图
 
这样既可以使得日志操作不再零散分布于各个模块 , 易于管理 。调用者可以通过如下方式调用:
Java后端精选技术:Spring框架简介

文章插图
 
代理模式很好的实现了横切关注点的模块化 , 解决了代码混乱代码分散问题 , 但是我们可以看出用 Java Reflection API 实现的动态代理结构十分复杂 , 不易理解 , Spring框架利用了代理模式的思想 , 提出了一种基于JAVA注解(Annotation)和XML配置的面向切面编程方法(AOP  , Aspect-Oriented Programming)简化了编程过程 。
C、Spring AOP 使用方法
Spring AOP使用中需要为横切关注点(有些时候也叫切面)实现一个类 , 银行账单的例子中 , 切面的实现如下:
Java后端精选技术:Spring框架简介

文章插图
 
注解1表示这个类是一个切面 , 注解2中" * *.*(..)* "是一个通配符 , 表示在容器中所有类里有参数的方法 。@Before(“execution(* *.*(..))”)表示在所有类里有参数的方法前调用切面中德 LogBefore() 方法 。同理 , 注解3中@After(“execution(* *.*(..))”)表示在所有类里有参数的方法执行完后调用切面中的LogAfter()方法 。
实现完切面类后 , 还需要对Spring工程中的application.xml进行配置以便实现完整的动态代理:
Java后端精选技术:Spring框架简介

文章插图
 
这比之前IoC依赖关系配置的XML文件多了:xmlns:aop=http://www.springframework.org/schema/aop;http://www.springframework.org/schema/aop;http://www.springframework.org/schema/aop/spring-aop-3.0.xsd


推荐阅读