bean 基础配置

发布时间 2024-01-02 21:12:10作者: belhomme

bean 基础配置

对于 bean 的基础配置,在前面的案例中已经使用过:

<bean id="" class=""/>

其中,bean 标签的功能、使用方式以及 id 和 class 属性的作用,我们通过一张图来描述下

image

bean 别名配置

别名的配置说明:

image

配置步骤:

  1. 打开 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>
    
  2. 根据名称容器中获取 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 作用范围的配置属性

image

配置 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 对象不适合交给容器进行管理?
    • 封装实例的域对象,因为会引发线程安全问题,所以不适合。