玩转Spring框架教程06之Bean标签配置属性以及Bean作用域

本文详细介绍了Spring框架中Bean的配置方式,包括bean标签的基本属性如id、name及class等,并深入探讨了作用域配置如singleton、prototype等,同时介绍了如何通过init-method和destroy-method属性来定制Bean的初始化和销毁行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Bean的bean标签属性配置

<bean>配置属性文件:

id属性和name属性的区别

      id:确定该Bean的唯一标识符,一个Bean代表一个应用组件,Bean的id属性值在整个容器中必须保证唯一。

     name: 为Bean定义一个名字,没有id的情况下, name可以当做id使用

class属性 

Bean的类路径 完整包名+类名。容器会对类进行实例化,所以不能使用接口,应该提供具体的类Scope 属性

Scope 属性

   Bean的作用域配置

lazy-init属性

默认值是false,可以设置为true表示开启懒加载,容器初始化时不会初始化bean,获取对象时再初始化。

factory-bean属性

可以用于指定一个bean的id值,把userId这个bean赋值给userId2这个bean,但是必须加上一个factory-method属性,指定调用一个非静态方法。

factory-bean属性:

<beanid="userId" class="com.itcodeschool.domain.User"factory-method="init" ></bean>

调用User类的inti方法,但是init方法必须是静态的。

init-method属性:

init-mehtod=”方法名”,bean对象初始化时会调用此属性指定的方法;

destroy-method属性:

destroy-method=”方法名”

bean对象销毁时会调用此属性指定的方法,想要看到效果必须ClassPathXmlApplicationContext对象调用close方法;

Spring Bean的bean作用域

Bean的五种作用域

singleton、prototype、request、session、global session

singleton:

单例模式,Spring IOC容器中只会存在一个Bean实例,在容器启动的时候就会初始化所有的单例对象,后期无论多少次获取都是同一个对象。Bean标签的scope模式就是singleton,无需显示指定。

prototype:

原型模式,每次获取Bean实例都会创建一个新的Bean返回,<bean class=”……” scope=”prototype”>。

request:

Bean的作用域在一次Http请求范围内有效, 每一次Http请求都会创建一个新的Bean,<bean class=”……” scope=”request”>。

session:

Bean的作用域在当前一次会话Http Session内有效,同一个Http Session会话多次获取Bean不会重新创建,<bean class=”……” scope=”session”>。

global session

Bean的作用域在全局Session会话内有效,应用于分布式系统Session范围内多次获取获取Bean不会重新创建,仅在使用portlet context时有效。<bean class=”……” scope=” global Session”>。

代码测试如下:

singleton演示:

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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">

 <!--无参构造函数方式 -->

 <bean id="userId"class="com.itcodeschool.domain.User" scope="singleton"></bean>

</beans>

测试代码:

从容器获取3次User对象实例,输出对象的hashCode码,输出hashCode码相同则表示是同一个对象。

    publicvoid test01() {

       //初始化容器

       ApplicationContextcontext = new ClassPathXmlApplicationContext("ApplicationContext.xml");

       //从容器中获取Bean

       Useruser01 = (User) context.getBean("userId");

       Useruser02 = (User) context.getBean("userId");

       Useruser03 = (User) context.getBean("userId");

       //输出对象信息

        System.out.println(user01.hashCode());

        System.out.println(user02.hashCode());

        System.out.println(user03.hashCode());

    }

运行结果如下:

三次获取实例的hashCode码相同,证明三个对象是同一个。

prototype演示:

<bean id="userId"class="com.itcodeschool.domain.User" scope="prototype"></bean>

测试代码:

@Test

    publicvoid test01() {

       //初始化容器

       ApplicationContextcontext = new ClassPathXmlApplicationContext("ApplicationContext.xml");

       //从容器中获取Bean

       Useruser01 = (User) context.getBean("userId");

       Useruser02 = (User) context.getBean("userId");

       Useruser03 = (User) context.getBean("userId");

       //输出对象信息

        System.out.println(user01.hashCode());

        System.out.println(user02.hashCode());

        System.out.println(user03.hashCode());

    }

测试结果:

三次获取对象实例hashCode码不同,说明不是同一个对象。

request、session、global Session需要基于web容器环境,这里就不演示了,自己可以在搭建web环境测试。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值