bean 基础配置
对于 bean 的基础配置,在前面的案例中已经使用过:
<bean id="" class=""/>
其中,bean 标签的功能、使用方式以及 id 和 class 属性的作用,我们通过一张图来描述下
bean 别名配置
别名的配置说明:
配置步骤:
-
打开 spring 的配置文件 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--name:为bean指定别名,别名可以有多个,使用逗号,分号,空格进行分隔--> <bean id="bookService" name="service service4 bookEbi" class="com.itheima.service.impl.BookServiceImpl"> <property name="bookDao" ref="bookDao"/> </bean> <!--scope:为bean设置作用范围,可选值为单例singloton,非单例prototype--> <bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl"/> </beans>
-
根据名称容器中获取 bean 对象
public class AppForName { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); //此处根据bean标签的id属性和name属性的任意一个值来获取bean对象 BookService bookService = (BookService) ctx.getBean("service4"); bookService.save(); } }
bean 作用范围配置
bean 作用范围的配置属性
配置 bean 为非单例
在 Spring 配置文件中,配置 scope 属性来实现 bean 的非单例创建
-
在 Spring 的配置文件中,修改
<bean>
的 scope 属性<bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope=""/>
-
将 scope 设置为
singleton
<bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope="singleton"/>
-
将 scope 设置为
prototype
<bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype"/>
-
结论,使用 bean 的
scope
属性可以控制 bean 的创建是否为单例:singleton
默认为单例prototype
为非单例
- 为什么 bean 默认为单例?
- bean 为单例的意思是在 Spring 的 IOC 容器中只会有该类的一个对象
- bean 对象只有一个就避免了对象的频繁创建与销毁,达到了 bean 对象的复用,性能高
- bean 在容器中是单例的,会不会产生线程安全问题?
- 如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,
- 因为所有请求线程共用一个 bean 对象,所以会存在线程安全问题。
- 如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,
- 因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。
- 哪些 bean 对象适合交给容器进行管理?
- 表现层对象
- 业务层对象
- 数据层对象
- 工具对象
- 哪些 bean 对象不适合交给容器进行管理?
- 封装实例的域对象,因为会引发线程安全问题,所以不适合。