概念

  • IoC(Inversion Of Control)控制反转,指反向控制应用程序所需资源
  • Spring控制器资源全部在Spring容器中,该容器成为IoC容器

1590636750876.png

SpringMaven坐标

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-context</artifactId>
  4. <version>5.1.9.RELEASE</version>
  5. </dependency>

Spring标签

bean

作用:定义spring中的资源,受此标签定义的资源都会被spring控制
格式:

  1. <bean id="beanId" name="beanName1,beanName2" class="com.heima.service.impl.UserServiceImpl"></bean>

基本属性:

  • id:bean的名称,通过id获取bean
  • class:bean的类型
  • name:beand的名称,可以通过name值获取bean,用于多人配合时给bean起别名

    bean属性scope

    作用:规定创建出来的bean是单例还是非单例
    格式:

    1. <bean scope="singleton"></bean>

    取值:

  • singleton:创建出来的对象,是一个单例对象,在加载的时候就会被创建

  • prototype:创建出来的对象,是一个非单例对象,在创建的时候会被创建
  • request、session、application、 websocket :设定创建出的对象放置在web容器对应的位置


    Spring 的对象默认是单例的还是多例的? 单例 bean 存不存在线程安全问题呢?(必会)

  1. bean在创建的时候默认是单例,可以通过scope设置非单例模式
  2. 单例bean的对象对应类存在可变的成员变量,并且其中存在改变这个变量的线程时,存在线程安全问题
    1. 原因:多线程如果改变成员变量,其他线程无法访问该bean对象
    2. 解决:
      1. 在bean中避免定义可变成员变量
      2. 在 bean 对象中定义一个 ThreadLocal 成员变量,将需要的可变成员变量 保存在 ThreadLocal 中。