Spring之旅(2)
Spring简化Java的下一个理念:基于切面的声明式编程
3、应用切面
依赖注入的目的是让相互协作的组件保持松散耦合;而AOP编程允许你把遍布应用各处的功能分离出来形成可重用的组件。
AOP面向切面编程被定义为促使应用程序分离关注点的一项技术。系统由许多不同的组件组成,每个组件除了负责某一特定的功能,还要承担额外的职责,诸如日志、事务管理和安全等等的服务经常融入到自身的核心业务逻辑中去,这些服务统称为横向关注点,因为它们总是跨越系统的各个组件。
将这些代码分散到多个组件,会导致双重复杂性:
- 如果要修改关注点得逻辑,必须修改各个组件的相关实现。即使你把这些关注点抽象成一个独立的模块,其他模块只是调用它的方法,但方法的调用还是会重复出现在各个模块中(耦合);
- 组件代码会因为那些与自身核心业务无关的代码而变得混乱。
假设你需要使用吟游诗人这个服务类来记载骑士(BraveKnight)的所有事迹,建立Minstrel(吟游诗人)类。
package com.test.knights;
public class Minstrel {
public void singBeforeQuest() {
System.out.println("Fa la la; The knight is so brave!");
}
public void singAfterQuest() {
System.out.println("Tee hee he; The brave knight do a quest");
}
}
让我们做适当的调整来让BraveKnight来使用Minstrel
package com.test.knights;
public class BraveKnight implements Knight {
private Quest quest;
private Minstrel minstrel;
public BraKnight(Quest quest, Minstrel minstrel) {
this.quest = quest;
this.minstrel = minstrel;
}
public void embrakOnQuest() throws QuestException {
minstrel.singBeforeQuest();
quest.embrak();
minstrel.singAfterQuest();
}
}
这样达到了预期的效果:骑士做任务前执行singBeforeQuest()方法、任务后执行singAfterQuest()方法。但是管理吟游诗人真的是骑士的责任吗?骑士在依赖注入时就必须提供一个吟游诗人,这显然是不合逻辑的。吟游诗人应该自己独立出来,他有自己分内的事情。
改进,把Minstrel抽象为一个切面,你所做是是在Spring配置文件中声明它。
<?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:aop="http://www.springframework.org/schema/aop"
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-3.0.xsd">
<bean id = "knight" class = "com.test.knight.BraveKnight">
<constructor-arg ref = "quest" />
</bean> <bean id = "quest" class = "com.test.knight.SlayDragonQuest" /> <!-- add -->
<bean id = "minstrel" class = "com.test.knight.Minstrel" />
<aop:config>
<aop:aspect ref="minstrel">
<aop:pointcut id="embark" expression="execution(* *.embrakOnQuest(..))" />
<aop:before pointcut-ref="embark"> method="singBeforeQuest" />
<aop:after pointcut-ref="embark"> method="singAfterQuest" />
</aop:aspect>
</aop:config>
</beans>
这里将minstrel Bean声明为一个切面,pointcut定义了一类切入点embark,expression含义是在任意返回类型、任意对象调用方法、任意入参的embrakOnQuest 方法都有效。
<aop:before>称为前置通知,<aop:after>称为后置通知。从这个示例中获得两个重要的观点:
- Minstrel仍然是一个POJO,没有任何代码表示它将被作为一个切面使用。
- Minstrel可以被应用到BraveKnight中,而BraveKnight不需要显示地调用。实际上,BraveKnight完全不知道Minstrel的存在。
Spring之旅(2)的更多相关文章
- 我的Spring之旅(二):为请求加入參数
1.前言 在上一篇我的Spring之旅(一)中,我们仅仅是利用不带參数的请求返回一个网页或一段json,在实际的B/S.C/S网络交互中,请求中须要自己定义的參数.本篇将简单地为之前的请求加入參数. ...
- Spring之旅第六篇-事务管理
一.什么是事务 什么是事务(Transaction)?事务是数据库中的概念,是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 有个非常经典的转账问题:A向B转款1000元,A转出成 ...
- Spring之旅
Java使得以模块化构建复杂应用系统成为可能,它为Applet而来,但为组件化而留. Spring是一个开源的框架,最早由Rod Johnson创建.Spring是为了解决企业级应用开发的复杂性而创建 ...
- Spring学习笔记—Spring之旅
1.Spring简介 Spring是一个开源框架,最早由Rod Johnson创建,并在<Expert One-on-One:J2EE Design and Development> ...
- SpringInAction读书笔记--第1章Spring之旅
1.简化Java开发 Spring是一个开源框架,它的根本使命在于简化java开发.为了降低java开发的复杂性,Spring采取了以下4种关键策略: 基于POJO的轻量级和最小侵入性编程 ...
- Spring之旅第五篇-AOP详解
一.什么是AOP? Aspect oritention programming(面向切面编程),AOP是一种思想,高度概括的话是“横向重复,纵向抽取”,如何理解呢?举个例子:访问页面时需要权限认证,如 ...
- Spring之旅第四篇-注解配置详解
一.引言 最近因为找工作,导致很长时间没有更新,找工作的时候你会明白浪费的时间后面都是要还的,现在的每一点努力,将来也会给你回报的,但行好事,莫问前程!努力总不会有错的. 上一篇Spring的配置博客 ...
- Spring之旅第三篇-Spring配置详解
上一篇学习了IOC的概念并初步分析了实现原理,这篇主要学习Spring的配置,话不多说,让我们开始! 一.Bean元素配置 1.1 基本配置 看一个最基本的bean配置 <bean name=& ...
- Spring之旅第二篇-Spring IOC概念及原理分析
一.IOC概念 上一篇已经了解了spring的相关概念,并且创建了一个Spring项目.spring中有最重要的两个概念:IOC和AOP,我们先从IOC入手. IOC全称Inversion of Co ...
随机推荐
- 操作系统篇-调用门与特权级(CPL、DPL和RPL)
|| 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.前言 在前两篇文章(<操作系统篇-浅谈实模式与保护模式>和<操作系统篇-分段机制与GDT|LDT>)中,我们提到 ...
- .NET Core全新路线图
.NET Core / ASP.NET Core 1 RTM发布两周后,社区也很积极,收到了非常多的反馈,上周五微软的scott Hunter 在dotnet团队官方博客上发布了.NET Core全新 ...
- TODO:Laravel 使用blade标签布局页面
TODO:Laravel 使用blade标签布局页面 本文主要介绍Laravel的标签使用,统一布局页面.主要用到到标签有@yield,@ stack,@extends,@section,@stop, ...
- mac osx 安装redis扩展
1 php -v查看php版本 2 brew search php|grep redis 搜索对应的redis ps:如果没有brew 就根据http://brew.sh安装 3 brew ins ...
- ASP.NET Core应用针对静态文件请求的处理[3]: StaticFileMiddleware中间件如何处理针对文件请求
我们通过<以Web的形式发布静态文件>和<条件请求与区间请求>中的实例演示,以及上面针对条件请求和区间请求的介绍,从提供的功能和特性的角度对这个名为StaticFileMidd ...
- ASP.NET从零开始学习EF的增删改查
ASP.NET从零开始学习EF的增删改查 最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...
- 云瓣影音网站&&微信端(已开源)
随着该项目的发布到线上(小打小闹),即将又要开启另一段崭新的旅程.强迫自己停下来写写所学所得,个人认为总结和分享是一种很棒的学习方式.那让我们先来瞧瞧项目长的什么样.如果着急要源码的朋友,可以下拉到最 ...
- 【Java学习系列】第3课--Java 高级教程
本文地址 可以拜读: 从零开始学 Java 分享提纲: 1. Java数据结构 2. Java 集合框架 3. Java泛型 4. Java序列化 5. Java网络编程 6. Java发送Email ...
- Angular2 Hello World 之 2.0.0-beta.14
公司现在采用angualrjs开发一些web应用,采用的是angular1,现在angular2已经差不多了,听说最近rc6已经出来了……其实感觉好慢啊!之前也做过一些anglar2的例子,但是没有记 ...
- Atitit.项目修改补丁打包工具 使用说明
Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...