spring容器中对象单例还是多例
默认Spring容器中所有bean都是单例的;
优点:可以节省空间,减少资源浪费。
缺点:可能会引发线程安全问题
如果在Bean标签上设置scope = “prototype”,当前bean对象就是多例的,每次获取当前类的实例,spring容器就会创建当前类的实例;
优点:不会引发线程安全问题
缺点:每次获取实例都会创建新的实例,会占用服务器的内存空间,造成浪费
注解中,在@Controller、@Service、@Repository(或@Component)注解旁加@Scope=(scopeName=“prototype”) ,即多例,默认为单例
<?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-2.5.xsd"> <!-- init-method * 该方法是由spring容器执行 * 在构造函数之后执行 * 如果在构造函数之后,在调用方法之前要做一些工作,可以在init方法中完成 destroy-method * 如果该bean是单例(默认就是singlton),则在spring容器关闭或者销毁的时候,执行该方法 * 如果该bean是多例(scope="prototype"),则spring容器不负责销毁 说明:要想让spring容器控制bean的生命周期,那么该bean必须是单例 如果该bean是多例,该bean中还有资源,关闭资源的操作由程序员完成 --> <bean id="helloWorld" class="cn.edu.initdestroy.HelloWorld" scope="prototype" init-method="init" destroy- method="destroy"></bean> </beans>
<!-- 在默认情况下,spring创建bean是单例模式 scope singleton 默认 单例 属性是共享的 一般情况下,把数据存放在方法中的变量中 prototype 多例 当一个bean是多例模式的情况下,lazy-init为false或者default无效 --> <bean id="helloWorld" class="cn.itcast.spring0909.scope.HelloWorld" scope="prototype" lazy-init="false"></bean>
<!-- 在启动spring容器的时候,spring容器配置文件中的类就已经创建完成对象了 lazy-init default 即为 false true 在context.getBean的时候才要创建对象 * 优点 如果该bean中有大数据存在,则什么时候context.getBean,什么时候创建对象 可以防止数据过早的停留在内存中,做到了懒加载 * 缺点 如果spring配置文件中,该bean的配置有错误,那么在tomcat容器启动的时候,发现不了 false 在启动spring容器的时候创建对象 * 优点 如果在启动tomcat时要启动spring容器, 那么如果spring容器会错误,这个时候tomcat容器不会正常启动 * 缺点 如果存在大量的数据,会过早的停留在内存中 --> <bean id="helloWorld" class="cn.edu.spring0909.createobject.when.HelloWorl" lazy-init="true"></bean> <bean id="person" class="cn.edu.spring0909.createobject.when.Person" lazy-init="true"></bean>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程