首页 > 其他分享 >bean的生命周期

bean的生命周期

时间:2025-01-21 14:58:45浏览次数:1  
标签:xml 初始化 生命周期 bean 销毁 方法 public

bean的生命周期

bean的生命周期指的就是bean从创建到销毁的过程

  • 初始化容器
    1. 创建对象(内存分配)
    2. 执行构造方法
    3. 执行属性注入(set操作)
    4. 执行bean初始化方法
  • 使用bean
    1. 执行业务操作
  • 关闭/销毁容器
    1. 执行bean的销毁方法

管理bean的生命周期有两种方式,一种通过xml配置,一种通过接口实现方法

第一种 通过xml配置管理

编写初始方法和销毁方法
在初始方法和销毁方法中写好我们需要做的事
例如,当我们需要在UserService初始化和销毁时做一些事,我们可以这样写:


public class UserServiceImpl implements UserService {
    private UserMapper userMapper;
    public void setUserMapper(UserMapper userMapper) {
        this.userMapper = userMapper;
    }
    @Override
    public User getUserById(String id) {
        if (StringUtils.hasLength(id)) {
            //模拟获取用户
            User user = userMapper.selectById(id);
            System.out.println("user = " + user.toString());
            return user;
        }
        //模拟未找到用户
        System.out.println("用户id为空");
        return null;
    }

    public void init(){
        System.out.println("初始化UserService方法!!!");
    }

    public void destory(){
        System.out.println("销毁UserService方法!!!");
    }

}

其中init和destory分别是初始化和销毁方法,名字可以自定义,当我们使用xml来配置这初始化和销毁方法时,应该注意:

初始化方法和销毁方法必须是无参数的

随后我们就可以开始配置spring.xml

    <bean id="userMapper" class="com.zjw.ss.mapper.UserMapper">
    </bean>
     <bean id="userService" class="com.zjw.ss.service.impl.UserServiceImpl" init-method="init" destroy-method="destory">
        <property name="userMapper" ref="userMapper"/>
    </bean>

第二种 使用接口

spring提供了两个接口来自定义初始化和销毁方法
InitializingBean,DisposableBean
这两个接口各自有一个需要重写的方法
InitializingBean -> afterPropertiesSet()
DisposableBean -> destroy()
我们在这两个方法中写好我们初始化和销毁时需要做的内容


    @Override
    public void destroy() throws Exception {
        System.out.println("销毁UserService方法!!!");

    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("初始化UserService方法!!!");
    }

我们在xml中也就不需要再指定init-method和destroy-method

    <bean id="userMapper" class="com.zjw.ss.mapper.UserMapper">
    </bean>
    <bean id="userService" class="com.zjw.ss.service.impl.UserServiceImpl">
        <property name="userMapper" ref="userMapper"/>
    </bean>

Application的main方法:

public class StudySpringApplication {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
        UserServiceImpl userService = (UserServiceImpl) ctx.getBean("userService");
        User user = userService.getUserById("1");
    }
}

xml方式执行效果:
xml配置执行效果.png

接口方式执行效果:
接口方式执行效果.png

为什么只执行了初始化,却没有执行销毁方法呢
因为在程序执行结束后,jvm虚拟机被关闭时没有给容器销毁bean的机会

我们可以选择手动关闭spring容器
在Application的main方法中加上close方法

public class StudySpringApplication {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
        UserServiceImpl userService = (UserServiceImpl) ctx.getBean("userService");
        User user = userService.getUserById("1");
        ctx.close();
    }
}

或者在main方法中new ClassPathXmlApplicationContext("spring.xml")后的任意位置调用ctx.registerShutdownHook()

public class StudySpringApplication {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
        ctx.registerShutdownHook();
        UserServiceImpl userService = (UserServiceImpl) ctx.getBean("userService");
        User user = userService.getUserById("1");
    }
}

这两者的区别在于close方法会强制关闭IOC容器,执行完close方法后,无法再通过getBean获取容器中的bean
而registerShutdownHook方法可以放在方法的其他地方,不需要担心位置导致容器被关闭,这个方法会让IOC容器在jvm关闭前先执行关闭容器

尝试执行:
关闭容器.png

标签:xml,初始化,生命周期,bean,销毁,方法,public
From: https://www.cnblogs.com/helex/p/18683599

相关文章

  • Unity常用生命周期方法
    1.Awake()作用:Awake()是Unity脚本中的一个生命周期方法,在脚本实例化时被调用。它通常用于进行初始化操作,比如设置初始状态、引用其他组件等。调用时机:Awake()在对象激活的时刻调用,并且它会在场景中的所有对象的Start()方法之前执行。Awake()只会在脚本或物体第一次......
  • 什么是项目的生命周期?
    项目一定有始有终,从启动到完成的时间段称为项目的生命周期(LifeCycle)。不同的项目,其生命周期的特性也会有所不同,但一般而言都具有如下特征:●成本与资源的投入在项目开始时较低,在执行阶段逐渐增加,并在项目快要结束时迅速回落。●项目的风险/不确定性在开始时最大,随着决策的......
  • Spring,Spring Ioc,Bean详解
    Spring框架Spring框架是Java应用最广的框架,其的成功来自于理念,并非是技术,其中几个理念非常重要,例如IoC(控制反转),AOP(面向切面编程)Spring的优势低耦合/低侵入(解耦)Spring通过IoC(控制反转)和DI(依赖注入)来实现低耦合高内聚声明式事务管理Spring基于AOP的方......
  • jest.spyOn 如何监听vue的 created生命周期
    jest.spyOn是Jest测试框架提供的一个功能,用于创建一个间谍(spy)来监视对象上的方法调用。然而,直接使用jest.spyOn来监听Vue组件的生命周期钩子如created并不是最直观的方法,因为这些钩子并不是组件实例上的公开方法,而是由Vue框架内部管理的。为了测试Vue组件的生命周期......
  • Spring中Bean的作用域解析及使用场景
    目录一、Singleton(单例模式)二、Prototype(原型模式)三、Request(请求作用域)四、Session(会话作用域)五、GlobalSession(全局会话作用域)六、Application(应用作用域)七、WebSocket(WebSocket作用域)在Spring框架中,Bean的作用域决定了Bean的生命周期和可见范围。合理选择Bean的作......
  • 注解开发bean
    Bean的定义Spring通过注解将类标记为Bean,并将其注册到Spring容器中。常用注解:@Component通用的注解,用于标记一个类为Spring的Bean。Spring会自动扫描并注册该类为Bean。@Service用于标记服务层的类,通常用于业务逻辑层。功能和@Component相同,但语义上更清晰。@Repositor......
  • 计算机毕业设计Springboot新能源产品管理系 基于Springboot的新能源产品全生命周期管
    计算机毕业设计Springboot新能源产品管理系统94pp5688(配套有源码程序mysql数据库论文)本套源码可以先看具体功能演示视频领取,文末有联xi可分享随着全球能源危机和环境问题的日益严重,各国政府纷纷提出新能源发展战略,以降低对化石能源的依赖,减少温室气体排放,实现可持续发展......
  • Spring 开发必备:深入解析 Spring Bean 的六大作用域
    SpringBean一共有六种作用域,我们可以将它们比作是不同场景下的“服务助手”。1.单例作用域(Singleton):•就像餐厅里只有一个“领班助手”,无论顾客多少次呼唤,来的都是同一位助手。•在Spring容器中,单例作用域的Bean也只会有一个实例,无论在哪里获取,都是同一个对象。•适......
  • Spring Bean的生命周期
    概述:        Spring的Bean的生命周期指的是Bean从创建到初始化再到销毁的过程,这个过程由IOC容器管理。一个bean的生命周期主要是4个步骤,实例化,属性注入,初始化,销毁,但是对于一些复杂的bean的创建,Spring会在Bean的生命周期中开放很多的接口,能够让你加载Bean的时候对Bean......
  • vue生命周期调用
    <template><div><!--用户页的面包屑导航--><navaria-label="breadcrumb"><olclass="breadcrumb"><liclass="breadcrumb-item"><router-linkto="/"cla......