Spring核心概念
IOC(Inversion of Control)控制反转
- 使用对象那个时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权转移到外部,思想称为控制反转
Spring技术对IOC思想进行了实现
- Spring提供一个容器,称为IOC容器,用来充当IOC思想中的“外部”
- IOC容器负责对象的创建,初始化等一系列工作,被创建或被管理的对象在IOC容器中统称为bean
IOC入门案例思路分析
- 管理什么?(Service和Dao)
- 如何将被管理的对象告知IOC容器?(配置)
- 被管理的对象交给IOC容器,如何获取到IOC容器?(接口)
- IOC容器得到后,如何从容器中获取bean?(接口方法)
- 使用Spring导入哪些坐标?(pom.xml)
IOC入门案例实现
- 导入spring坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
- 定义Spring管理的类(接口)
publicinterfaceBookService {
publicvoidsave();
}
publicclassBookServiceImplimplementsBookService {
privateBookDaobookDao= (BookDao) newBookDaoImpl();
publicvoidsave(){
System.out.println("book service save....");
bookDao.save();
}
}
- 创建Spring配置文件,配置对应类作为Spring管理的bean
<?xmlversion="1.0" encoding="UTF-8"?>
<beansxmlns="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">
<!-- 1.导入spring的坐标。spring-context 对应版本5.2.10Release..-->
<!-- 2.配置bean
id属性标识起名
class属性表示给bean定义类型-->
<beanid="BookDao"class="com.wangxh.dao.impl.BookDaoImpl"/>
<beanid="bookService"class="com.wangxh.service.impl.BookServiceImpl"/>
</beans>
- 初始化IOC容器(spring核心容器/spring容器)通过获取bean
publicclassApp2 {
publicstaticvoidmain(String[] args) {
//3.获取IOC容器
ApplicationContextctx=newClassPathXmlApplicationContext("applicatonContext.xml");
//4.获取bean
BookDaobookDao= (BookDao) ctx.getBean("BookDao");
bookDao.save();
}
}
DI(Dependency injection)依赖注入
- 在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
DI入门案例思路分析
- 基于IOC管理bean、
- service中使用new形式的Dao对象保留?(否)
- service中需要的Dao对象如何进入到service中?(提供方法)
- service与dao间的关系如何描述(配置)
DI入门案例
- 删除使用new的形式创建对象的代码
publicclassBookServiceImplimplementsBookService {
privateBookDaobookDao;
publicvoidsave(){
bookDao.save();
}
}
- 提供依赖对象对应的setter方法
//6.提供setter方法
publicvoidsetBookDao(BookDaobookDao) {
this.bookDao=bookDao;
}
- 配置service与dao之间的关系
<?xmlversion="1.0" encoding="UTF-8"?>
<beansxmlns="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">
<!-- 1.导入spring的坐标。spring-context 对应版本5.2.10Release..-->
<!-- 2.配置bean
id属性标识起名
class属性表示给bean定义类型-->
<beanid="BookDao"class="com.wangxh.dao.impl.BookDaoImpl"/>
<beanid="BookService"class="com.wangxh.service.impl.BookServiceImpl">
<!-- 7.配置service与dao的关系-->
<!-- property标签表示配置当前bean的属性
name属性表示配置哪一个具体的属性
ref表示参照哪一个bean-->
<propertyname="bookDao"ref="BookDao"></property>
</bean>
</beans>
Bean
bean基础配置
bean别名配置
bean作用范围配置
- 作用范围说明
- 为什么bean默认为单例?
- 适合交给容器进行管理的bean(适合造单例)
- 表现层对象
- 业务层对象
- 数据层对象
- 工具对象
- 不适合交给容器进行管理的bean
- 封装实体的域对象
bean实例化
bean是如何创建出来的,实例化bean的三种方式
- 使用构造方法来实例化bean(常用)
publicclassBookDaoImplimplementsBookDao {
publicvoidsave(){
System.out.printin("book dao save...")
}//这里需要使用无参构造器,如果不存在则会抛出BeanCreationException
}
- 配置
<bean>
id="bookDao"
class="com.wangxh.com.impl.BookDaoimpl"/>
- 使用静态工厂来实例化bean(了解 )
- 静态工厂
publicclassOrderDaoFactory{
publicstaticOrderDaogeOrdereDao(){
returnnewOrderDapImpl();
}
}
- 配置
<bean
id="orderDao"
factory-method="getOrderDao"
class="com.wangxh.factory.OrderDaoFactory"/>
- 使用FactoryBean实例化Bean
publicclassUserDaoFactoryBeanimplementsFactoryBean<UserDao> {
publicUserDaogetObject() throwsException {
returnnewUserDaoImpl();
}
publicClass<?>getObjectTyoe(){
returnUserDao.class
}
}
- 配置
<bean
id="userDao"
class="com.wangxh.factory.UserDaoFactoyBean"/>
bean的生命周期
- 1提供生命周期控制方法
publicclassBookDaoImplimplementsBookDao {
publicvoidsave(){
System.out.println("book dao save...");
}
publicvoidinit(){
System.out.println("book dao save...");
publicvoiddestory(){
System.out.println("book dao save...");
}
- 配置生命周期控制方法
<beanid="bookDao"class="com.wangxh.dao.impl.BookDaoimpl"init-method="init"destory-method="destory"/>
- 2实现InitializingBean,DisprosableBean接口(了解有这个即可)
- 初始化容器
- 创建对象(内存分配)
- 执行构造方法
- 执行属性注入(set操作)
- 执行bean初始化方法
- 使用bean
- 执行业务操作
- 关闭/销毁容器
- 执行bean销毁方法
- 关闭容器方式
- 手工关闭容器
ConfigurableApplicationContext接口close()操作
- 注册关闭钩子,在虚拟机退出前关闭容器再退出虚拟机
ConfigurableApplicationContext接口registerShutdownHook()操作