概念
- IoC(Inversion Of Control)控制反转,指反向控制应用程序所需资源
- Spring控制器资源全部在Spring容器中,该容器成为IoC容器
SpringMaven坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
Spring标签
bean
作用:定义spring中的资源,受此标签定义的资源都会被spring控制
格式:
<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是单例还是非单例
格式:<bean scope="singleton"></bean>
取值:
singleton:创建出来的对象,是一个单例对象,在加载的时候就会被创建
- prototype:创建出来的对象,是一个非单例对象,在创建的时候会被创建
- request、session、application、 websocket :设定创建出的对象放置在web容器对应的位置
Spring 的对象默认是单例的还是多例的? 单例 bean 存不存在线程安全问题呢?(必会)
- bean在创建的时候默认是单例,可以通过scope设置非单例模式
- 单例bean的对象对应类存在可变的成员变量,并且其中存在改变这个变量的线程时,存在线程安全问题
- 原因:多线程如果改变成员变量,其他线程无法访问该bean对象
- 解决:
- 在bean中避免定义可变成员变量
- 在 bean 对象中定义一个 ThreadLocal 成员变量,将需要的可变成员变量 保存在 ThreadLocal 中。