Spring Boot【二】

Bean的作用域

可以通过scope属性指定bean的作用域,如:
<bean id="" class="" scope="作用域" />

spring容器中scope常见的有5种:

  • singleton
    当scope的值设置为singleton的时候,整个spring容器中只会存在一个bean实例
  • prototype
    如果scope被设置为prototype类型的了,表示这个bean是多例的,通过容器每次获取的bean都是不同的实例,每次获取都会重新创建一个bean实例对象。
  • request、session、application这三类scope都是在spring web容器环境中才会有的
  • request
    当一个bean的作用域为request,表示在一次http请求中,一个bean对应一个实例;对每个http请求都会创建一个bean实例,request结束的时候,这个bean也就结束了,request作用域用在spring容器的web环境中
  • session
    这个和request类似,也是用在web环境中,session级别共享的bean,每个会话会对应一个bean实例,不同的session对应不同的bean实例。
  • application
    全局web应用级别的作用域,也是在web环境中使用的,一个web应用程序对应一个bean实例 ,singleton是每个spring容器中只有一个bean实例,一般我们的程序只有一个spring容器,但是,一个应用程序中可以创建多个spring容器,不同的容器中可以存在同名的bean,但是sope=aplication的时候,不管应用中有多少个spring容器,这个应用中同名的bean只有一个
  • 自定义scope
    有时候,spring内置的几种scope都无法满足我们的需求的时候,我们可以自定义bean的作用域。

总结:
1.spring容器自带的有2种作用域,分别是singleton和prototype;还有3种分别是spring web容器环境中才支持的request、session、application
2. singleton是spring容器默认的作用域,一个spring容器中同名的bean实例只有一个,多次获取得到的是同一个bean;单例的bean需要考虑线程安全问题
3. prototype是多例的,每次从容器中获取同名的bean,都会重新创建一个;多例bean使用的时候需要考虑创建bean对性能的影响
4. 一个应用中可以有多个spring容器 自定义scope 3个步骤,实现Scope接口,将实现类注册到spring容器,使用自定义的sope

手动依赖注入

通常情况下,系统中类和类之间是有依赖关系的。

  • 通过构造器设置依赖对象
    例如:向UserController中添加一个有参构造方法:
java 复制代码
public class UserController{
    private UserService userService;
    public UserController(UserService userService){
        this.userService = userService;
    }
    public void insert(UserModel model){
        this.userService.insert(model);
    }
}
 
//UserController使用
UserSerivce userService = new UserService();
UserController userController = new UserController(userService);
//然后就可以使用userController对象了
  • 通过set方法设置依赖对象
    可以在UserController中给userService添加一个set方法:
java 复制代码
public class UserController{
    private UserService userService;
    public setUserService(UserService userService){
        this.userService = userService;
    }
    public void insert(UserModel model){
        this.userService.insert(model);
    }
}
 //UserController使用
UserSerivce userService = new UserService();
UserController userController = new UserController();
userController.setService(userService);
//然后就可以使用userController对象了

通过构造器注入

构造器的参数就是被依赖的对象,构造器注入又分为3种注入方式:
根据构造器参数索引注入
根据构造器参数类型注入
根据构造器参数名称注入

  • 根据构造器参数索引注入
    例如:
java 复制代码
`<bean id="diByConstructorParamIndex" class="com.javacode2018.lesson001.demo5.UserModel">
    <constructor-arg index="0" value="路人甲Java"/>
    <constructor-arg index="1" value="上海市"/>
</bean>`
  • 根据构造器参数类型注入
java 复制代码
<bean id="diByConstructorParamType" class="com.javacode2018.lesson001.demo5.UserModel">
    <constructor-arg type="参数类型" value="参数值"/>
    <constructor-arg type="参数类型" value="参数值"/>
</bean>

constructor-arg:用户指定构造器的参数

type:构造函数参数的完整类型,如:java.lang.String,int,double

value:构造器参数的值,value只能用来给简单的类型设置值

  • 根据构造器参数名称注入
java 复制代码
<bean id="diByConstructorParamName" class="com.javacode2018.lesson001.demo5.UserModel">
    <constructor-arg name="参数类型" value="参数值"/>
    <constructor-arg name="参数类型" value="参数值"/>
</bean>
  • setter注入
java 复制代码
<bean id="" class="">
    <property name="属性名称" value="属性值" />
    ...
    <property name="属性名称" value="属性值" />
</bean>

注入容器中的bean有两种写法:
ref属性方式
内置bean的方式

  • ref属性方式

    构造器方式,将value替换为ref:
    <constructor-arg ref="需要注入的bean的名称"/>

    setter方式,将value替换为ref:
    <property name="属性名称" ref="需要注入的bean的名称" />

  • 内置bean的方式

构造器的方式:

java 复制代码
<constructor-arg>
    <bean class=""/>
</constructor-arg>

setter方式:

java 复制代码
<property name="属性名称">
    <bean class=""/>
</property>
相关推荐
Java小混子1 分钟前
Spring MVC
java·spring·mvc
用户9704438781168 分钟前
按图搜索1688商品(拍立淘)API 返回值说明
javascript·后端·算法
Fly_hao.belief9 分钟前
Spring Boot 框架注解:@ConfigurationProperties
java·spring boot·后端
代码吐槽菌12 分钟前
基于SpringBoot的水产养殖系统【附源码】
java·数据库·spring boot·后端·毕业设计
尽一份心出一份力12 分钟前
等不是办法,干才有希望,快速跑通graphRag
后端·机器学习·开源
LaoZhangAI13 分钟前
【2025最新】Dify接入GPT-4o完全指南:8种稳定高效使用方法
前端·后端
掉鱼的猫19 分钟前
无耳 Solon AI v3.1.2 发布(兼容 Java 8 ~ 24),支持 SpringBoot2,jFinal,Vert.X 等第三方框架
java·后端
雷渊20 分钟前
redis可以保证数据不丢失吗?
java·后端·面试
CptainLee21 分钟前
python小整数池和字符串贮存
java·开发语言·python
智联视频超融合平台25 分钟前
国网B接口注册流程详解以及注册失败原因(电网B接口)
网络·人工智能·后端·网络协议·安全·音视频·实时音视频