初识spring
spring框架的两大优势:
1.==简化开发== 简化了企业级开发的复杂性
2.==框架继承==高效整合了其他主流框架,提升运行与开发效率
核心思想:
1.IOC(控制反转)
2.AOC(面向切面编程)
spring发展史:
2004年Rod Johnson创建了更为高效的spring框架,
spring1.0: 是去全配置形式进行编程
spring2.0: 添加了注解功能,提高了开发效率
spring3.0: 完全变成了纯注解开发
spring4.0: 根据jdk的更新, 对个别jdk进行了调整
spring5.0: 全面支持jdk8, 这个时候如果要用spring框架就要使用jdk8至以上的版本
spring框架的架构图:
IOC与DI核心思想:
IOC(Inversion of Control 控制反转)
new对象这样层级之间的耦合性就会很高,IOC是将创建对象的权利移交给了外部,也就是spring,spring框架在外部创建了一个IOC容器,将创建的对象称之为Bean存储在容器中.当我们需要用到对象的时候,容器给我们提供了一个方法,我们就可以获取到对象,也解除了耦合性
DI(Dependency Injection 依赖注入)
往往一个对象的执行需要依赖于其他对象的支撑,这个时候spring框架会将IOC容器中存储的有依赖关系的bean进行依赖绑定.
IOC和DI的实现,为了实现充分的解耦,这样我们不仅可以直接从容器中拿到bean,而且bean也获取到了所有的依赖关系
使用配置文件简单实现IOC控制反转
<?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">
<!--在spring配置文件中配置管理bean-->
<!--配置数据实现层bean-->
<!-- id属性: 代表指定的bean名称,在从容器中获取bean的时候,用此名称可以获取到此bean-->
<!-- class属性: 指定bean的类型,这里用全类名指定到数据实现层的实现类BookDaoImpl,代表创建的bean是BookDaoImpl类型-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
</bean>
<!--配置业务实现层bean-->
<!-- id属性: 代表指定的bean名称,在从容器中获取bean的时候,用此名称可以获取到此bean-->
<!-- class属性: 指定bean的类型,这里用全类名指定到数据实现层的实现类BookServiceImpl,代表创建的bean是BookServiceImpl类型-->
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<!--而业务实现层对象是依赖于数据实现层对象运行的,所以service层依赖dao层,使用DI进行依赖注入-->
<!--name属性:代表配置的哪一个具体的属性-->
<!--ref属性: 代表依赖的哪一个bean,这里依赖的是dao层的bean-->
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
实例化bean的三种实现方式:
构造方法:
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
静态/非静态工厂方法: (有些老一点的程序为了解耦创建了对象工厂)
实例化工厂的升级方法:
bean的生命周期
1.使用属性:
init-method="初始化方法" destroy-method="销毁前执行的方法"
2.使用接口
InitializingBean, DisposableBean
实现这两个类,重写方法
bean的销毁时机:
在容器销毁的时候才会执行bean的销毁方法,
1.手动关闭容器:
ConfigurableApplicationContext
接口的close()
方法2.注册关闭钩子(在虚拟机关闭前,先关闭容器再关闭虚拟机)
ConfigurableApplicationContext
接口的registerShutdownHook()
方法
DI的简单实现
setter注入:
使用<property>标签
<property name="bookDao" ref="bookDao"/>
name属性是指set方法,ref属性是对应容器中的bean对象
构造器注入:
使constructor-arg>标签
<constructor-arg name="bookDao" ref="bookDao"/>
name属性是指构造方法中的参数名,ref属性是对应容器中的bean对象
注入基本数据类型:
<var>标签换为<value>
自动装配:
概念:
IOC容器根据bean需要的依赖,自动在容器中找到对应的bean进行装配注入
使用autowire属性关键字:
autowire="byType" 根据类型进行自动装配(需保证bean的唯一性,推荐使用)
autowire="byName" 根据bean名称进行装配(不推荐使用)
集合注入:
<!--注入数组数据--> <property name="array"> <array> <value>100</value> <value>200</value> </array> </property> <!--注入list集合数据--> <property name="list"> <list> <value>aa</value> <value>bb</value> </list> </property> <!--注入set集合数据(会自动删选重复数据)--> <property name="set"> <set> <value>aa</value> <value>aa</value><!--会被筛选掉--> </set> </property> <!--注入map集合数据--> <property name="map"> <map> <entry key="键1" value="值1"/> <entry key="键2" value="值2"/> </map> </property> <property name="properties"> <props> <prop key="country">china</prop> <prop key="province">henan</prop> <prop key="city">kaifeng</prop> </props> </property>
property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写<array>、<list>、<set>、<map>、<props>标签