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>
相关推荐
梓仁沐白1 小时前
Java函数式编程+Lambda表达式
java·rpc
FLLdsj1 小时前
Scala身份证上的秘密以及Map的遍历
java·开发语言·scala
mo47762 小时前
JS中的类与对象
java·开发语言·javascript
T.O.P112 小时前
数据结构和算法
java·开发语言·数据结构
重生之绝世牛码2 小时前
Java设计模式 —— 【创建型模式】工厂模式(简单工厂、工厂方法模式、抽象工厂)详解
java·大数据·开发语言·设计模式·工厂方法模式·设计原则·工厂模式
北漂编程小王子3 小时前
maven 工具 clean、compile、package、install、deploy 常用命令使用区别
java·maven·maven常用命令·clean package
binqian3 小时前
【maven】配置下载私有仓库的快照版本
java·maven
five小点心3 小时前
尚硅谷学习笔记——Java设计模式(一)设计模式七大原则
java·开发语言·设计模式
潜洋3 小时前
Spring Boot教程之十一:获取Request 请求 和 Put请求
java·开发语言·python