Bean的三种生成方式和五种作用域范围

Bean的概念

Spring中Bean就是一个类的实例

<bean id="" class="" />
通过构造器完成类的实例化

Bean的生成方式有三种:

1、构造器生成
<?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">
    <!--
        Bean的生成方式
        1、构造器生成
        com.hhh.pojo.User必须有为空的构造器
    -->
    <bean id="user" class="com.hhh.pojo.User"></bean>
</beans>
@Test
    public void testConstrutor(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("app2.xml");
        User user = (User) applicationContext.getBean("user");
        System.out.println(user);
    }
2、静态工厂
package com.hhh.util;

import com.hhh.pojo.User;

/**
 * @Author: hehehe
 * @Date: 2022/4/15 15:22
 */
public class UserFactory {
    public static User getUser(){
        return new User();
    }
}

<?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">

    <!--
        2、静态工厂
        User user = UserFactory.getUser();
    -->
    <bean id="user2" class="com.hhh.util.UserFactory" factory-method="getUser"></bean>
  
</beans>
3、实例工厂
package com.hhh.util;

import com.hhh.pojo.User;

/**
 * @Author: hehehe
 * @Date: 2022/4/15 15:22
 */
public class UserFactory2 {
    public User getUser(){
        return new User();
    }
}

<?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">
    <!--
        3、实例工厂
        UserFactory userFactory = new UserFactory();
        User user = userFactory.getUser();
    -->
    <bean id="userFactory" class="com.hhh.util.UserFactory2"></bean>
    <bean id="user3" factory-bean="userFactory" factory-method="getUser"></bean>
</beans>

bean的作用域范围

scope有如下五个取值:

  • singleton:单例的(默认的),使用singleton定义的Bean是单例的,每次调用getBean都是调用的同一个对象。只要IoC容器一创建就会创建Bean的实例。
  • prototype:多例的,每次通过Spring IoC容器获取prototype定义的Bean时,容器都将创建一个新的Bean实例。创建时不会实例该Bean,只有调用getBean方法时,才会实例化。
  • request:作用于web的请求范围,在每一次HTTP请求时,容器会返回Bean的同一个实例,对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Request内有效。
  • session:作用于web的会话范围,在一次HTTP Session中,容器会返回该Bean的同一个实例,对不同的HTTP请求则会产生一个新的Bean,而且该Bean仅在当前HTTP Session内有效。
  • global-session:作用于集群环境的会话范围(全局会话范围),在一个全局的HTTP Session中,容器返回Bean的同一个实例。当不是集群环境时,它就是session。
<?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">
    <!--
        Bean的作用范围
        prototype   原型  每次获取产生一个新的实例
        singleton   单例  每次获取都是同一个实例
        request     以下三个属性是在web应用中使用
        session
        gobal-session
    -->
    <bean id="user" class="com.hhh.pojo.User" scope="singleton"></bean>

</beans>
    @Test
    public void testScope(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("app3.xml");
        //从容器中两次获得相同的id,判断两个实例是否相等,相等为单例,否则为多例
        User user = (User) applicationContext.getBean("user");
        User user2 = (User) applicationContext.getBean("user");
        System.out.println(user==user2);
    }
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何呵呵是大佬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值