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容器如何运作?
活生生的工厂模式的应用。
二、IOC容器概述BeanFactory是一个基本的简单工厂,而ApplicationContext是一个高级工厂,它扩展了一些更高级更常用的功能(与AOP的集成、消息资源处理(国际化)等),我们一般都是基于ApplicationContext接口来实际操作。
然后有四大常用的实现类:
- classpathXmlApplicationContext
- FileSystemXmlApplicationContext
- AnnotationConfigApplicationContext
- 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();