最近在翻译Spring Framework Documentation 5.1.8.RELEASE. 觉得还是可以系统的将Spring5的知识点系统的再整理一下,于是有了这个Spring5参考指南系列,教程会一直更新,翻译也会同步进行,敬请期待。

为什么使用Spring5

Spring经过这么多年的发展,已经成为既定的企业级J2EE标准,其最大的优点即是轻量级和其最核心的IOC容器。 Spring最新的版本已经到了5.1.8,Spring5提供了很多新的特性,个人认为最主要的有3点:

  • 使用JDK8的新特性

    最引人注意的是Spring5使用了JDK8中的lambda表达式,让代码变得更加简洁。

  • 响应式编程支持

    响应式编程是Spring5中最主要的特性之一,响应式编程提供了另一种编程风格,专注于构建对事件做出响应的应用程序。 Spring5 包含响应流和 Reactor。

  • 响应式web框架

    Spring5提供了一个最新的响应式Web框架,Spring WebFlux,在编程理念和使用习惯方面和之前的传统Web框架都有了很大的区别。

当然,我们要拥抱新技术新变化,那么快来学习Spring5吧。

什么是IOC容器

IOC也称为依赖注入(DI)。它是指对象仅通过构造函数参数、工厂方法的参数或从工厂方法构造或返回对象实例后,通过在其上设置的属性来定义其依赖项(即与之一起工作的其他对象)的过程。

简单点说就是通过配置的参数来构造对象,然后通过配置的属性来实例化其依赖对象。一切都是通过配置来完成的,而不是使用通常的Java new方法来创建对象,也不需要手动去查找或者实例化其依赖对象,一切的一切都是通过Spring IOC容器来实现的。

IOC容器的两个主要包是:org.spring framework.beans和org.springframework.context包。

如果想使用IOC容器,下面两个依赖是必须的:

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-core</artifactId>
  4. <version>5.1.8.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework</groupId>
  8. <artifactId>spring-context</artifactId>
  9. <version>5.1.8.RELEASE</version>
  10. </dependency>

IOC容器中有两个非常重要的类:BeanFactory和ApplicationContext。

ApplicationContext是BeanFactory的子类,BeanFactory提供了对Bean的操作接口,ApplicationContext则是表示容器本身,提供了bean操作之外的如AOP接入,事件处理,消息资源接入和应用程序上下文等非常有用的特性。

org.springframework.context.ApplicationContext接口代表着SpringIOC容器,它负责实例化、配置和组装bean。容器通过读取配置元数据获取关于要实例化、配置和组装的对象的指令。配置元数据以XML、Java注释或Java代码来表示。它定义了组成应用程序的对象以及这些对象之间的丰富依赖关系。

如果你是创建一个单体应用,那么Spring提供了两个非常有用的ApplicationContext实现,ClassPathXMLApplicationContext或FileSystemXMLApplicationContext。

ClassPathXMLApplicationContext是从类路径去加载要装载的配置,FileSystemXMLApplicationContext是从文件路径去装载。

你只需要在配置中,定义你需要使用的业务对象(POJO),在创建和初始化ApplicationContext之后,您就拥有了一个完全配置且可执行的系统或应用程序.

配置元数据

配置配置,Spring的本质就是通过配置来展示和构建业务对象,通常来说,我们可以使用XML文件来配置,当然现在我们也可以使用Java注解和Java代码来实现。

Spring配置由容器必须管理的至少一个或多个bean定义组成。基于XML的配置元数据通常使用来表示。Java配置通常在@Configuration中使用@bean注解的方法。

下面是一个基本的基于XML的定义 daos.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. https://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean id="accountDao"
  7. class="com.flydean.daos.JpaAccountDao">
  8. <!-- additional collaborators and configuration for this bean go here -->
  9. </bean>
  10. <bean id="itemDao" class="com.flydean.daos.JpaItemDao">
  11. <!-- additional collaborators and configuration for this bean go here -->
  12. </bean>
  13. <!-- more bean definitions for data access objects go here -->
  14. </beans>

其中id是bean的唯一标记,class是bean的类路径。

实例化容器

Spring容器有很多种实例化方法,比如上面讲的单体应用的两个类:

  1. ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

上面已经列出了daos.xml , 这里我们再列出services.xml :

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. https://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!-- services -->
  7. <bean id="petStore" class="com.flydean.services.PetStoreService">
  8. <property name="accountDao" ref="accountDao"/>
  9. <property name="itemDao" ref="itemDao"/>
  10. <!-- additional collaborators and configuration for this bean go here -->
  11. <constructor-arg ref="accountDao"/>
  12. </bean>
  13. <!-- more bean definitions for services go here -->
  14. </beans>

service.xml 里面主要定义了对在定义在daos.xml中的bean的引用。这里的引用方式是通过ref. ref引用了daos.xml里面bean的id。

XML嵌套

除了上面例子中在创建ApplicationContext的时候,加载多个xml文件,其实我们也可以在xml中通过import来引入其他的xml文件。

  1. <import resource="daos.xml"/>

resource配置的是要引入的xml的路径,可以使用相对路径和绝对路径。不建议使用相对路径“…”来引用父目录中的文件。这样做会创建对当前应用程序外部文件的依赖关系。直接使用绝对路径又会影响不同部署环境下文件路径的位置。所以比较好的方法是在运行时根据JVM系统属性解析的“$…”占位符。

groovy bean定义DSL

除了xml定义,Spring也可以使用groovy bean来配置。

下面是daos.groovy的定义:

  1. import com.flydean.daos.JpaAccountDao;
  2. import com.flydean.daos.JpaItemDao;
  3. beans{
  4. accountDao(JpaAccountDao){
  5. }
  6. itemDao(JpaItemDao){
  7. }
  8. }

很简单,就是定义了2个bean。

下面是services.groovy的定义:

  1. import com.flydean.services.PetStoreService
  2. beans {
  3. petStore(PetStoreService, accountDao){
  4. accountDao=accountDao
  5. itemDao=itemDao
  6. }
  7. }

使用容器

ApplicationContext是高级工厂的接口,它能够维护不同bean的注册及其依赖。通过使用方法T getBean(String name, Class requiredType),获取到bean的实例。 ApplicationContext允许您读取bean定义并访问它们,如下例所示:

  1. // create and configure beans
  2. ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
  3. // retrieve configured instance
  4. PetStoreService service = context.getBean("petStore", PetStoreService.class);
  5. // use configured instance
  6. List<String> userList = service.getUsernameList();

上面讲到了groovy bean配置, 下面是怎么使用groovy bean:

  1. // create and configure beans with groovy
  2. //daos.groovy 必须写在services.groovy前面,否则会报bean找不到的错误
  3. ApplicationContext context = new GenericGroovyApplicationContext("daos.groovy","services.groovy");
  4. // retrieve configured instance
  5. PetStoreService service = context.getBean("petStore", PetStoreService.class);
  6. // use configured instance
  7. List<String> userList = service.getUsernameList();

使用groovy的时候请注意, daos.groovy 必须写在services.groovy前面,否则会报bean找不到的错误。

还可以使用XmlBeanDefinitionReader和GenericApplicationContext结合的方式:

  1. GenericApplicationContext context = new GenericApplicationContext();
  2. //reader with xml
  3. new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml");

你也可以使用GroovyBeanDefinitionReader来加载Groovy文件,如下所示:

  1. GenericApplicationContext context = new GenericApplicationContext();
  2. new GroovyBeanDefinitionReader(context).loadBeanDefinitions("services.groovy", "daos.groovy");

本教程的源代码可以参照:spring5-core-workshop 中的container模块。

更多作者的博客请查看flydean的博客http://www.flydean.com

Spring5参考指南:IOC容器的更多相关文章

  1. Spring5参考指南:容器扩展

    文章目录 BeanPostProcessor自定义bean BeanFactoryPostProcessor自定义配置元数据 使用FactoryBean自定义实例化逻辑 Spring提供了一系列的接口 ...

  2. Spring5参考指南:Bean的生命周期管理

    文章目录 Spring Bean 的生命周期回调 总结生命周期机制 startup和Shutdown回调 优雅的关闭Spring IoC容器 Spring Bean 的生命周期回调 Spring中的B ...

  3. Spring5参考指南:Bean作用域

    文章目录 Bean作用域简介 Singleton作用域 Prototype作用域 Singleton Beans 中依赖 Prototype-bean web 作用域 Request scope Se ...

  4. Spring5参考指南:依赖注入

    文章目录 依赖注入 依赖注入的配置详解 depends-on lazy-init 自动装载 方法注入 依赖注入 依赖注入就是在Spring创建Bean的时候,去实例化该Bean构造函数所需的参数,或者 ...

  5. spring5源码 -- IOC容器设计理念和核心注解的作用

    一. spring源码整体脉络介绍及源码编译 二. Spring IOC的源码深入学习 2.1 ioc容器的加载过程(重要) 2.2 bean的生命周期源码深度剖析 2.3 循环依赖总结讲解 2.4 ...

  6. Spring5参考指南:基于注解的容器配置

    文章目录 @Required @Autowired @primary @Qualifier 泛型 @Resource @PostConstruct和@PreDestroy Spring的容器配置可以有 ...

  7. Spring5参考指南:Bean的创建

    文章目录 Spring容器中的Bean Bean的命名 Bean的实例化 Spring容器中的Bean Bean在Spring中就是一个业务组件,我们通过创建各种Bean来完成最终的业务逻辑功能. 在 ...

  8. Spring5参考指南:SpringAOP简介

    文章目录 AOP的概念 Spring AOP简介 Spring AOP通知类型 写过程序的都知道OOP即面向对象编程. 从最开始的面向过程编程,到后面的面向对象编程,程序的编写方式发生了重大的变化,面 ...

  9. Spring5参考指南: BeanWrapper和PropertyEditor

    文章目录 BeanWrapper PropertyEditor BeanWrapper 通常来说一个Bean包含一个默认的无参构造函数,和属性的get,set方法. org.springframewo ...

随机推荐

  1. 看完这篇Exception 和 Error,和面试官扯皮就没问题了

    在 Java 中的基本理念是 结构不佳的代码不能运行,发现错误的理想时期是在编译期间,因为你不用运行程序,只是凭借着对 Java 基本理念的理解就能发现问题.但是编译期并不能找出所有的问题,有一些 N ...

  2. 201771010108-韩腊梅《面向对象程序设计(java)》第二周学习总结

    201771010108<面向对象程序设计(java)>第二周学习总结 第一部分:理论知识学习部分 第三章:Java的基本程序设计结构 1.标识符:① 标识符由字母.下划线.美元符号和数字 ...

  3. CountDownLatch是个啥?

    文章篇幅较短,对于一些AQS的顶级方法例如releaseShared并没有做过深的讲解,因为这些算是AQS的范畴,关于AQS可以看下另一篇文章--AQS.  CountDownLatch一般被称作&q ...

  4. 37.2 net-- tcp传输 ServerSocket、Socket

    一.打开server端 package day35_net_网络编程.tcp传输; import java.io.IOException; import java.io.InputStream; im ...

  5. Linux CentOS7 开通端口外网端口访问权限

    一.查看系统防火墙状态(如果返回 running 代表防火墙启动正常)firewall-cmd --state二.开启端口外网访问1.添加端口 返回 success 代表成功(--permanent永 ...

  6. Byte字节

    字节(Byte )是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位.最常用的字节是八位的字节,即它包含八位的二进制数. 中文名 字节 外文名 ...

  7. 使用d3.js的时候,如何用zoom translate scale限制拖拽范围

    红色代表需要改写的代码 1.添加定义图像大小和容器的大小及坐标 d3.behavior.zoom = function () { var moveCanvas={ width: , height: , ...

  8. L4文本预处理

    文本预处理 timemachine.txt数据下载地址 链接:https://pan.baidu.com/s/1RO2OLyTRQZ90HJUW7V7BCQ 提取码:bjox NLTK数据集下载 链接 ...

  9. summary && scenarios

    小组中期总结 项目目标: 我们的目标是制作一款pdf阅读器的必应查词插件,帮助大家在阅读英文资料的时候查单词更加的方便并且可以帮助人们英语学习. 痛点:对于在电脑上现在屏幕取词软件已经做得相当好了,所 ...

  10. 详解 通道 (Channel 接口)

    在本篇博文中,本人主要讲解NIO 的两个核心点 -- 缓冲区(Buffer) 和 通道 (Channel)之一的 缓冲区(Buffer), 有关NIO流的其他知识点请观看本人博文<详解 NIO流 ...