文章目录
- 💨更多相关知识👇
- 前言
-
- 一、为什么要学Spring?
- 二、IoC 和 DI 介绍
-
- 🍂Ioc的入门案例
-
- ⭐代码演示
- 🍂DI的入门案例
-
- ⭐代码演示
- 三、bean的配置(bean其实就是用来创建对象的)
-
- 🌿bean基础配置
-
- ⭐代码演示
- 🌿bean别名配置
-
- ⭐代码演示
- 四、bean的作用范围
-
-
- ⭐singleton单例范围代码演示
- ⭐prototype多例范围代码演示
-
- 五、bean的生命周期
-
- 🍁bean生命周期的使用步骤
-
- ⭐代码演示
- ⚡注意事项⚡
- 🍁bean的销毁时机
-
- ⭐代码演示
- 作者:KJ.JK
💨更多相关知识👇
💖异常处理与解决方案详解上篇
💖异常处理与解决方案详解下篇
💖Math类与System类的常用方法使用
💖JavaEE中的静态方法定义、方法重载要求、return作用详解
💖List接口的常用方法,精华总结
💖JavaEE里面的所有内部类详细介绍与使用
💖ArrayList集合中的常用成员方法
💖JavaEE中的Stream流的常用方法
💖JavaEE中的Stream流知识点使用,精华总结,一文直接上手
🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
🍂个人博客首页: KJ.JK
欢迎大家点赞👍收藏💖评论💬关注🔒
💖源码获取 | 💻学习交流 | 🤝商务合作 | 💨私信作者
前言
本文将带大家使用并了解Spring的xml版上篇,后续会更新Spring的注解版以及Spring的全家桶,喜欢的可以点个订阅不迷路
一、为什么要学Spring?
* 简化开发,降低企业级开发的复杂性
* 框架整合,高效整合其他技术,提高企业级应用开发与运行效率
* 官网:spring.io
二、IoC 和 DI 介绍
"IoC(Inversion of Control)控制反转"
* IoC: 使用对象时,由主动new产生对象转换为由"外部提供对象",
此过程中对象创建控制权由程序转移到外部,此思想称为控制反转 "(把创建对象的能力交给Spring中的IOC容器)"
------------------------------------------------------------------------------------------------------------
"Spring技术对IoC思想进行了实现"
* Spring提供了一个容器,称为"IoC容器",用来充当IoC思想中的"外部"
* IoC容器"负责对象的创建、初始化等一系列工作","被创建或被管理的对象在IoC容器中统称为Bean"
------------------------------------------------------------------------------------------------------------
"DI(Dependency Injection)依赖注入"
* 在容器中建立bean与bean之间的依赖关系的整个过程,称为"依赖注入" "(给成员变量赋值)"
* 作用: 充分解耦
🍂Ioc的入门案例
"步骤:"
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.导入Spring坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
2.定义Spring管理的类 (接口)
public interface BookService {
void save();
}
public class BookServiceImpl implements BookService {
private BookDao bookDao = new BookDaoImpl();
public void save() {
bookDao.save();
}
}
3.创建Spring配置文件,配置对应类作为Spring管理的bean
/*
注意:
bean定义id属性在同一个上下文中不能重复
*/
⭐代码演示
// 数据访问层接口
public interface BookDao {
void save();
}
------------------------------------------------------------------------------------------------------------
// 数据访问层实现类
public class BookDaoImpl implements BookDao {
private int connectionNumber;
private String databaseName;
@Override
public void save() {
System.out.println("保存 <<富婆通讯录>>");
}
}
------------------------------------------------------------------------------------------------------------
//SpringXML文件
<?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">
<!-- IoC容器可以理解为一个Map集合
bean标签:配置类的信息,会在IoC容器中创建对象
class属性:类全名(包名.类名)
id属性:唯一标识,取个名字,将来通过id的值来获取对象
-->
<!-- 等价于 book =new BookServiceImpl
bean其实就是用来创建对象的
-->
<bean class="com.itheima.service.impl.BookServiceImpl" id="bookService"></bean>
</beans>
------------------------------------------------------------------------------------------------------------
//业务层接口类
public interface BookService {
void save();
}
------------------------------------------------------------------------------------------------------------
// 业务层实现类
public class BookServiceImpl implements BookService {
private BookDao bookDao =new BookDaoImpl();
@Override
public void save() {
bookDao.save();
}
}
------------------------------------------------------------------------------------------------------------
//测试类
@Test
public void testGetBeanById() {
//1.创建IoC容器对象,加载Spring核心配置文件 //这里写的是Springxml文件的名字
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
//2.从IoC容器中获取Bean对象
//面向接口编程,把Object改为对应的接口
// Object bookService = ctx.getBean("bookService");
//这里写的是application.xml里面bean的id
BookService bookService = (BookService) ctx.getBean("bookService");
//3.调用Bean对象(BookService对象)的方法
bookService.save();
//4.关闭容器
ctx.close();
}
🍂DI的入门案例
"步骤:"
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.删除使用new的形式创建对象的代码
2.提供依赖对象对应的setter方法
3.配置service与dao之间的关系
⭐代码演示
// 数据访问层接口
public interface BookDao {
void save();
}
------------------------------------------------------------------------------------------------------------
// 数据访问层实现类
public class BookDaoImpl implements BookDao {
private int connectionNumber;
private String databaseName;
@Override
public void save() {
System.out.println("保存 <<富婆通讯录>>");
}
}
------------------------------------------------------------------------------------------------------------
//SpringXML文件
<?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">
<!-- IoC容器可以理解为一个Map集合
bean标签:配置类的信息,会在IoC容器中创建对象
class属性:类全名(包名.类名)
id属性:唯一标识,取个名字,将来通过id的值来获取对象
-->
<!-- 等价于 book =new BookServiceImpl
bean其实就是用来创建对象的
-->
<bean class="com.itheima.service.impl.BookServiceImpl" id="bookService">
<!-- 给BookServiceImpl的bookDao成员变量赋值 ref:引用IOC容器中对的bookDao
property标签:依赖注入,通过set方法输入
name:类中的成员变量
ref:注入的对象-->
<property name="bookDao" ref="bookDao"></property>
</bean>
<!--IOC容器创建BookDaoImpl对象-->
<!-- bookDao =new BookDaoImpl() -->
<bean class="com.itheima.dao.impl.BookDaoImpl" id="bookDao"></bean>
</beans>
------------------------------------------------------------------------------------------------------------
//业务层接口类
public interface BookService {
void save();
}
------------------------------------------------------------------------------------------------------------
// 业务层实现类(发生改变)
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void save() {
bookDao.save();
}
}
------------------------------------------------------------------------------------------------------------
//测试类
@Test
public void testGetBeanById() {
//1.创建IoC容器对象,加载Spring核心配置文件 //这里写的是Springxml文件的名字
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
//2.从IoC容器中获取Bean对象
//面向接口编程,把Object改为对应的接口
// Object bookService = ctx.getBean("bookService");
//这里写的是application.xml里面bean的id
BookService bookService = (BookService) ctx.getBean("bookService");
//3.调用Bean对象(BookService对象)的方法
bookService.save();
//4.关闭容器
ctx.close();
}
三、bean的配置(bean其实就是用来创建对象的)
🌿bean基础配置
类别 描述
名称 bean
类型 标签
所属 beans标签
功能 定义Spring核心容器管理的对象
格式 <beans>
<bean/>
<bean></bean>
</beans>
属性
列表 " id: 唯一标识,取个名字,将来通过id的值来获取对象
" class: bean的类型,即配置的bean的全路径类名(包名.类名)
------------------------------------------------------------------------------------------------------------
* 例子:
* <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
* <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"></bean>
⭐代码演示
<?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">
<!-- IoC容器可以理解为一个Map集合
bean标签:配置类的信息,会在IoC容器中创建对象
class属性:类全名(包名.类名)
id属性:唯一标识,取个名字,将来通过id的值来获取对象
-->
<!-- 等价于 book =new BookServiceImpl
bean其实就是用来创建对象的
-->
<bean class="com.itheima.service.impl.BookServiceImpl" id="bookService">
<!-- 给BookServiceImpl的bookDao成员变量赋值 ref:引用IOC容器中的bookDao
property标签:依赖注入,通过set方法输入
name:类中的成员变量
ref:注入的对象-->
<property name="bookDao" ref="bookDao"></property>
</bean>
<!--IOC容器创建BookDaoImpl对象-->
<!-- bookDao =new BookDaoImpl() -->
<bean class="com.itheima.dao.impl.BookDaoImpl" id="bookDao"></bean>
</beans>
🌿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
*/
⭐代码演示
//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">
<!-- IoC容器可以理解为一个Map集合
bean标签:配置类的信息,会在IoC容器中创建对象
class属性:类全名(包名.类名)
id属性:唯一标识,取个名字,将来通过id的值来获取对象
-->
<!-- 等价于 book =new BookServiceImpl
bean其实就是用来创建对象的
-->
<bean class="com.itheima.service.impl.BookServiceImpl" id="bookService"
name="b1,b2 ; b3 b4">
<!-- 给BookServiceImpl的bookDao成员变量赋值 ref:引用IOC容器中对的bookDao
property标签:依赖注入,通过set方法输入
name:类中的成员变量
ref:注入的对象-->
<property name="bookDao" ref="bookDao"></property>
</bean>
<!--IOC容器创建BookDaoImpl对象-->
<!-- bookDao =new BookDaoImpl() -->
<bean class="com.itheima.dao.impl.BookDaoImpl" id="bookDao"></bean>
</beans>
🔥系列热门专栏🔥:
⚡《JavaEE进阶序列 | 从小白到工程师》系列文章⚡
⚡《JavaEE项目实战》系列文章⚡
⚡《JavaSwing项目合集》系列文章⚡
⚡《数据分析中的pandas》系列文章⚡
四、bean的作用范围
类别 描述
名称 scope
类型 属性
所属 bean标签
定义bean的作用范围,可选范围如下
功能 singleton: 单例 (默认)
prototype: 非单例 (多例-每次获取时都创建新的对象)
------------------------------------------------------------------------------------------------------------
*例子:
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype" />
------------------------------------------------------------------------------------------------------------
"为什么bean默认为单例?"
* 适合交给容器进行管理的bean(适合单例)
控制器对象 (以前用的Servlet做为控制器)
业务层对象 (如:BookService)
数据层对象 (如:BookDao或BookMapper)
工具对象 (如:CartUtils对象)
* 不适合交给容器进行管理的bean
封装实体的域对象(实体类对象 Book 包名:pojo,entity, domain)
------------------------------------------------------------------------------------------------------------
/*
其他作用范围(了解即可):
* request:仅适用于Web环境下的ApplicationContext,每一个Http请求都会拥有一个单独的实例
* session:仅适用于Web环境下的ApplicationContext,即每一个用户都将拥有一个单独的实例
* globalSession:仅适用于Web环境下的ApplicationContext,表示每一个全局的Http Session下都会拥有一个单独的实例
* application:仅适用于Web环境下的ApplicationContext,即在整个ServletContext环境下只会拥有一个实例
*/
⭐singleton单例范围代码演示
//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">
<!-- IoC容器可以理解为一个Map集合
bean标签:配置类的信息,会在IoC容器中创建对象
class属性:类全名(包名.类名)
id属性:唯一标识,取个名字,将来通过id的值来获取对象
name属性: 给Bean取别名,可以通过别名获取
scope属性:Bean的范围,默认是单例
singleton:单例
prototype:多例,每次获取的时候创建新的对象
-->
<!-- 等价于 book =new BookServiceImpl
bean其实就是用来创建对象的
-->
<bean class="com.itheima.service.impl.BookServiceImpl" id="bookService"
name="b1,b2 ; b3 b4"
scope="singleton">
<!-- 给BookServiceImpl的bookDao成员变量赋值 ref:引用IOC容器中对的bookDao
property标签:依赖注入,通过set方法输入
name:类中的成员变量
ref:注入的对象-->
<property name="bookDao" ref="bookDao"></property>
</bean>
<!--IOC容器创建BookDaoImpl对象-->
<!-- bookDao =new BookDaoImpl() -->
<bean class="com.itheima.dao.impl.BookDaoImpl" id="bookDao"></bean>
</beans>
------------------------------------------------------------------------------------------------------------
//测试类
@Test
public void testBeanScope() {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
BookService service1 = (BookService) ctx.getBean("bookService");
BookService service2 = (BookService) ctx.getBean("bookService");
System.out.println("service1 = " + service1);
System.out.println("service2 = " + service2);
System.out.println("是不是同一个对象:"+(service1==service2));
//关闭容器
ctx.close();
}
⭐prototype多例范围代码演示
//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">
<!-- IoC容器可以理解为一个Map集合
bean标签:配置类的信息,会在IoC容器中创建对象
class属性:类全名(包名.类名)
id属性:唯一标识,取个名字,将来通过id的值来获取对象
name属性: 给Bean取别名,可以通过别名获取
scope属性:Bean的范围,默认是单例
singleton:单例
prototype:多例,每次获取的时候创建新的对象
-->
<!-- 等价于 book =new BookServiceImpl
bean其实就是用来创建对象的
-->
<bean class="com.itheima.service.impl.BookServiceImpl" id="bookService"
name="b1,b2 ; b3 b4"
scope="prototype">
<!-- 给BookServiceImpl的bookDao成员变量赋值 ref:引用IOC容器中对的bookDao
property标签:依赖注入,通过set方法输入
name:类中的成员变量
ref:注入的对象-->
<property name="bookDao" ref="bookDao"></property>
</bean>
<!--IOC容器创建BookDaoImpl对象-->
<!-- bookDao =new BookDaoImpl() -->
<bean class="com.itheima.dao.impl.BookDaoImpl" id="bookDao"></bean>
</beans>
------------------------------------------------------------------------------------------------------------
//测试类
@Test
public void testBeanScope() {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
BookService service1 = (BookService) ctx.getBean("bookService");
BookService service2 = (BookService) ctx.getBean("bookService");
System.out.println("service1 = " + service1);
System.out.println("service2 = " + service2);
System.out.println("是不是同一个对象:"+(service1==service2));
//关闭容器
ctx.close();
}
五、bean的生命周期
* 生命周期: 从创建到消亡的完整过程
* bean生命周期: bean从创建到销毁的整体过程
* bean生命周期控制: 在bean创建后到销毁前做一些事情
* 配置生命周期控制方法
init-method="初始化方法" //init-method属性: 配置Bean的初始化方法,初始化方法在构造器(构造方法)后执行
destroy-method="销毁方法" // destroy-method属性: 配置Bean的销毁方法
/*
init-method的执行顺序:
执行构造方法 -> 执行属性注入(set操作) -> 执行bean初始化方法
destroy-method: 只对单例对象有效
*/
🍁bean生命周期的使用步骤
"bean生命周期的使用步骤:"
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.初始化容器
* 创建对象(内存分配)
* 执行构造方法
* 执行属性注入(set操作)
* 执行bean初始化方法
2.使用bean
* 执行业务操作
3.关闭/销毁容器
* 执行bean销毁方法
⭐代码演示
// 业务层实现类
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void save() {
bookDao.save();
}
public void init(){
System.out.println(" BookServiceImpl 初始化了");
}
public void destroy(){
System.out.println(" BookServiceImpl 寄了");
}
}
------------------------------------------------------------------------------------------------------------
//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">
<!-- IoC容器可以理解为一个Map集合
bean标签:配置类的信息,会在IoC容器中创建对象
class属性:类全名(包名.类名)
id属性:唯一标识,取个名字,将来通过id的值来获取对象
name属性: 给Bean取别名,可以通过别名获取
scope属性:Bean的范围,默认是单例
singleton:单例
prototype:多例,每次获取的时候创建新的对象
init-method属性: 配置Bean初始化方法, 初始化方法在构造器后执行
destroy-method属性: 配置Bean销毁的方法
-->
<!-- 等价于 book =new BookServiceImpl
bean其实就是用来创建对象的
-->
<bean class="com.itheima.service.impl.BookServiceImpl" id="bookService"
name="b1,b2 ; b3 b4"
scope="singleton"
init-method="init"
destroy-method="destroy">
<!-- 给BookServiceImpl的bookDao成员变量赋值 ref:引用IOC容器中对的bookDao
property标签:依赖注入,通过set方法输入
name:类中的成员变量
ref:注入的对象-->
<property name="bookDao" ref="bookDao"></property>
</bean>
<!--IOC容器创建BookDaoImpl对象-->
<!-- bookDao =new BookDaoImpl() -->
<bean class="com.itheima.dao.impl.BookDaoImpl" id="bookDao"></bean>
</beans>
⚡注意事项⚡
"destroy-method: 只对单例对象有效"
🍁bean的销毁时机
* 容器关闭前触发bean的销毁
* 关闭容器方式:
* 手工关闭容器
close()操作
* 注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机
registerShutdownHook()操作
⭐代码演示
作者:KJ.JK
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习
相关文章
暂无评论...