1.初始Spring
- 官网:Spring.io
- Spring发展到今天已经形成了一种开发的生态圈,Spring提供了若干个项目,每个项目用于完成特定的功能


2.Spring Framework系统架构
- SpringFramework是Spring生态圈中最基础的项目,是其他项目的根基

3.Spring Framework 核心概念
问题与解决方案
- 代码书写现状
- 耦合度偏高
- 解决方案
- 使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象
- IoC(Inversion of Control)控制反转
- 对象的创建控制权由程序转移到外部,这种思想称为控制反转

IoC(Inversion of Control)控制反转
- 使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转
Spring技术对Ioc思想进行了实现
- Spring提供了一个容器,称为Ioc容器,用来充当Ioc思想中的外部
- IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean
DI(Dependency Injection)依赖注入
- 在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
目标:充分解耦
- 使用IoC容器管理bean(IoC)
- 在IoC容器内将有依赖关系的bean进行关系绑定(DI)
最终效果
- 使用对象时不仅可以直接从Ioc容器中获取,并且获取到的bean已经绑定了所有的依赖关系

4.IoC入门案例
IoC入门案例思路分析
- 1.管理什么?(Service与Dao)
- 2.如何将被管理的对象告知IoC容器?(配置)
- 3.被管理的对象交给IoC容器,如何获取到IoC容器?(接口)
- 4.IoC容器得到后,如何从容器中获取bean?(接口方法)
- 5.使用Spring导入哪些坐标?(pom.xml)
pom.xml:
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javadan</groupId>
<artifactId>spring_01_quickstart</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.29</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
resources/applicationContext.xml:
XML
<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">
<!--1.在pom.xml中导入spring的坐标spring-context,对应版本是5.3.29 -->
<!--2.配置bean -->
<!-- bean标签表示配置bean-->
<!-- id属性表示给bean起名字-->
<!-- class属性表示给bean定义类型-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/>
</beans>
BookDao.java:
java
package com.itheima.dao;
public interface BookDao {
public void save();
}
BookDaoImpl.java:
java
package com.itheima.dao.impl;
import com.itheima.dao.BookDao;
public class BookDaoImpl implements BookDao {
@Override
public void save() {
System.out.println("book dao save...");
}
}
BookService.java:
java
package com.itheima.service;
public interface BookService {
public void save();
}
BookServiceImpl.java:
java
package com.itheima.service.impl;
import com.itheima.dao.BookDao;
import com.itheima.dao.impl.BookDaoImpl;
import com.itheima.service.BookService;
public class BookServiceImpl implements BookService {
private BookDao bookDao = new BookDaoImpl();
@Override
public void save() {
System.out.println("book service save...");
bookDao.save();
}
}
App.java:
java
package com;
import com.itheima.service.BookService;
import com.itheima.service.impl.BookServiceImpl;
public class App {
public static void main(String[] args) {
BookService bookService = new BookServiceImpl();
bookService.save();
}
}
App2.java:
java
package com;
import com.itheima.dao.BookDao;
import com.itheima.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App2 {
public static void main(String[] args) {
//3.获取IoC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//4.获取bean
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
System.out.println("---------");
BookService bookService = (BookService) ctx.getBean("bookService");
bookService.save();
}
}

5.DI入门案例
DI入门案例思路分析
- 1.基于Ioc管理bean
- 2.Service中使用new形式创建的Dao对象是否保留?(否)
- 3.Service中需要的Dao对象如何进入到Service中?(提供方法)
- 4.Service与Dao间的关系如何描述?(配置)
DI案例实在IoC案例的代码基础上改的
①删除使用new的形式创建对象的代码(BookServiceImpl.java)
②提供依赖对象对应的setter方法(BookServiceImpl.java)
java
package com.itheima.service.impl;
import com.itheima.dao.BookDao;
import com.itheima.service.BookService;
public class BookServiceImpl implements BookService {
//5.删除业务层中使用new的方式创建的dao对象
private BookDao bookDao ;
@Override
public void save() {
System.out.println("book service save...");
bookDao.save();
}
//6.提供对应的set方法
public void setBookDao(BookDao bookDao){
this.bookDao = bookDao;
}
}
③配置service和dao之间的关系(applicationContext.xml)
XML
<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">
<!--1.在pom.xml中导入spring的坐标spring-context,对应版本是5.3.29 -->
<!--2.配置bean -->
<!-- bean标签表示配置bean-->
<!-- id属性表示给bean起名字-->
<!-- class属性表示给bean定义类型-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<!-- 7.配置Service与dao 的关系 -->
<!-- property标签表示配置当前bean的属性-->
<!-- name属性表示配置哪一个具体的属性-->
<!-- ref属性表示参照哪一个bean-->
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>

6.Bean的基础配置
bean的基础配置
| 类别 | 描述 |
|---|---|
| 名称 | bean |
| 类型 | 标签 |
| 所属 | beans标签 |
| 功能 | 定义spring核心容器管理的对象 |
| 格式 | <beans> <bean/> <bean></bean> </beans> |
| 属性 | id:bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id值唯一列表 class:bean的类型,即配置的bean的全路径类名 |
| 范例 | <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/> <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"></bean> |
bean的别名配置
| 类别 | 描述 |
|---|---|
| 名称 | name |
| 类型 | 属性 |
| 所属 | bean标签 |
| 功能 | 定义bean的别名,可定义多个,使用逗号(,)分号(;)空格( )分隔 |
| 范例 | <bean id="bookDao" name="dao bookDaoImpl" class="com.itheima.dao.impl.BookDaoImpl"/> <bean name="service,bookServiceImpl" class="com.itheima.service.impl.BookServiceImpl"/> |
注意事项
获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常NoSuchBeanDefinitionException
NoSuchBeanDefinitionException: No bean named 'bookServiceImpl' available
bean作用范围配置
| 类别 | 描述 |
|---|---|
| 名称 | scope |
| 类型 | 属性 |
| 所属 | bean标签 |
| 功能 | 定义bean的作用范围,可选范围如下 * siggleton:单例(默认) * prototype:非单例 |
| 范例 | <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype" /> |
bean作用范围说明
- 为什么bean默认为单例?
- 适合交给容器进行管理的bean
表现层对象
业务层对象
数据层对象
工具对象
- 不适合交给容器进行管理的bean
封装实体的域对象
7.bean的实例化--构造方法(常用)
- bean本质上就是对象,创建bean使用构造方法完成
提供可访问的构造方法(可不写无参构造,前提是没有写有参构造)

配置

8.bean的实例化--静态工厂(了解)
- 静态工厂

- 配置

9.bean的实例化--实例工厂(了解)
- 实例工厂

- 配置

10.bean的实例化--FactoryBean(实用)
- FactoryBean

- 配置

11.bean的生命周期
-
生命周期:从创建到消亡的完整过程
-
bean生命周期:bean从创建到销毁的整体过程
-
bean生命周期控制:在bean创建后到销毁前做一些事情
-
提供生命周期的控制方法

- 配置生命周期控制方法

或者接口控制(了解)
- 实现InitializingBean,disposableBean接口

bean生命周期
- 初始化容器
1.创建对象(内存分配)
2.执行构造方法
3.执行属性注入(set操作)
4.执行bean初始化方法
- 使用bean
1.执行业务操作
- 关闭/销毁容器
1.执行bean销毁方法
bean销毁时机
- 容器关闭前触发bean的销毁
- 关闭容器俩种方式:
①手工关闭容器
ConfigurableApplicationContext接口close()操作
②注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机
ConfigurableApplicationContext接口registerShutdownHook()操作
