我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring的示例分析

这篇文章将为大家详细讲解有关Spring的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

WHY

在诞生之初,创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB。相对于EJB来说,Spring提供了更加轻量级和简单的编程模型。

WHAT

Spring是一个开源框架,最早由RodJohnson创建,Spring是为了解决企业级应用开发的复杂性而创建的,使用Spring可以让简单的JavaBean实现之前只有EJB才能完成的事情。Spring不仅仅限于服务端的开发,任何Java应用都能在简单性、可测试性和松耦合等方面从Spring中获益。

如今Spring在移动开发、社交API集成、NoSQL数据库、云计算及大数据方面都在涉足。随着时间的推移EJB也采用了依赖注入(DependencyInjection,DI)和面向切面编程(Aspect-OrientedProgramming,AOP)的理念。总之,Spring最根本的使命就是简化Java开发

HOW

为了降低Java开发的复杂性,Spring采取了4钟关键策略

基于POJO的轻量级和最小侵入性编程通过依赖注入和面向接口实现松耦合

基于切面和惯例进行声明式编程通过切面和模板减少样式代码

POJO潜能

很多框架通过强迫应用继承它们的类或实现它们的接口从而导致应用与框架绑定在一起,这就是侵入性编程,导致无法复用代码块。Spring竭力避免因自身的API而弄乱你的应用代码,在基于Spring构建的应用程序中,他的类通常没有任何痕迹表明你使用了Spring

public class HelloWorldBean {  public String sayHello(){    return "Hello World";  }}

以上的实例代码表示一个很简单普通的Java类(POJO),你看不出来他是一个Spring组件,Spring的非侵入式编程体现在这个类在Spring应用和非Spring应用中都可以发挥作用。仅仅这么一段代码并没有能实际体现Spring功能,还需要后面的知识。
依赖注入(将自身依赖的类注入的自身)

依赖注入这个此在Spring中并不是这么高大上,尽管现在已经演变成一项复杂的编程技巧或者设计模式理念。在Spring中可以这么理解,注入依赖。一个具有实际意义的应用都需要多个类进行相互协作来完成特定的业务逻辑。传统的做法是每个对象负责管理与自己有关的对象(这个有关的对象就是Spring中表述的所依赖的对象)的引用,不过这将会导致高度耦合和代码难以测试

考虑如下代码

public class DamselRescuingKnight implements Knight{private RescueDamselQuest quest;public DamselRescuingKnight(){this.quest = new RescueDamselQuest();}public void embarkOnQuest(){quest.embark();}}

耦合具有两面性,一方面,紧密耦合的代码难以测试难以复用难以理解,并且会出现"打地鼠"式的BUG。另一方面,一定程度的耦合又是必要的,不同的类必须以适当的方式进行交互。

问题出现了,那么Spring是如何解决的呢

在Spring中,通过依赖注入(DI),对象之间的依赖关系由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。也就是说对象只需要管理自己内部的属性而无需自行创建或者管理它们的依赖关系,依赖关系会被自动注入到需要它们的对象当中去。

public class BraveKnight implements Knight{private Quest quest;public BraveKnight(Quest quest){this.quest = quest;}public void embarkOnQuest(){quest.embark();}}

BraveKnight没有与任何特定的Quest实现发生耦合,只要某个任务实现了Quest接口,那么具体是哪种类型的冒险就无所谓了,这就打到了DI的目的——松耦合

如果一个对象只通过接口来表明依赖关系,那么这种依赖关系就能够在对象本身毫不知情的情况下用不同的具体实现来进行替代。

那么现在来进行实际意义的注入

对于上面那块代码我们来将一个具有具体实现的冒险任务注入到勇敢骑士中去

public class SlayDragonQuest implements Quest{private PrintStream stream;public SlayDragonQuest(PrintStream stream){this.stream = stream;}public void embark() {stream.print("slay the dragon");}}

那么现在问题来了,在SlayDragonQuest中如何注入它所依赖的PrintStream对象,在BraveKnight中如何注入它所依赖的Quest对象。前面提到的Spring会将这些依赖进行集中管理,创建应用组件之间协作的行为通常称为装配(wiring)也就是注入。Spring提供了多种装配的方式在后面会更加详细的介绍,此处简单介绍基于XML的装配和基于Java注解的装配

<!--    这就是一个装配的过程,将SlayDragonQuest声明为一个bean,取名为"quest"    因为是构造器注入所以使用constructor-arg属性 value表示注入的值    那么这个过程解决了之前的问题,将PrintStream对象注入到SlayDragonQuest对象中  -->  <bean class="impl.SlayDragonQuest" id="quest">    <constructor-arg value="#{T(System).out}">  </constructor-arg></bean>   <!--    这个过程同上,BraveKnight声明为一个bean取名为"knight"(不一定使用到这个名字)    然后BraveKnight的构造器参数要求为Quest类型此时传入了另外一个bean的引用    就是上面这个名字"quest"的bean的引用,此时也完成了对BraveKnight的构造器注入   -->  <bean class="impl.BraveKnight" id="knight">    <constructor-arg ref="quest">  </constructor-arg></bean>

Spring提供了基于Java的配置,可作为XML的替代方案

@Configurationpublic class KnightConfig {     @Bean  public Knight knight(){    return new BraveKnight(quest());  }   @Bean  public Quest quest(){    return new SlayDragonQuest(System.out);  }}

效果是相同的,具体的解释在下一章中详细描述。现在再来回顾一下,一直说Spring会自动管理对象之间的依赖关系,那么这种管理者是什么。答案是Application Context(应用上下文),它是Spring的一种容器,可以装载bean的定义并将它们组装起来。Spring应用上下文全权负责对象的创建和组装。实际上这个Context有好多中实现他们之间的区别仅仅是加载配置的方式不同,下面来看一种加载配置的方式

public class KnightMain {   public static void main(String[] args){    AnnotationConfigApplicationContext context = new        AnnotationConfigApplicationContext(KnightConfig.class);    //从配置文件中就可以获取到bean的定义了    Knight knight = context.getBean(Knight.class);    knight.embarkOnQuest();    context.close();  } }

应用切面

DI能够让相互协作的软件组件保持松耦合,而面向切面编程允许你把遍布应用各处的功能分离出来形成可重用的组件,更详细的说,它是促使软件系统实现关注点奋力的一项技术。什么是关注点呢,诸如日志、事务管理、安全管理这样的系统服务经常需要融入到其他自身具有业务逻辑的组件中去,那么这些系统服务通常就被称为横切关注点,因为它们会在多个地方被重用,跨越系统的多个组件。简单来说,就是你把需要重用的经常会服务与各种其他组件的组件抽离出来,但是抽离出来如何使用呢,其实就是在用的时候将方法插入到需要使用的地方。但是根据这个"切面"的术语,应该表述为将重用的组件抽离出来作为一个切面,在需要使用的时候将切面横切进组件。所以这样就做到了核心应用不需要知道这些切面的存在,切面也不会将业务逻辑融合在核心应用中。

public class Minstrel {   private PrintStream stream;   public Minstrel(PrintStream stream){    this.stream = stream;  }  //在冒险之前执行  public void singBeforeQuest(){    stream.print("Begin");  }  //在冒险之后执行  public void singAfterQuest(){    stream.print("End");  } }
public class BraveKnight implements Knight{private Quest quest;private Minstrel minstrel;//  public BraveKnight(Quest quest){//    this.quest = quest;//  }public BraveKnight(Quest quest, Minstrel minstrel){this.quest = quest;this.minstrel = minstrel;}public void embarkOnQuest(){minstrel.singBeforeQuest();quest.embark();minstrel.singAfterQuest();}}

这个时候这个勇敢的骑士开始执行,但是他发现在他的职责中不仅仅是冒险了,现在竟然还要管理这个歌手要为他歌颂,然而这本身并不应该属于这个类应该管理的。所以应用切面的思想,我们需要将这个歌手的歌颂行为抽离出来成为一个切面,在骑士冒险之前这个切面将会横切进去执行singBeforeQuest方法在冒险之后执行singAfterQuest方法。那么这样是不是就实现了骑士中不需要歌颂的代码,歌手也不存在与骑士对象中,他将不仅仅赞颂骑士,也可以赞颂任何人只要别人使用这个切面切入即可

  <!-- 意思就是将上述id为minstrel的bean配置为切面实际上就是把歌手配置为切面 -->  aspect ref="minstrel">    <!--       定义切入点,也就是在哪里会使用切面       expression="execution(* *.embarkOnQuest(..))      是一种AspectJ的切点表达式语言后面会深入      此处的意思是会在embarkOnQuest()方法处切入      下面那个分别为前置通知和后置通知在切入点之前和之后执行    -->   </aop:after></aop:before></aop:pointcut></aop:</aop:config>

现在的情况是Minstrel仍然是独立的一个POJO,Spring的上下文已经将他变成了一个切面了。最重要的是此时骑士完全不知道这个切面的存在,这只是一个小小的栗子,实际上可以做很多重要的事情。

使用模板消除样式代码

有这样一种情况,当我们使用JDBC访问数据库查询数据的时候,完整的流程需要建立连接、创建语句对象、处理结果集、查询、关闭各种连接,此外还需要各种异常的捕获,然后对于各种场景的查询都需要如此费心费力的重复。JDBC还不仅仅是唯一这样会有大量的样式代码的情况,Spring旨在通过模板封装来消除样式代码,比如Spring的jdbcTemplate。

容纳你的Bean

在基于Spring的应用中,你的应用对象生存于Spring容器,容器负责创建对象装配对象并且管理他们的生命周期。那什么是Spring的容器呢,容器并不是只有一种,Spring自带了多个容器实现。分为两类:bean工厂,是最简单的容器提供基本的DI支持。应用上下文比较高级提供应用框架级别的服务。大多数情况下应用上下文更加受欢迎。

应用上下文也分为多种,显著的区别的是加载配置的方式不同

Spring的各种功能

Spring的示例分析

关于“Spring的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring的示例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Spring的示例分析

这篇文章将为大家详细讲解有关Spring的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。WHY在诞生之初,创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB。相对于E
2023-05-30

Spring AOP的示例分析

这篇文章主要为大家展示了“Spring AOP的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring AOP的示例分析”这篇文章吧。Spring中对AOP的支持Spring中AOP
2023-05-30

Spring Cloud Config的示例分析

这篇文章将为大家详细讲解有关Spring Cloud Config的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在我们了解spring cloud config之前,我可以想想一个配置中心提供的
2023-06-05

初始Spring的示例分析

小编给大家分享一下初始Spring的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为什么要使用SpringWhy Spring?Spring makes
2023-06-20

Spring之BeanPostProcessor的示例分析

小编给大家分享一下Spring之BeanPostProcessor的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、简介BeanPostProcesso
2023-06-15

Spring对IOC的示例分析

这篇文章将为大家详细讲解有关Spring对IOC的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、IOC控制反转和DI依赖注入1.控制反转,字面可以理解为:主动权的转移,原来一个应用程序内的对象
2023-05-30

Spring Boot Starter的示例分析

这篇文章给大家分享的是有关Spring Boot Starter的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Spring Boot 简介Spring框架功能很强大,但是就算是一个很简单的项目,我们也要
2023-05-31

javax.validation结合spring的示例分析

这篇文章主要为大家展示了“javax.validation结合spring的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javax.validation结合spring的示例分析”这篇
2023-06-20

Spring Native项目的示例分析

小编给大家分享一下Spring Native项目的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!关于Spring NativeSpring官方博客于202
2023-06-15

Java中Spring Boot的示例分析

这篇文章主要介绍Java中Spring Boot的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 什么是 Spring Boot?Spring Boot 是为 Spring 服务的,是用来简化新 Spri
2023-06-20

Spring重定向的示例分析

这篇文章主要介绍了Spring重定向的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 概述本文将重点介绍在 Spring 中实现重定向(Redirect),并将讨
2023-05-30

Spring中IOC和AOP的示例分析

小编给大家分享一下Spring中IOC和AOP的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring是一个开源框架,主要实现两件事,IOC(控制反转
2023-05-30

spring boot集成shiro的示例分析

小编给大家分享一下spring boot集成shiro的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!spring boot提供了一个自带的认证框架,同时
2023-05-30

spring中IoC和DI的示例分析

这篇文章主要介绍spring中IoC和DI的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!这里先来简单介绍下IoC和DI的区别:IOC:翻译过来是控制反转,将对象的创建权由Spring管理,HelloServ
2023-05-30

Spring Cloud Bus消息的示例分析

这篇文章将为大家详细讲解有关Spring Cloud Bus消息的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。概念我们使用配置中心时,当配置中心的配置发生了变化,我们就要发送一个post请求给客
2023-06-25

spring常用注解的示例分析

这篇文章给大家分享的是有关spring常用注解的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 、将普通类加入容器形成Bean的注解日常开发中主要使用到的定义Bean的注解包括(XML方式配置bean暂
2023-05-30

spring注解之@profile的示例分析

这篇文章给大家分享的是有关spring注解之@profile的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。spring中@profile与maven中的profile很相似,通过配置来改变参数。例如在开
2023-05-31

Spring依赖注入的示例分析

这篇文章给大家分享的是有关Spring依赖注入的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一.依赖简介一个典型的企业应用程序不是由一个单一的对象组成(或Spring的说法中的bean)。即使是最简单的
2023-06-03

Spring中IOC容器的示例分析

这篇文章将为大家详细讲解有关Spring中IOC容器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.Spring的IOC容器概述Spring的IOC的过程也被称为依赖注入(DI),那么对象可以
2023-06-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录