学习《Spring+Spring MVC+Mybatis整合开发实战》笔记
Spring IoC容器
- IoC容器替代了传统的new方式初始化对象,通过读取在XML文件中配置的Bean定义,自动创建并管理容器的Bean实例及其生命周期。
- 可以在Bean的定义中进行依赖对象的配置,降低对象之间的耦合程度,以达到解耦的效果。
- Spring提供了多种依赖注入方式,包括构造函数注入和设置值注入。
1.IoC与DI简介
IoC(Inversion of Control,控制反转)是一种编程思想,或者说设计模式。IoC模式将耦合从代码中移出去,放入配置中,如XML文件,容器在启动时依据依赖配置生成依赖对象并注入。使用IoC容器后,代码从内部的耦合转到外部容器,解耦性更高,也更灵活。 控制权的转移,即控制反转,就是指依赖对象创建的控制权从应用程序本身转移到外部容器。控制反转的实现策略:
- 依赖查找(Dependency Lookup):首先需要将依赖或服务进行注册,然后通过容器提供的API来查找依赖对象和资源。
- 依赖注入(Dependency Injection,简称DI):依赖对象通过注入进行创建,由容器负责组件的创建和注入。根据配置将符合依赖关系的对象传递给需要的对象。两种常见依赖注入方式:
DI是IoC这种设计思想的一种实现。控制反转乃至依赖注入的目的并不是提升系统性能,而是提升组件重用性与系统的可维护性。
2.Spring容器初始化
- Spring IoC容器用来创建和管理类的实例称为Bean,根据Bean的配置可以使用BeanFactory创建和管理Bean实例。
- Spring容器最重要的作用就是根据配置注入依赖对象。
BeanFactory和ApplicationContext是Spring进行对象管理的两个主要接口。ApplicationContext继承自BeanFactory,除了基本的对象管理之外,还提供了应用程序所需要的其他上下文信息。
BeanFactory位于org.springframework.beans包中; ApplicationContext位于org.springframework.context包中。 下面主要介绍ApplicationContext的初始化方式。
2.1 ApplicationContext初始化方式
- ClassPathXmlApplicationContext是从类的根路径开始获取XML的配置文件;
- FileSystemXmlApplicationContext是默认从项目根路径查找配置文件。
在Spring中。使用“classpath:”来表示类的根路径,如果加上*号,即“classpath * :”则除了自身的类路径之外,同时也会查找依赖库(.jar)下的目录。对于不同的配置文件位置,容器的初始化方法如下: (1) 配置文件位于项目的类的根路径下
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:applicationContext.xml");
(2) 配置文件位于类的根路径的子目录下
ApplicationContext context = new ClassPathXmlApplicationContext("first/second/applicationContext.xml");
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:first/second/applicationContext.xml");
(3) 配置文件位于项目的根路径下
ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml");
(4) 配置文件位于项目的根路径的子目录下,如config目录下
ApplicationContext context = new FileSystemXmlApplicationContext("config/applicationContext.xml");
(5)使用file协议访问方式
ApplicationContext context = new FileSystemXmlApplicationContext("file://D:/Software/Eclipse/Eclipse-workspace/first/config/applicationContext.xml");
(6)动态加载Bean
GenericApplicationContext context = new GenericApplicationContext();
new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml","daos.xml");
context.refresh();
若配置文件最终位于类路径下,建议使用ClassPathXmlApplicationContext;
若配置文件和源代码文件分开,位于项目的其他路径,建议使用FileSystemXmlApplicationContext。
2.2 Spring基于XML的配置文件结构
一个简单的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="helloWorld" class="first.HelloWorld"></bean>
</beans>
- <?xml version="1.0" encoding="UTF-8"?>表示XML的版本和编码,供XML解析器使用
- 根元素是< beans>,通过< beans>元素的属性定义对根元素下子元素的定义进行规范,< beans>的基本属性包括xmlns、xmlns:xsi、xsi:schemaLocation.
- xmlns是XML Namespace的缩写,即XML命名空间,为了解决XML元素重名的问题,类似于Java中类的包名的作用。xmlns定义了默认的命名空间。
- xmlns:xsi表示使用xsi作为前缀的命名空间,这个属性是为了下面的xsi:schemaLocation的定义。
- xsi:schemaLocation用于定义命名空间和对应的XSD(XML结构定义)文档的位置关系,两者是成对配置的。Schema处理器将从指定的位置读取Schema文档,根据描述的文档结构验证XML文件是否符合规范。
2.3 Bean的配置方式
Bean的配置方式就是直接在根元素< beans>下增加< bean>的子元素,配置示例如下:
<bean id="helloWorld" class="first.HelloWorld"/>
一个Bean元素包含两个基本属性:class、id。
- class的值是包含包名的全路径类名,必须是类不能使用接口;
- id属性给这个类的实例一个标识,方便容器和程序查找使用。
若不设定id的属性和值,容器默认以类名的首字母小写作为标识,上例中设置id为helloWorld和不设定id的效果是一样的。
2.4 容器的关闭
对于非Web应用,建议使用close()方法关闭容器。 close()方法是AbstractApplicationContext抽象类才开始具有的。其初始化和关闭代码如下:
AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring-beans.xml");
context.close();
在实际场景中,可能遇到RuntimeException异常关闭或者使用操作系统强制关闭。这时可以使用关闭钩子(ShutdownHook),注册关闭钩子只需加入以下代码,其中registerShutdownHook()也是AbstractApplicationContext抽象类才具有的:
context.registerShutdownHook()
3.依赖注入方式
依赖关系注入使用配置的方式,而不是固定写在代码里,来实现系统的解耦,有构造函数注入和设置值注入两种常见方式。
3.1构造函数注入
<?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="userDao" class="learning.UserDao" />
<bean id="userService" class="learning.UserService">
<constructor-arg>
<ref bean="userDao" />
</constructor-arg>
</bean>
</beans>
其中,constructor-arg的子元素配置可简写为< constructor-arg ref=“userDao” />
3.2设置值注入
在配置文件中使用< bean>元素的property子元素注入依赖对象,name对应bean类中的属性名,ref设置为依赖bean的id
<?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="userDao" class="learning.UserDao" />
<bean id="userService" class="learning.UserService">
<property name="userDao" ref="userDao" />
</bean>
</beans>
|