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

上面代码中构造函数自行创建了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. Handler运行机制

    https://blog.csdn.net/u012827296/article/details/51236614

  2. php全局变量漏洞 $GLOBALS

    在Discuz代码中有这么一段: if (isset($_REQUEST[‘GLOBALS’]) OR isset($_FILES[‘GLOBALS’])) {  exit(‘Request tain ...

  3. AngularJS入门讲解3:$http服务和路由讲解

    上一课的例子中,我们的模型数据是硬编码的,也就是说,我们的数据不是从服务器请求回来的. 这里,我们先讲解,如何从服务器获取数据: function PhoneListCtrl($scope, $htt ...

  4. Mysql6.0连接中的几个问题 Mysql6.xx

    Mysql6.0连接中的几个问题 在最近做一些Javaweb整合时,因为我在maven官网查找的资源,使用的最新版,6.0.3,发现MySQL连接中的几个问题,总结如下: 1.Loading clas ...

  5. MQ 消息队列的比较

    目前业界有很多MQ产品,我们作如下对比: RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量 ...

  6. collections 模块常用方法学习

    前情提要: 1:模块介绍 个人认为就是 python自带的骚操作模块.如果基础能力够给力的话,完全用不到 个人认为解析式才是装逼神奇,用模块的都是伪娘 2:deque   双向列表 from coll ...

  7. 在Eclipse之中调试FastDFS-storage

    FDFS版本为5.03 1.首先在eclipse之中创建一个C/C++工程,取名为FastDFS_v5.03 2.将FastDFS源码解压后拷贝到新创建的工程目录下,然后在ecipse之中刷新下工程就 ...

  8. mongodb主从备份 和 手动主从切换

    环境: 主机A:172.16.160.91 主机B:172.16.160.92 配置主机A [root@master zhxf]# cat docker-compose.yml version: '3 ...

  9. 2. 需要对测试用的数据进行MD5加密

    import hashlib phone_num = open("D:/testdata/phone10.txt","r") out_file = open(& ...

  10. 【算法笔记】A1060 Are They Equal

    1060 Are They Equal (25 分)   If a machine can save only 3 significant digits, the float numbers 1230 ...