首页 > 其他分享 >Spring的一些思考(一)

Spring的一些思考(一)

时间:2024-06-20 23:32:07浏览次数:14  
标签:ApplicationContext ServletContext Web 作用域 Spring Bean 思考 一些

new一个对象和依赖注入一个对象的区别?

  • new一个对象时,直接使用关键字new来创建实例。这个对象的生命周期由自己来管理,可以实现对对象的细粒度的控制
  • 依赖注入是创建对象的另一种方式。DI可以减轻耦合,生命周期由Spring来负责,只需配置该对象和它依赖的对象如何配置即可
  • DI的优势
    • 解耦:对象间的关系在运行时自动建立
    • 集中化管理:所有的对象都由DI统一管理
    • 可配置性和模块化:配置文件可以改变某个对象的具体实现
  • 特别的,对于状态会改变的对象或者生命周期很短的对象使用new

DI每次注入的都是同一个对象吗?

依赖注入框架(如Spring)的行为取决于你如何配置你的Bean。特别地,一个由Spring管理的bean的生命周期范围(或"作用域")可以是以下几种类型之一:

  1. 单例(Singleton):默认情况下,Spring容器只会为每个被标记为@Component@Service的类创建一个实例,所有对该类型对象的注入都会得到相同的实例。这种作用域被称为单例作用域。
  2. 原型(Prototype):如果你配置Bean的作用域为"prototype",那么每次注入Bean时,Spring都会创建一个新的实例。
  3. 请求(Request):每次HTTP请求都会创建一个新的Bean,适用于Web应用。
  4. 会话(Session):同一个HTTP Session共享一个Bean,适用于Web应用。
  5. 全局会话(Global Session):一般用在Portlet环境,所有的Portlet共享一个Bean。

​ 所以,依赖注入的Bean是不是每次都相同,实际上取决于你如何配置它的作用域。在大多数情况下,你可能想要将大部分的Bean配置为单例,因为在单一的Spring服务容器中重复使用同一个Bean实例通常是安全的。但在某些特殊情况下,如Web应用或者带有状态的Bean,你可能会需要不同的作用域。


如何修改Bean的作用域呢?

在Spring框架中,有两种主要的方式可以设置Bean的作用域:使用XML配置文件或者注解。

使用XML配置文件设置Bean的作用域:

  1. 在Spring XML配置文件中,你可以使用<bean>元素的scope属性来设置Bean的作用域。
    <!-- 单例作用域 -->
    <bean id="singletonBean" class="com.example.ExampleClass" scope="singleton" />

    <!-- 原型作用域 -->
    <bean id="prototypeBean" class="com.example.ExampleClass" scope="prototype" />

    <!-- Web相关作用域 -->
    <!--<bean id="requestBean" class="com.example.ExampleClass" scope="request" />-->
    <!--<bean id="sessionBean" class="com.example.ExampleClass" scope="session" />-->
    <!--<bean id="globalSessionBean" class="com.example.ExampleClass" scope="globalSession" />-->

使用注解设置Bean的作用域

  1. 在Spring 3.0及更高版本中,你也可以使用@Scope注解来设置Bean的作用域。
@Component
@Scope("singleton")
public class SingletonBean {
    // ...
}

@Component
@Scope("prototype")
public class PrototypeBean {
    // ...
}

// 对于Web作用域,你需要指定一个额外的注解@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
/*@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestBean {
    // ...
}

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SessionBean {
    // ...
}
*/

注意,对于Web作用域(request、session、globalSession),你需要添加proxyMode属性,因为在一些情况下,Spring需要创建一个代理类来确保在整个请求或者会话中都能获取同一个Bean。

以上示例设置了不同的作用域,singleton表示单例,当你的应用启动时,Spring会立即实例化一个此类的Bean;prototype表示原型,每次注入或者通过Spring的ApplicationContext获取的时候,都会创建新的Bean实例。了解这些不同的作用域可以帮助你更好地管理你的Bean的生命周期。


默认情况下是Singleton?

  1. 在Spring框架里,Bean的默认作用域是单例(Singleton)。这意味着Spring容器在每个ApplicationContext中,对于每一个特定的Bean定义,都只会实例化一个对象。
  2. 无论一个单例作用域的Bean被注入到其他Bean多少次或者通过ApplicationContext直接获取多少次,所有地方拿到的都会是同一个对象实例。这种方式的好处是可以进行全局的控制和全局的状态分享,比如全局的配置类就比较适合设置为单例模式。
    当然,如果需要,可以通过设置@Scope注解或者在XML配置评论中特别指定,以改变Bean的作用域。

bean存放在applicationcontext中?

  1. 在Spring框架中,所有被Spring管理的Bean都会被存储在一个名为ApplicationContext的上下文对象中。ApplicationContext可以被视为一个大容器,它负责实例化、配置和装配Bean。
  2. Spring框架提供了多种类型的ApplicationContext实现,分别适用于不同的环境和需求。例如,对于Web应用,通常会使用WebApplicationContext
  3. 在ApplicationContext中,Bean由其名称和定义唯一标识。在整个ApplicationContext中,Bean的ID或名字必须是唯一的。在创建ApplicationContext时,Spring会根据每个Bean的定义来创建对象,并将这些对象存入ApplicationContext中。
  4. 在应用运行过程中,当需要用到某个Bean时,可以通过ApplicationContext来获取。例如,如果在Spring中使用依赖注入,Spring会在ApplicationContext中查找相关的Bean来注入。

不过需要注意的是,ApplicationContext并不直接管理Bean的生命周期,Bean的创建和销毁是由Spring的IoC(控制反转)容器管理的,ApplicationContext则负责提供从名称、类型或者其他标准查找和获取Bean的方式。


ApplicationContext与ServletContext?

ApplicationContext与ServletContext是两种不同的概念,它们在Spring web应用中都有使用,但是各自的用途不同。

  • ServletContext:这是Java web应用中的一个接口,在一个web应用中只存在一个ServletContext实例,它代表当前web应用。ServletContext主要用于访问web应用的各种资源,获取web应用的初始化参数,进行日志记录,获取web应用的各个部分如Servlet,共享数据等。
  • ApplicationContext:这是Spring中的一个接口,是Spring的IoC容器,负责实例化、定位、配置应用程序中的对象和建立这些对象间的依赖。ApplicationContext在一个Spring application中也是唯一的。对于Spring Web应用,会有专门的WebApplicationContext,这个WebApplicationContext是和每一个Servlet关联的。

它们之间的关系是:在Spring Web应用中,Spring会为每一个Servlet创建一个WebApplicationContext,并且这个WebApplicationContext可以访问到ServletContext。也就是说,ServletContext是Java Web应用的范畴,而Spring的ApplicationContext(特别是WebApplicationContext)存在于ServletContext之中,管理Spring应用中的Bean。

所以说,ServletContext和ApplicationContext是分别存在于Java EE Web层和Spring框架层的两个不同的上下文概念,是两个层面的容器。


在Java Web应用中,ServletContext和Spring的ApplicationContext(特别的WebApplicationContext)确实存在一种包含关系,但它们是在两种不同的层面上:

  1. ServletContext是属于Servlet API,在整个Web应用中,只有一个ServletContext实例存在,它作为Web应用的上下文,代表了当前的Web应用。它是Java EE Web层的容器。
  2. 属于Spring框架的ApplicationContext(在Web环境中是WebApplicationContext)则是在ServletContext之中。对于Spring Web应用,Spring会为每一个Servlet创建一个WebApplicationContext。这个内部的WebApplicationContext是一个Spring的IoC容器,它管理这个特定Servlet内部的Bean。

所以,ServletContext包含了WebApplicationContext,可以理解成整个Web应用上下文(ServletContext)中包含了各自Servlet的上下文(WebApplicationContext)。

这是一个父子关系,WebApplicationContext可以访问ServletContext中的所有资源,而ServletContext不能访问WebApplicationContext。在一个Spring MVC应用中,通常以WebApplicationContext作为主要的工作区,进行各种数据处理和逻辑运算。

标签:ApplicationContext,ServletContext,Web,作用域,Spring,Bean,思考,一些
From: https://blog.csdn.net/weixin_46589153/article/details/139802906

相关文章

  • 三级缓存---解决 Spring 循环依赖
    1.循环依赖1.1什么是循环依赖首先,什么是循环依赖?这个其实好理解,就是两个Bean互相依赖,类似下面这样:“”"@ServicepublicclassAService{ @Autowired BServicebService;}@ServicepublicclassBService{ @Autowired AServiceaService;}“”"AServic......
  • 基于Springboot的CSGO赛事管理系统(有报告)。Javaee项目,springboot项目。
    演示视频:基于Springboot的CSGO赛事管理系统(有报告)。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven+Layui+Elementui来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统......
  • ssm springmvc springboot区别
    pom.xml文件里看ssm<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web......
  • 高版本SpringCloud配置跨域
    一、什么是跨域跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。同源策略,指的是协议,域名,端口都要相同,其中有一个不同都会产生跨域。跨域相关含义:Access-Control-Allow-Origin:服务器允许请求的源;Access-Con......
  • Java毕业设计 基于springboot vue音乐网站
    Java毕业设计基于springbootvue音乐网站SpringBoot音乐网站功能介绍首页图片轮播歌曲信息歌曲分类歌曲详情歌曲播放音乐下载评论注册登录个人中心更新信息用户后台:登录个人中心修改密码个人信息音乐下载管理员:登录个人中心修改密码个人信息用户管......
  • SpringBoot配置多CacheManager
    SpringCache配置多CacheManager背景​Spring为了减少数据的执行次数(重点在数据库查询方面),在其内部使用aspectJ技术,为执行操作的结果集做了一层缓存的抽象。这极大的提升了应用程序的性能。由于其切面注入的特性,所以不会对我们的程序造成任何的影响。对于一些实时性要求不那么高......
  • 就业寒冬从面试无力感,到一天2个offer的一些经验分享
    本人是霍格沃兹北京测试开发学社线下3期学员,拥有3年测试工作经验,之前一直在某大厂外包做软件测试,期间主要是以功能测试为主。经过一个月的高强度找工作奋战,最终拿下了3家公司offer,选择了一家自己很满意的公司。上课过程在学习全日制自动化测试课程的过程中,我们难免会遇到各种问......
  • java基于SpringBoot+Vue的失踪人员信息发布与管理系统(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示项目运行截图技术框架后端采用SpringBoot框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • Spring框架声明是事务
    声明式事务(DeclarativeTransactionManagement)是Spring框架提供的一种对程序事务进行管理的方式。这种管理方式的核心思想是采用声明的方式(通常是在配置文件中声明,而非在代码中硬编码)来处理事务,从而简化开发过程,降低开发者处理复杂事务的难度。在声明式事务中,开发者通过注解(如@T......
  • 关于伴随矩阵/矩阵初等变换/动态矩阵求逆的一些想法
    起因是某道BEST定理题需要求出矩阵修改一个位置后所有主对角线上的(代数)余子式。也就是求出删除\(i\)行\(i\)列后的伴随矩阵。而伴随矩阵可以用逆矩阵计算,问题又变成了删除一行一列再加入一行一列的矩阵求逆。(因为Laplace矩阵不满秩而所有的主子式满秩,所以你不能求出原矩阵......