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

上面代码中构造函数自行创建了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的初步理解的更多相关文章
- 对Spring Ioc 以及DI的精彩理解
转:http://blog.csdn.net/cyjs1988/article/details/50352916 学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注 ...
- Spring(一):Spring入门程序和IoC初步理解
本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...
- Spring Boot(一) 初步理解Spring Boot
一.Spring Boot所解决的问题 Java开发十分笨重:繁多的配置.低下的开发效率.复杂的部署流程以头疼的第三方技术集成. Spring Boot的理念:习惯优于配置——项目中存在大量的配置,此 ...
- 死磕Spring之AOP篇 - Spring AOP总览
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- 初步理解IOC和DI和AOP模式
初步理解IOC和DI和AOP模式 控制反转(IOC) 控制反转(IOC,Inversion of Control)是一种转主动为被动关系的一种编程模式,有点类似于工厂模式,举个栗子, 下面这个这不是I ...
- 如何快速理解Spring中的DI和AOP
前言 Spring框架通过POJO最小侵入性编程.DI.AOP.模板代码手段来简化了Java 开发,简化了企业应用的开发.POJO和模板代码相对来说好理解,本篇重点解读下DI和AOP. 一 DI DI ...
- Spring学习笔记--环境搭建和初步理解IOC
Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...
- 深入理解Spring AOP之二代理对象生成
深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 ...
- 5分钟简述Spring中的DI与AOP
Spring的两个核心特性: 依赖注入(dependency injection,DI) 面向切面编程(aspect oriented programming,AOP) 依赖注入(dependency ...
随机推荐
- Cesium Language (CZML) 入门1 — CZML Structure(CZML的结构)
原文:https://github.com/AnalyticalGraphicsInc/cesium/wiki/CZML-Structure CZML是一种用来描述动态场景的JSON架构的语言,主要用 ...
- kolla-ansible 重新部署 ceph 遇到的问题
问题 TASK [ceph : Fetching Ceph keyrings] ******************************************* fatal: [controll ...
- 【OCP-12c】2019年CUUG OCP 071考试题库(77题)
77.Which two statements are true about sequences created in a single instance database? (Choose two. ...
- bzoj1047理想的正方形
题目链接 纪念又双叒叕的一道暴力碾标算的题 我们考虑纯暴力 #include<iostream> #include<cstdio> #include<algorithm& ...
- LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)
题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...
- ROS初次实践(小海龟)
启动ROS Master 启动小海龟仿真器 启动海龟控制节点(方向键控制海龟运动) rqt_graph可视化工具 /rosout节点必须存在,订阅所有节点的日志信息. 当前系统当中存在的节点. 了解当 ...
- Java线程池学习心得
一.普通线程和线程池的对比 new Thread的弊端如下: a. 每次new Thread新建对象性能差.b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或o ...
- XorPay 个人支付平台增加 个人支付宝支付接口
XorPay 今天新增 个人支付宝当面付 接口,欢迎大家使用. 「 XorPay 支付平台」 已经同时支持 个人微信支付接口 和 个人支付宝接口. 个人可用的 支付宝/微信支付 接口,支持 当面付 ...
- 使用selenium的WebDriver和ChromeDriver实现UI自动化
下载chromedriver chromedriver与chrome的对应关系表:http://blog.csdn.net/huilan_same/article/details/51896672 下 ...
- Python基础部分的疑惑解析——运算符和数据类型(3)
补充上一篇: #! /user/bin/env python 代码内声明这一个就可以用1.py类似的文件直接执行,但是要在linux内加权限, 不需要在前面加python 1.py执行了.文件可以 ...