Skip to main content

架构与实例池管理

架构与实例池管理

springboot内的bean有多种模式或者之类的东西

可以理解为@Bean 给将创建等工作托管给spring之后,spring本身需要给他设计创建的工厂,是维持一个单例?还是在发生某种事情之后创建新的?

从而衍生出了六种Scope, 例如@Singleton, @Prototype和剩下四个只能在Web上下文里面用的,例如@SessionScope

  • singleton, prototype, request, session, application, websocket

https://docs.spring.io/spring-framework/reference/core/beans/factory-scopes.html

@Singleton就是默认的, 表明这个bean只会存在一个单例,其他注入的地方都会得到它的引用

  • 常用于依赖注入, 由于单例所以是stateless的

  • 与之相对应的@Prototype就是stateful的

  • 如果有一个配置了prototype的被用于依赖注入(并不是好的实践), 在不指定proxyMode为 TARGET_CLASS 时依然不会生效, 还是会在初始化时注入一个单例

    • 这个问题的核心在于你不能直接将一个多例的对象注入到单例的对象之中, service/controller都为多例是可以的, 间接(配置proxy也是可以的)

    • 使用applicationContext 尝试获取作用域来自己创建bean对象, 可以但违反了IoC(可以用@Lookup)

    • 应该仅在需要线程特定数据等情况使用多例模式

    • 用@SessionScope就行

      Specifically, @SessionScope is a composed annotation that acts as a shortcut for @Scope("session") with the default proxyMode() set to TARGET_CLASS.

    • 所以作业1里面实现一个session特定的timer, 只需要创建一个@SessionScope的Service注入到Controller就行

@SessionScope就是特定于Session, 每个Session会建立一个实例

数据库连接池大小: 连接数 = 核心数 * 2 + 有效磁盘数(空闲IO)