Spring中的工厂类、bean的作用范围和生命周期

1.Spring中的工厂类

1.1ApplicationContext

  • ClassPathXmlApplicationContext:加载类路径下 Spring 的配置文件

  • FileSystemXmlApplicationContext:加载本地磁盘下 Spring 的配置文件

1.1.1service 

ApplicationContext:只要一读取配置文件,默认情况下就会创建对象。

package com.by.service;import com.by.dao.UserDao;
import com.by.dao.UserDaoImpl;public class UserServiceImpl implements UserService{private UserDao userDao;private String msg;public UserServiceImpl() {System.out.println("测UserServiceImpl对象创建了...");}public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setMsg(String msg) {this.msg = msg;}public UserServiceImpl(UserDao userDao, String msg) {this.userDao = userDao;this.msg = msg;}@Overridepublic void adduser() {System.out.println(userDao+"============"+msg);userDao.adduser();}
}

1.1.2applicationContext.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--2、把对象交给spring来创建id:给对象在容器中提供一个唯一标识。用于获取对象class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><bean id="userService" class="com.by.service.UserServiceImpl" autowire="byType"></bean></beans>

 1.1.3测试

package com.by.web;import com.by.dao.UserDao;
import com.by.service.UserService;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ContextResource;public class Client {public static void main(String[] args) {/*** 测试BeanFactory和ApplicationContext的区别*/new ClassPathXmlApplicationContext("applicationContext.xml");//XmlBeanFactory xbf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));//  UserService userService = xbf.getBean("userService", UserService.class);System.out.println("Spring  IOC容器被创建了...............");}
}

 1.1.4结果

 

1.2BeanFactory

  • spring中工厂的类结构图

  BeanFactory:是在 getBean 的时候才会创建对象。

1.2.1service

package com.by.service;import com.by.dao.UserDao;
import com.by.dao.UserDaoImpl;public class UserServiceImpl implements UserService{private UserDao userDao;private String msg;public UserServiceImpl() {System.out.println("测UserServiceImpl对象创建了...");}public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setMsg(String msg) {this.msg = msg;}public UserServiceImpl(UserDao userDao, String msg) {this.userDao = userDao;this.msg = msg;}@Overridepublic void adduser() {System.out.println(userDao+"============"+msg);userDao.adduser();}
}

1.2.2applicationContext.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--2、把对象交给spring来创建id:给对象在容器中提供一个唯一标识。用于获取对象class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><bean id="userService" class="com.by.service.UserServiceImpl" autowire="byType"></bean></beans>

1.2.3测试

package com.by.web;import com.by.dao.UserDao;
import com.by.service.UserService;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ContextResource;public class Client {public static void main(String[] args) {/*** 测试BeanFactory和ApplicationContext的区别*///new ClassPathXmlApplicationContext("applicationContext.xml");XmlBeanFactory xbf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));UserService userService = xbf.getBean("userService", UserService.class);System.out.println("Spring  IOC容器被创建了...............");}
}

1.2.4结果

1.3BeanFactroy和ApplicationContext区别


 BeanFactroy:顶级接口,getBean时才创建对象 

ApplicationContext:子接口,加载配置文件时就创建对象 

2.bean的作用范围

2.1概述 

  • 在Spring中,bean作用域用于确定bean实例应该从哪种类型的Spring容器中返回给调用者。

2.2五种作用域 

目前Spring Bean的作用域或者说范围主要有五种:

作用域说明
singleton默认值,Bean以单例方式存在spring IoC容器
prototype每次从容器中调用Bean时都返回一个新的实例,相当于执行newInstance()
requestWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
sessionWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
applicationWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 ServletContext 域中

 可以通过 <bean> 标签的scope 属性控制bean的作用范围,其配置方式如下所示:

<bean id="..." class="..." scope="singleton"/>

  • 需要根据场景决定对象的单例、多例模式

    单例:Service、DAO、SqlSessionFactory(或者是所有的工厂)

    多例:Connection、SqlSession

2.3测试单例singleton

 2.3.1service

package com.by.service;import com.by.dao.UserDao;
import com.by.dao.UserDaoImpl;public class UserServiceImpl implements UserService{private UserDao userDao;private String msg;public UserServiceImpl() {System.out.println("测UserServiceImpl对象创建了...");}public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setMsg(String msg) {this.msg = msg;}public UserServiceImpl(UserDao userDao, String msg) {this.userDao = userDao;this.msg = msg;}@Overridepublic void adduser() {System.out.println(userDao+"============"+msg);userDao.adduser();}
}

 2.3.2applicationContext.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--2、把对象交给spring来创建id:给对象在容器中提供一个唯一标识。用于获取对象class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><bean id="userService" class="com.by.service.UserServiceImpl" scope="singleton" autowire="byType"></bean></beans>

2.3.3测试 

package com.by.web;import com.by.dao.UserDao;
import com.by.service.UserService;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ContextResource;public class Client {public static void main(String[] args) {/*** bean的五种作用范围*/ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");for (int i = 0; i < 5; i++) {UserService userService = context.getBean("userService", UserService.class);System.out.println(userService);}}
}

 2.3.4结果

 

2.4测试原型模式(多例)prototype

2.4.1service

 

package com.by.service;import com.by.dao.UserDao;
import com.by.dao.UserDaoImpl;public class UserServiceImpl implements UserService{private UserDao userDao;private String msg;public UserServiceImpl() {System.out.println("测UserServiceImpl对象创建了...");}public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setMsg(String msg) {this.msg = msg;}public UserServiceImpl(UserDao userDao, String msg) {this.userDao = userDao;this.msg = msg;}@Overridepublic void adduser() {System.out.println(userDao+"============"+msg);userDao.adduser();}
}

2.4.2 applicationContext.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--2、把对象交给spring来创建id:给对象在容器中提供一个唯一标识。用于获取对象class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><bean id="userService" class="com.by.service.UserServiceImpl" scope="prototype" autowire="byType"></bean></beans>

2.4.3测试 

package com.by.web;import com.by.dao.UserDao;
import com.by.service.UserService;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ContextResource;public class Client {public static void main(String[] args) {/*** bean的五种作用范围*/ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");for (int i = 0; i < 5; i++) {UserService userService = context.getBean("userService", UserService.class);System.out.println(userService);}}
}

2.4.4结果 

3.bean的生命周期

 3.1单例bean

  3.1.1service

package com.by.service;import com.by.dao.UserDao;
import com.by.dao.UserDaoImpl;public class UserServiceImpl implements UserService{private UserDao userDao;private String msg;public UserServiceImpl() {System.out.println("测UserServiceImpl对象创建了...");}/****/public void setUserDao(UserDao userDao) {System.out.println("使用set注入....");this.userDao = userDao;}public void init(){System.out.println("初始化bean....");}public void destroy(){System.out.println("销毁bean....");}
@Overridepublic void adduser() {System.out.println(userDao+"============"+msg);userDao.adduser();}
}

3.1.2applicationContext.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--2、把对象交给spring来创建id:给对象在容器中提供一个唯一标识。用于获取对象class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
<!--    <bean id="userService" class="com.by.service.UserServiceImpl" scope="prototype" autowire="byType">--><bean id="userService" class="com.by.service.UserServiceImpl" scope="singleton"init-method="init" destroy-method="destroy" autowire="byType"></bean></beans>

 3.1.3测试

package com.by.web;import com.by.dao.UserDao;
import com.by.service.UserService;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ContextResource;public class Client {public static void main(String[] args) { /*** bean的生命周期* 单例模式的周期:[容器启动时]--》set方法注入-->构造方法(实例化对象)--->init(初始化)---》[关闭容器]---》destory(销毁)* 多例模式的周期:使用对象时---》set方法注入---》构造方法(实例化对象)---->init(初始化)----》jvm销毁对象,释放内存----》destroy(销毁)*/ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 关闭容器context.close();// context.getBean("userService", UserService.class);}
}

3.1.4结果

3.2原型模式、多例bean

3.2.1service

package com.by.service;import com.by.dao.UserDao;
import com.by.dao.UserDaoImpl;public class UserServiceImpl implements UserService{private UserDao userDao;private String msg;public UserServiceImpl() {System.out.println("测UserServiceImpl对象创建了...");}/****/public void setUserDao(UserDao userDao) {System.out.println("使用set注入....");this.userDao = userDao;}public void init(){System.out.println("初始化bean....");}public void destroy(){System.out.println("销毁bean....");}
@Overridepublic void adduser() {System.out.println(userDao+"============"+msg);userDao.adduser();}
}

3.2.2applicationContext.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--2、把对象交给spring来创建id:给对象在容器中提供一个唯一标识。用于获取对象class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数--><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean>
<!--    <bean id="userService" class="com.by.service.UserServiceImpl" scope="prototype" autowire="byType">--><bean id="userService" class="com.by.service.UserServiceImpl" scope="prototype"init-method="init" destroy-method="destroy" autowire="byType"></bean></beans>

3.2.3测试

package com.by.web;import com.by.dao.UserDao;
import com.by.service.UserService;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ContextResource;public class Client {public static void main(String[] args) { /*** bean的生命周期* 单例模式的周期:[容器启动时]--》set方法注入-->构造方法(实例化对象)--->init(初始化)---》[关闭容器]---》destory(销毁)* 多例模式的周期:使用对象时---》set方法注入---》构造方法(实例化对象)---->init(初始化)----》jvm销毁对象,释放内存----》destroy(销毁)*/ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 关闭容器// context.close();context.getBean("userService", UserService.class);}
}

3.2.4结果

3.3总结 

spring bean的生命周期
    1、单例
        [容器启动]---->构造方法(实例化)----->set方法(注入)----->init方法(初始化)---->[容器关闭]---->destroy方法(销毁)
    2、多例
        [使用对象]---->构造方法(实例化)----->set方法(注入)----->init方法(初始化)---->[jvm垃圾回收]--->destroy方法(销毁)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/596551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch|PyTorch张量解释

神经网络中的输入、输出和转换都使用张量表示&#xff0c;因此&#xff0c;神经网络编程大量使用张量&#xff0c;张量是我们在 PyTorch 中编程神经网络时将使用的数据结构。 关于张量及其维数的简要说明&#xff0c;以及术语&#xff1a; 你有时会看到一个称为向量的一维张量…

[论文分享]TimesURL:通用时间序列表示学习的自监督对比学习

论文题目&#xff1a;TimesURL: Self-supervised Contrastive Learning for Universal Time Series Representation Learning 论文地址&#xff1a;https://arxiv.org/abs/2312.15709 代码地址&#xff1a;暂无 摘要 学习适用于各种下游任务的通用时间序列表示具有挑战性&…

Springboot整合RocketMQ 基本消息处理

目录 1. 同步消息 2. 异步消息 3. 单向消息 4. 延迟消息 5. 批量消息 6. 顺序消息 7. Tag过滤 导入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId></dependency> …

14:00面试,14:08就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到10月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…

机器学习原理到Python代码实现之LinearRegression

Linear Regression 线性回归模型 该文章作为机器学习的第一篇文章&#xff0c;主要介绍线性回归模型的原理和实现方法。 更多相关工作请参考&#xff1a;Github 算法介绍 线性回归模型是一种常见的机器学习模型&#xff0c;用于预测一个连续的目标变量&#xff08;也称为响应变…

Spring的bean的生命周期!!!

一.单例模式 单例&#xff1a;[启动容器]--->通过构造方法&#xff08;创建对象&#xff09;---->调用set方法&#xff08;注入&#xff09;--->调用init方法&#xff08;初始化&#xff09;----[容器关闭]----->调用destroy方法&#xff08;销毁&#xff09; app…

死锁的处理策略“检测和解除”-第三十九天

目录 前言 死锁的检测 数据结构资源分配图 基于“图”检测死锁 可以消除所有边 不能消除所有边 结论 死锁定理 死锁的解除 本节思维导图 前言 如果系统中既不采取预防死锁的措施&#xff0c;也不采取避免死锁的措施&#xff0c;系统就很可能发生死锁&#xff0c;在这种…

西电期末1019.校验和计算

一.题目 二.分析与思路 难点在于逐个取出数据的每一位&#xff0c;我们编写f函数&#xff0c;使用了一个while函数&#xff0c;每次循环中用取余的运算符找到数据的个位累加&#xff0c;再将n/10&#xff0c;如此n便被去除了个位&#xff0c;十位就成了新的个位&#xff0c;最…

案例精选|淄博绿能燃气工程有限公司日志审计系统建设方案

淄博绿能燃气工程有限公司&#xff0c;成立于1994年&#xff0c;前身为淄博市煤气公司管道液化气分公司。公司业务主要涉及天然气、液化气等市政工程施工及城镇燃气供应等领域&#xff0c;具有市政公用工程施工总承包二级资质&#xff0c;《压力管道安装许可证》压力管道安装GB…

利用Embedding优化搜索功能

我们继续用Gemini学习LLM编程之旅。 Embedding是一种自然语言处理 (NLP) 技术&#xff0c;可将文本转换为数值向量。Embedding捕获语义含义和上下文&#xff0c;从而导致具有相似含义的文本具有更接近的Embedding。例如&#xff0c;句子“我带我的狗去看兽医”和“我带我的猫去…

LeetCode---378周赛

题目列表 2980. 检查按位或是否存在尾随零 2981. 找出出现至少三次的最长特殊子字符串 I 2982. 找出出现至少三次的最长特殊子字符串 II 2983. 回文串重新排列查询 一、检查按位或是否存在尾随零 这题和位运算有关&#xff0c;不是很难&#xff0c;题目要求至少有两个数的…

案例073:基于微信小程序的智慧旅游平台开发

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

用贪心算法编程求解任务安排问题

题目&#xff1a;用贪心算法编程求解以下任务安排问题 一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时间任务的有限集S。关于S的一个时间表用于描述S中单位时间任务的执行次序。时间表中第1个任务从时间0 开始执行直至时间1 结束&#xff0c;第2 个任务从时…

20240104确认AIO-3399J的开发板适配ov13850摄像头不支持4K分辨率录像

20240104确认AIO-3399J的开发板适配ov13850摄像头不支持4K分辨率录像 2024/1/4 13:23 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab Android1…

人工智能如何重塑金融服务业

在体验优先的世界中识别金融服务业中的AI使用场景 人工智能&#xff08;AI&#xff09;作为主要行业的大型组织的重要业务驱动力&#xff0c;持续受到关注。众所周知&#xff0c;传统金融服务业在采用新技术方面相对滞后&#xff0c;一些组织使用的还是上世纪50年代和60年代发…

Android Jetpack学习系列——Navigation

写在前面 Google在2018年就推出了Jetpack组件库&#xff0c;但是直到今天我才给重视起来&#xff0c;这真的不得不说是一件让人遗憾的事。过去几年的空闲时间里&#xff0c;我一直在尝试做一套自己的组件库&#xff0c;帮助自己快速开发&#xff0c;虽然也听说过Jetpack&#…

Android如何正确使用 Canvas 的 save() 和 restore() 方法

如何正确使用 Canvas 的 save() 和 restore() 方法 在Android的绘图API中&#xff0c;Canvas类提供了一系列强大的功能来绘制自定义视图。为了更高效地管理绘图状态和变换&#xff0c;Canvas类提供了save()和restore()方法。正确使用这些方法是高效绘图和避免常见错误的关键。 …

任务需求分析中的流程图、用例图、er图、类图、时序图线段、图形的作用意义

任务需求分析中的流程图、用例图、er图、类图、时序图线段、图形的作用意义 流程图 流程图中各种图形的含义及用法解析 连接线符号 连接各要素&#xff0c;表示流程的顺序或过程的方向。 批注符号 批注或说明&#xff0c;也可以做条件叙述。 子流程 流程中一部分图形的逻辑…

机器人动力学一些笔记

动力学方程中&#xff0c;Q和q的关系(Q是sita) Q其实是一个向量&#xff0c;q(Q1&#xff0c;Q2&#xff0c;Q3&#xff0c;Q4&#xff0c;Q5&#xff0c;Q6)&#xff08;假如6个关节&#xff09; https://zhuanlan.zhihu.com/p/25789930 举个浅显易懂的例子&#xff0c;你在房…

Windows内核理论基础学习

文章目录 前言Windosw内核 理论基础Windows体系结构CPU权限级别内存空间布局Windows内核结构硬件抽象层&#xff08;HAL&#xff09;内核层执行体层设备驱动程序文件系统/存储管理网络 Windows子系统窗口管理图形设备接口 系统线程和系统进程 内核基本概念处理器模式内存管理进…