当前位置:首页 » 《随便一记》 » 正文

Spring DI和AOP简介

10 人参与  2022年10月17日 18:48  分类 : 《随便一记》  评论

点击全文阅读


        Spring可以做很多事情,它为企业级开发提供了丰富的功能,但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入(dependency injection,DI)面向切面编程(aspect-oriented programming,AOP)。

一、依赖注入

1.构造注入

考虑下面程序展现的Knight类:

package sia.knights;public class DamselRescuingKnight implements Knight {  private RescueDamselQuest quest;  public DamselRescuingKnight() {    //将DamselRescuingKnight和RescueDamselQuest紧耦合    this.quest = new RescueDamselQuest();  }  public void embarkOnQuest() {    quest.embark();  }}

         可以看到,DamselRescuingKnight在它的构造函数中自行创建了RescueDamselQuest。这使得DamselRescuingKnight紧密地和RescueDamselQuest耦合到一起了,因此极大地限制了这个骑士执行探险的能力。如果一个少女需要救援,这个骑士能够召之即来。但是如果一条恶龙需要杀掉,或者让一个圆桌滚起来,那么这个骑士就爱莫能助了。

我们再定义一个Knight类:

package sia.knights;  public class BraveKnight implements Knight {  private Quest quest;  //通过构造函数将Quest注入进来  public BraveKnight(Quest quest) {    this.quest = quest;  }  public void embarkOnQuest() {    quest.embark();  }}

        我们可以看到不同于之前的DamselRescuingKnightBraveKnight 没有自行创建探险任务,而是在构造的时候把探险任务作为构造器参数传入。这是依赖注入的方式之一,即构造器注入(constructor injection)

        更重要的是,传入的探险类型是Quest,也就是所有探险任务都必须实现一个接口。所以,BraveKnight 能够响应RescueDamselQuest(少女救援请求)、SlayDragonQuest(屠杀恶龙请求)、MakeRoundTableRounderQuest(圆桌滚起来请求)等任意的Quest实现。

2.完整依赖注入举例

BraveKnight.java:

package sia.knights;  public class BraveKnight implements Knight {  private Quest quest;  //通过构造函数将Quest注入进来  public BraveKnight(Quest quest) {    this.quest = quest;  }  public void embarkOnQuest() {    quest.embark();  }}

SlayDragonQuest.java:

package sia.knights;import java.io.PrintStream;public class SlayDragonQuest implements Quest {  private PrintStream stream;  public SlayDragonQuest(PrintStream stream) {    this.stream = stream;  }  public void embark() {    stream.println("Embarking on quest to slay the dragon!");  }}

knight.xml:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans      http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="knight" class="sia.knights.BraveKnight">  <!--注入Quest bean-->  <constructor-arg ref="quest" /></bean><!--创建SlayDragonQuest--><bean id="quest" class="sia.knights.SlayDragonQuest">  <constructor-arg value="#{T(System).out}" /></bean></beans>

KnightConfig.java:

package sia.knights.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import sia.knights.BraveKnight;import sia.knights.Knight;import sia.knights.Quest;import sia.knights.SlayDragonQuest;@Configurationpublic class KnightConfig {  @Bean  public Knight knight() {    return new BraveKnight(quest());  }    @Bean  public Quest quest() {    return new SlayDragonQuest(System.out);  }}

KnightMain.java:

package sia.knights;import org.springframework.context.support.ClassPathXmlApplicationContext;public class KnightMain {  public static void main(String[] args) throws Exception {    //加载Spring上下文    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/knight.xml");    //获取knight bean    Knight knight = context.getBean(Knight.class);    //使用knight    knight.embarkOnQuest();    context.close();  }}

流程梳理如下图: 

 二、应用切面


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/45303.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 全书浏览缝补错位人生全书+后续+结局(傅云琛乔洛颜)_缝补错位人生全书+后续+结局(傅云琛乔洛颜)全书结局
  • 好看的苏语栀顾墨寒_苏语栀顾墨寒
  • 你都如何回忆我结局+番外(霍闻深温妤)霍闻深温妤读结局_霍闻深温妤读结局列表_笔趣阁(你都如何回忆我结局+番外)
  • [阳光不煦]命运转折章节速览_[苏幻月柳安]后续已完结
  • 心上宠全书宋轻语霍霆傅晏在线
  • 只等南风起,不等故人归全书+后续+结局(叶竹君陆时琛)_只等南风起,不等故人归全书+后续+结局列表_笔趣阁(只等南风起,不等故人归全书+后续+结局)
  • 陌上离人终不归全书+后续+结局(柳如烟谢瑾珩)全文免费_陌上离人终不归全书+后续+结局列表_笔趣阁(柳如烟谢瑾珩全书+后续+结局)
  • 不见明月不见君现已上架(谭湘傅廷渊)全书浏览_不见明月不见君现已上架全书浏览
  • 完结文潮汐搁浅时免费赏析列表_完结文潮汐搁浅时免费赏析(裴修杰董依依)
  • 全书浏览离婚高嫁美丽娇妻哪里逃(姜晚柠陆景深)_离婚高嫁美丽娇妻哪里逃(姜晚柠陆景深)全书结局
  • 心上宠+后续+结局(宋轻语霍霆傅晏)结局_宋轻语霍霆傅晏+结局列表_笔趣阁(心上宠+后续+结局)
  • (潮汐搁浅时全书+后续+结局)人气书荒必读(裴修杰董依依)_(潮汐搁浅时全书+后续+结局)列表_笔趣阁(裴修杰董依依)

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1