Spring管理bean细节

1 bean实例化介绍

2 bean实例化方式【

2.1 构造方法的方式

它会根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败

2.1.1 创建User类

public class User implements Serializable {
    public User(){
        System.out.println("user created...");
    }
}

2.1.2 配置Spring容器管理user 类型对象

<!--配置user对象-->
<bean id="user" class="com.ujiuye.pojo.User"></bean>

2.1.3 测试容器实例化User对象是否成功

    @Test
    public void testUser(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) context.getBean("user");
        System.out.println(user);
    }

2.2 静态工厂方式

2.2.1 创建静态工厂ItemFactory

public class ItemFactory {
​
    //静态方法返回实例bean
    public static User createUser(){
        System.out.println("static method running create bean ......");
        return new User();
    }
}

2.2.2 配置Spring容器管理User类型对象

<!--静态工厂实例化对象:
   工厂方法的返回值存放在IOC容器当中
-->
<bean id="user" class="com.ujiuye.factory.ItemFactory" factory-method="createUser"></bean>

2.2.3 测试容器实例化User对象是否成功

    @Test
    public void testItemFactory(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) context.getBean("user");
        System.out.println(user);
    }

2.3 实例工厂方式

2.3.1 创建实例工厂NewItemFactory

public class NewItemFactory {
    //工厂的非静态方法返回bean实例
    public User createUser(){
        System.out.println("Dynamic method running create bean ......");
        return new User();
    }
}

2.3.2 配置Spring容器管理NewItemFactory类型对象

<!--实例工厂:
   步骤一; 创建对象
   步骤二: 通过对象调用方法,方法的返回值存在IOC容器当中。 
-->
 <bean id="itemFactory" class="com.ujiuye.factory.NewItemFactory"></bean>
 <bean id="user" factory-bean="itemFactory" factory-method="createUser"></bean>

2.3.3 测试容器实例化User对象是否成功

    @Test
    public void testNewItemFactory(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) context.getBean("user");
        System.out.println(user);
    }

3 bean作用域

3.1 bean作用域介绍

话术:
所谓Bean的作用域其实就是指Spring给我们创建出的对象的存活范围,在配置文件中通过bean的scope属性指定
<bean id="" class="" scope="">
scope:指对象的作用范围,取值如下: 
​
取值范围说明
singleton默认值,单例的
prototype多例的
requestWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
sessionWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
global sessionWEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session

3.2 bean作用域的解析

3.2.1 当scope的取值为singleton时

Bean的实例化个数:1个

Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例

3.2.2 当scope的取值为prototype时

Bean的实例化个数:多个

Bean的实例化时机:当调用getBean()方法时实例化Bean

3.2.3 当Scope的取值为其他值

scope指定为其他值,需要在特定的环境下使用, 只需要作为一个了解知识,面试能够回答出来即可

4 bean的生命周期

讲解思路: 
 1、介绍bean的生命周期
 2、bean标签当中init-method属性和 destroy-method 属性
 3、分别介绍单例模式和多例模式生命周期

4.1 bean生命周期介绍

话术:
在这里所谓的Bean的生命周期其实指的是Bean创建到销毁的这么一段时间。 
在Spring中可以通过配置的形式,指定bean在创建后和销毁前要调用的方法。
属性:
init-method:指定bean在创建后调用的方法
destroy-method:对象在销毁前调用的方法
<bean id="xxx" class="xxx" init-method="" destroy-method=""></bean>

4.2 单例对象的生命周期

4.2.1 在UserService中添加方法init和destory

public class UserServiceImpl implements UserService {
    public void init(){
        System.out.println("init method running...");
    }
    @Override
    public void saveService() {
        System.out.println("userSerivce save method running......");
    }
​
    public void destroy(){
        System.out.println("destroy method running...");
    }
}

4.2.2 在Spring.xml配置文件中配置UserService

<!--配置userServiceImpl-->
<bean id="userService" class="com.ujiuye.service.UserServiceImpl" init-method="init" destroy-method="destroy">
    
</bean>

4.2.3 测试代码验证单例对象的生命周期

@Test
    public void test1(){
        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) applicationContext.getBean("userService");
        userService.saveService();
        //关闭工厂:
        applicationContext.close();
    }

单例对象总结:

对象创建:当应用加载,创建容器时,对象就被创建了

对象运行:只要容器在,对象一直活着

对象销毁:当应用卸载,销毁容器时,对象就被销毁了

4.3 多例对象的生命周周期

4.3.1 修改Spring配置文件scope属性

 <!--配置userServiceImpl-->
 <bean id="userService" class="com.ujiuye.service.UserServiceImpl" init-method="init" destroy-method="destroy" scope="prototype"></bean>

4.3.2 测试代码验证多例对象的生命周期

@Test
public void test1(){
    ClassPathXmlApplicationContext applicationContext =
        new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService userService = (UserService) applicationContext.getBean("userService");
    userService.saveService();
    //关闭工厂:
    applicationContext.close();
}

多例对象总结:

对象创建:当使用对象时(getBean),创建新的对象实例

对象运行:只要对象在使用中,就一直活着

对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了, 对destroy-method属性针对单例不生效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值