快捷搜索:  汽车  科技

spring技术简介(Spring官方文档解读一)

spring技术简介(Spring官方文档解读一)ApplicationContext接口代表的是springIOC容器,负责实体化、配置、组装Bean,容器通过读取配置元数据来获取有关实例化、配置和组装的基本信息,配置元数据通常以XML、java注解和java代码的方法。然后有四大常用的实现类:IOC容器如何运作?活生生的工厂模式的应用。BeanFactory是一个基本的简单工厂,而ApplicationContext是一个高级工厂,它扩展了一些更高级更常用的功能(与AOP的集成、消息资源处理(国际化)等),我们一般都是基于ApplicationContext接口来实际操作。

之前文章太长了,在此重新解读并分割下,我也正好重新再学习了。

一、IOC容器

IOC:控制反转,对象的创建不是我们平常使用new关键字去创建,而是通过容器在初始化的时候自动创建,反转的是对象的创建方式,此种方式和我们之前的工厂模式比较相似,对象在工厂创建的时候会自动一并创建,也就是说IOC基础其实就是工厂模式,IOC的最基本的一个接口就是beanFactory。

DI:依赖注入,当一个对象在容器中创建时,对象中的依赖属性可能是其他对象,因此会依次创建其依赖的对象,并以此继续依赖创建直至所有的依赖对象均创建成功。

IOC/DI两个说的其实是一种,只是理解角度的不同。

IOC容器如何运作?

spring技术简介(Spring官方文档解读一)(1)

  • 1、创建一个描述类信息(元数据)的配置文件(如XML文件),描述类在容器中的别名、类的全限定名、对象生成方式(构造、工厂方法)等,BeanDefinition
  • 2、IOC容器读入上述配置文件,解析配置文件中的信息,通过java的反向机制创建对象(构造、工厂方法);
  • 3、通过容器提供的方法取出对象来使用。
  • 活生生的工厂模式的应用。

    二、IOC容器概述

    spring技术简介(Spring官方文档解读一)(2)

    BeanFactory是一个基本的简单工厂,而ApplicationContext是一个高级工厂,它扩展了一些更高级更常用的功能(与AOP的集成、消息资源处理(国际化)等),我们一般都是基于ApplicationContext接口来实际操作。

    然后有四大常用的实现类:

    1. classpathXmlApplicationContext
    2. FileSystemXmlApplicationContext
    3. AnnotationConfigApplicationContext
    4. WebApplicationContext

    ApplicationContext接口代表的是springIOC容器,负责实体化、配置、组装Bean,容器通过读取配置元数据来获取有关实例化、配置和组装的基本信息,配置元数据通常以XML、java注解和java代码的方法。

    在spring的早期版本中,XML是定义元数据的传统方式,XML配置比较繁琐,因此spring后面增加了基于注解的方式来配置元数据,现在我们可以仅使用少量的XML结合注解或者纯注解方式来使用Spring的相关功能。

    三、元数据的配置

    元数据的配置是告诉IOC容器如何去实体化、配置、组装对象的关键信息。

    在早期版本中使用XML格式的配置比较常见。

    XML配置不是唯一的方式,springIOC容器本身和配置文件格式是完全无关的,因此可以自定义配置文件,当然现在基于注解和java的配置是主流。

    • 基于注解的配置:Spring 2.5引入了对基于注释的配置元数据的支持。
    • 基于java的配置:从Spring 3.0开始,可以使用Java而不是XML文件来定义应用程序类外部的bean。如 @Configuration, @Bean, @Import和@DependsOn注释等。

    配置元数据管理至少一个以上的Bean,在基于XML中以<bean></bean>节点表示,java配置中以@bean@component@Configuration等注解表示。

    bean定义对应的除了简单java类之外,还包括服务层对象、数据访问对象等。

    一个典型的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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="..." class="..."> </bean> <bean id="..." class="..."> </bean> <!--更多的bean定义 --> </beans>四、实例化容器

    通过给 ApplicationContext构造函数提供一个或多个资源位置字符串,可以让容器从部资源加载配置元数据。

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

    service.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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl"> <property name="accountDao" ref="accountDao"/> <property name="itemDao" ref="itemDao"/> </bean> </beans>

    daos.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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="accountDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao"> </bean> <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao"> </bean> </beans>

    也可以加载一个主XML配置文件,主XML文件内引入其他XML配置文件。

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

    services.xml

    <beans> <import resource="resources/daos.xml"/> <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl"> <property name="accountDao" ref="accountDao"/> <property name="itemDao" ref="itemDao"/> </bean> </beans>

    注意:resouce资源路径,建立使用相对路径或者classpath路径,classpath路径一般在项目中指代src文件夹或者resource文件夹。

    五、容器的使用

    ApplicationContext是一个维护bean定义以及相互依赖的注册表的高级工厂的接口。通过使用方法getBean您可以获取bean的实例。

    T getBean(String name Class<T> requiredType)

    // 创建容器 ApplicationContext context = new ClassPathXmlApplicationContext("services.xml" "daos.xml"); // 获取对象 PetStoreService service = context.getBean("petStore" PetStoreService.class); // 使用对象 List<String> userList = service.getUsernameList();

    猜您喜欢: