spring 第一篇(1):让java开发变得更简单(下)

应用切面(aspects)

  DI能够让你的软件组件间保持松耦合,而面向切面编程(AOP)能够让你捕获到在整个应用中可重用的组件功能。在软件系统中,AOP通常被定义为提升关注点分离的一个技术。系统由很多的组件组成,每个组件负责一部分的功能。但是这些组件往往除了核心功能外,还有些额外的责任。比如像日志,事务管理和安全这些系统服务会被引进到组件中。这些服务通常被称为横切关注点(cross-cutting-concerns),因为它们常常贯穿于多个组件中。

  在多个组件中传播这些概念,你会引进两个复杂层面到你的代码中

  •  实现系统级概念代码将会在多个组件中重复出现,这意味着如果你需要改变这些概念的话,你必须修改多个组件的内容。即使你将这些概念抽象到一个独立的方法中来使它成为一个单一的方法,但是方法的调用还是会出现在多个地方。
  •  你的组件现在充斥着和核心代码无关的功能。一个添加它的条目到地址簿中方法应当只关心如何添加而不是安全和事务问题

  下图展示的它的复杂度。左边的业务对象和右边的系统服务紧密的关联在一起。

  AOP能够让这些服务现在模块化并且声明的使用它们到组件中来消除这些影响。这样使组件更有粘合性,使它们只关注于自己具体的概念,完全忽略任何涉及到的系统服务。简而言之,切面确保POJOS保持简单。

  你可以将切面设想为覆盖了很多组件的毛毯,如下图所示。一个应用由多个实现业务功能的模块组成。使用AOP,你可以使用功能层来覆盖你的核心应用。这些层可以通过声明的方式来贯穿到你的应用中而不用你核心代码知道它们的存在。这是一个强大的概念,因为它将应用核心业务和系统服务独立开来。

下面我们来看个具体的例子,现在是个骑士的英勇的故事,故事如何流传下来呢,当然是通过歌手的歌声来传递

public class Minstrel {
    private PrintStream stream;
    public Minstrel(PrintStream stream) {
        this.stream = stream;
    }
    public void singBeforeQuest() {
        stream.println("Fa la la, the knight is so brave!");
    }
    public void singAfterQuest() {
        stream.println("Tee hee hee, the brave knight " +
        "did embark on a quest!");
    }
}

  如你所见,Minstrel是个简单的类并有两个方法。singBeforeQuest()方法在骑士开始探索的之前被调用,而singAfterQuest()方法应当在骑士探索结束后调用。在这两个用例中,Minstrel通过在构造器中注入的PrintSteam来歌颂骑士的事迹。

  现在你要做的就是将这些带人到你的代码中----你只需要注入BraveKnight,让我们微调下BraveKnight去使用Minstrel。下面展示如何将他们合并在一起

 

public class BraveKnight implements Knight {
    private Quest quest;
    private Minstrel minstrel;
    public BraveKnight(Quest quest, Minstrel minstrel) {
        this.quest = quest;
        this.minstrel = minstrel;
    }
    public void embarkOnQuest() throws QuestException {
        minstrel.singBeforeQuest();
        quest.embark();
        minstrel.singAfterQuest();
    }
}    

  它应该能够运行,你要做的就是回到你的配置文件中让后声明一个Minstrel bean并且注入到BraveKnight的构造器中。但是等等...

  

时间: 2024-11-01 23:23:44

spring 第一篇(1):让java开发变得更简单(下)的相关文章

spring 第一篇(1):让java开发变得更简单(上)

1.释放POJOS能量 传统开发中是如何束缚POJOS呢,如果你开发过java很长时间,那你一定有接触过EJB的开发.那时候开发一个小小的功能都要扩展框架的类或者实现其接口.所以你很容易在早期的Struts,WebWork,Taperstry等框架中看到侵入到你应用中的框架代码. spring尽可能避免在你的应用中充满它的API.spring从来都不强迫你实现具体的spring接口或者扩展一个具体的spring类.替代的是,在基于spring开发的应用中经常没有指示说明你正在使用spring.最

spring 第一篇(1-3):鸟瞰spring蓝图

如你所见,spring框架的核心是关注于如何使用DI.AOP和模板来让企业级java开发变得更简单.spring确实也是这样做的,所以很值得你去使用它.不过spring内容可能比你所能看到的要多很多.在spring框架中,你可能找到几种使java开发变得容易的方式.但是spring框架是构建在核心框架的的一个生态系统,将spring延伸到web service,REST,mobile和NoSQL领域. 首先,让我们分解下spring核新框架,看看它带来的价值.然后我们会将我们的视野集中在spri

可能是国内第一篇全面解读 Java 现状及趋势的文章

作者 | 张晓楠 Dragonwell JDK?最新版本 8.1.1-GA 发布,包括全新特性和更新! 导读:InfoQ 发布<2019 中国 Java 发展趋势报告>,反映 Java 在中国发展的独特性,同时也希望大家对 Java 有一个正确的认识. 2 个月前,InfoQ 英文站发布了一份<2019 Java 发展趋势报告>,从技术采用生命周期的角度,分析了 Java 这门 20 多年历史语言的发展现状.这份报告发布后,发生了几个我们没想到的问题:一是有些开发者对 Java 产

第一篇:Unity3d游戏开发之移动端完整包更新方案

由于Unity没法进行热更新,也就是局部更新,所以如果你在设计之前没有考虑好使用Lua,反射,或者其他方式实现热更新,但是又要面临游戏上线那么你可以考虑使用完整包更新,其实这对于游戏包不是很大的情况下,也是一个不错的选择,当然设计者在设计之初都想好了热更新那就宁当别论了. Unity3d 在移动端考虑Android和Ios平台的完整包更新 实现逻辑: 首先检查本地的版本和服务器的版本是否相同,如果相同则直接进入游戏,如果不同则下载服务器的最新文件,然后根据最新文件到资源服务器下载最新的安装包 我

APICloud可以让你开发变得很简单

QQ登录.分享怎么做?相信APICloud可以让你开发变得很简单.这里分享一个demo供大家参考. 1.使用模块,先打开它的开发文档http://www.apicloud.com/mod_detail/37360 添加模块至APIcloud项目 2. 编译自定义loader 3. 在腾讯开放平台管理中心创建应用,提交审核,拿到appkey和appId 4. 在项目代码中找到config.xml 添加代码 <font face="微软雅黑" size="3"&g

[翻译和注解]Kafka Streams简介: 让流处理变得更简单

Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Kafka Streams还没有正式发布,所以具体的API和功能和0.10.0.0版(2016年6月发布)有所区别.但是Jay Krpes在这简文章里介绍了很多Kafka Streams在设计方面的考虑,还是很值得一看的. 以下的并不会完全按照原文翻译,因为那么搞太累了……这篇文件的确很长,而且Jay

jQuery Validate【为表单提供了强大的验证功能,让客户端表单验证变得更简单】

jQuery Validate jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证,同时提供了一个用来编写用户自定义方法的 API.所有的捆绑方法默认使用英语作为错误信息,且已翻译成其他 37 种语言. 该插件是由 J?rn Zaefferer 编写和维护的,他是 jQuery 团队的一名成员,是 jQuery UI 团队的主要开发人员,是 QUn

深入解析 Kubebuilder:让编写 CRD 变得更简单

作者 | 刘洋(炎寻) 阿里云高级开发工程师 导读:自定义资源 CRD(Custom Resource Definition)可以扩展 Kubernetes API,掌握 CRD 是成为 Kubernetes 高级玩家的必备技能,本文将介绍 CRD 和 Controller 的概念,并对 CRD 编写框架 Kubebuilder 进行深入分析,让您真正理解并能快速开发 CRD. 概览 控制器模式与声明式 API 在正式介绍 Kubebuidler 之前,我们需要先了解下 K8s 底层实现大量使用

初学Java ssh之Spring 第一篇

之前虽然毕业前实习的工作是使用的C# .NET语言,但是,毕业后还是果断应聘Java.虽然自己对Java的理解不如C#深入,只是对基础知识比较熟悉,但还是义无返顾了··· 虽然应聘经历比较坎坷,但最终还是成功入职了. 刚入职,再加上经验不足,所以最近任务比较少,这样就有大把时间自学了,得抓紧时间积累知识啊,废话少说,步入正题. 对于java,自己的掌握仅限于基础知识,对于框架什么的几乎没有使用过,只大概知道ssh是企业常用的开发框架,struts+hibernate+spring是一套很不错的框