依赖注入
  依赖注入并没有我们听上去那么复杂,在项目中应用依赖注入,会使代码变的异常简单,更易于理解和测试。
  任何一个有实际意义的应用,都是多个类组成,这些类之间相互协作,来实现特定的业务逻辑,通常,每个对象负责管理与自己相互协作的对象,这就使得代码具有的侵入性,耦合程度较高,不利于维护。
例如:

上面代码中构造函数自行创建了RescueDamselQuest对象,是的DamselRescuingKinght与RescueDamselQuest类紧密的耦合在了一起,不利于代码的维护和扩展。
  耦合具有两面性,一方面,紧密的耦合是的代码难以测试和复用,难以理解,并经常会出现修复一个bug会出现一个新的甚至更多的bug,另一方面,一定程度的耦合又是必须的,完全没有耦合的代码什么也做不了。耦合是必须的,但应当小心谨慎的使用。
  另一种方式,通过依赖注入(DI),对象的依赖关系将由负责协调对象的第三方组件在创建时设定。对象无需自行创建或管理他们的依赖关系———依赖关系会自动注入到他们所需要的对象中去。
例如:

不同于之前自行创建对象,而是在构造时把任务Quest接口作为参数传入。这是依赖注入的方式之一,即构造器注入。这里的要点是BraveKnights没有与特定的Quest实现发生耦合。对他来说,只要是实现了Quest接口的类,都可以作为参数传入,这就是依赖注入最大的好处——松耦合。
装配:创建应用组件之间的协作行为通常称为装配,Spring提供了多种装配方式。采用XML配置通常是最常见的装配方式。
例如:

其中注入的Quest代码为:

加载包含Knight的Spring上下文:
Spring通过应用上下文ApplicationContext装载Bean的定义,并把他们组装起来。Spring应用上下文全权负责对象的创建和组装。Spring自带了几种应用上下文的实现,他们之间的区别主要是如何加载他们的配置。
knights.xml中的bean实在XML文件中进项声明的,我们可以选ClassPathXmlApplicationContext作为应用上下文。

运行结果:

这里main方法创建了一个Spring应用上下文,该应用下载了knights.xml文件。随后它调用该应用上下文,获取一个ID为knight的对象引用后,调用其embarkOnQuest()方法。

注意:1.knights类完全不知道注入的是哪一种Quest,只有knights.xml文件知道,这就实现了松耦合。

           2.应用上下文:可以理解为程序的运行环境

AOP(应用切面)
依赖注入能让相互协作的软件保持松耦合,而AOP编程允许你把遍布应用各处的的功能分离出来,形成可以重用的组件。
系统由许多不同的组件构成,每一个组件负责特定的功能。除了实现自身的核心功能之外,这些组件还常常承担着额外的职责,例如日志,事务管理和安全等此类的系统服务经常融入到核心逻。这些系统服务通常被称为横切关注点,因为他们总是跨越多个组件,若果这些关注点分散到多个组件中,代码将会引入双重复杂性。
AOP使这些服务组件模块化,并以声明的方式将他们应用到他们需要影响的组件中去,使这些组件具有更高的内聚以及更加关注自身业务,完全不需要了解可能涉及的系统服务的复杂性。总之,AOP确保pojo的绝对简单。
例如:
1.首先我们创建一个Minstrel类,来记录Knight类中embark()方法的执行,如图:

2.将Minstrel类应用到代码中:

运行结果:

这样可以达到预期的效果,但也会导致一些问题,记录knights的行为是Minstrel类自身的工作,不应当牵扯到Knignts类,因为Knight类需要知道哪个类在记录的行为,必须将该类注入进去,回事BraveKnights的代码复杂化(例如 如果不需要记录自身行为,或者minstrel为空怎么办?),
为了解决这个问题,我们可以利用AOP把Minstrel抽象为一个切面,只需在配置文件中声明一下,即可完成所需要的操作。
例如:
1.删除调BraveKnights中有关于Minstrel的代码

2.在knights.xml文件中配置通知和切面

3.运行结果:

通过少量的XML配置,你就可以把Minstrel声明为一个Spring切面,而不需要在Brave类中注入Minstrel类来增加代码的复杂性。

Spring---AOP与DI的初步理解的更多相关文章

  1. 对Spring Ioc 以及DI的精彩理解

    转:http://blog.csdn.net/cyjs1988/article/details/50352916 学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注 ...

  2. Spring(一):Spring入门程序和IoC初步理解

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...

  3. Spring Boot(一) 初步理解Spring Boot

    一.Spring Boot所解决的问题 Java开发十分笨重:繁多的配置.低下的开发效率.复杂的部署流程以头疼的第三方技术集成. Spring Boot的理念:习惯优于配置——项目中存在大量的配置,此 ...

  4. 死磕Spring之AOP篇 - Spring AOP总览

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  5. 初步理解IOC和DI和AOP模式

    初步理解IOC和DI和AOP模式 控制反转(IOC) 控制反转(IOC,Inversion of Control)是一种转主动为被动关系的一种编程模式,有点类似于工厂模式,举个栗子, 下面这个这不是I ...

  6. 如何快速理解Spring中的DI和AOP

    前言 Spring框架通过POJO最小侵入性编程.DI.AOP.模板代码手段来简化了Java 开发,简化了企业应用的开发.POJO和模板代码相对来说好理解,本篇重点解读下DI和AOP. 一 DI DI ...

  7. Spring学习笔记--环境搭建和初步理解IOC

    Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...

  8. 深入理解Spring AOP之二代理对象生成

    深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 ...

  9. 5分钟简述Spring中的DI与AOP

    Spring的两个核心特性: 依赖注入(dependency injection,DI) 面向切面编程(aspect oriented programming,AOP) 依赖注入(dependency ...

随机推荐

  1. cesium编程中级开篇

    cesium编程中级开篇 其实初级,中级并无定论,我理解的初级是根据官方教程,先学会如何部署环境,搭建hello world,使用官方提供的工具,完成一些示例, 而中级就是在这些的基础上,自己定制一些 ...

  2. WPF 无边框拖动

    无边框之后的拖动方法有三种. 我个人是喜欢第一和第三的方法,看个人去需求. 第三种代码比较仓促,有需要者可以立马用,或者稍作整理修改. 对于WIN10 .NET 4.5以上的框架可以使用 WIndow ...

  3. 【Oracle 12c】CUUG OCP认证071考试原题解析(29)

    29.choose the best answer Evaluate the following query: SQL> SELECT promo_name || q'{'s start dat ...

  4. KVM性能优化学习笔记

    本学习笔记系列都是采用CentOS6.x操作系统,KVM虚拟机的管理也是采用virsh方式,网上的很多的文章都基于ubuntu高版本内核下,KVM的一些新的特性支持更好,本文只是记录了CentOS6. ...

  5. 【文文殿下】浅谈KMP算法next数组与循环节的关系

    KMP算法 KMP算法是一种字符串匹配算法,他可以在O(n+m)的时间内求出一个模式串在另一个模式串下出现的次数. KMP算法是利用next数组进行自匹配,然后来进行匹配的. Next数组 Next数 ...

  6. django rest framework实现分页功能

    在web开发中很多需求都需要实现分页功能,然而 Django Rest Framework 自带的分页功能,只能在 mixins.ListModelMixin and generics.Generic ...

  7. Display all 2232 possibilities? (y or n)

    Linux下我在没输入任何命令的情况下摁了两下tab键,然后就出现了这个提示:Display all 2232 possibilities? (y or n) 我觉得摁y的话就会显示所有的现阶段命令. ...

  8. Mixnode 让操作网络资源和数据库一样简单,不一样的爬虫!

    简评: hacker news 上刷的一篇文章,可以使用类似操作数据库的方式访问网络上的资源,可以大大简化爬虫的代码. Mixnode 将网络变成了一个巨大的数据库!换句话说,Mixnode 允许您将 ...

  9. 总结day23 ---- 网络编程,以及计算机基础概念

    计算机网络的发展及基础网络概念 问题:网络到底是什么?计算机之间是如何通信的? 早期 : 联机 以太网 : 局域网与交换机 广播 主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无 ...

  10. 架构师养成记--19.netty

    一.Netty初步 为什么选择Netty? 和NIO比较,要实现一个通信要简单得很多,性能很好.分布式消息中间件.storm.Dubble都是使用Netty作为底层通信. Netty5.0要求jdk1 ...