当前位置: 首页 > news >正文

[Spring]-组件的生命周期

组件生命周期

认识组件的声明周期

实验1

通过@Bean指定组件的生命周期

package com.guigu.spring.ioc.bean;@Data
public class User {private String username;private String password;private Car car;@Autowiredpublic void setCar(Car car) {System.out.println("自动注入: 属性值" + car);this.car = car;}public User() {System.out.println("User 构造器...");}/*** 组件初始化*/public void initUser() {System.out.println("User组件初始化");}/*** 组件销毁*/public void destoryUser() {System.out.println("User组件销毁");}
}
package com.guigu.spring.ioc.config;@Configuration
public class UserConfig {@Bean(initMethod = "initUser", destroyMethod = "destoryUser")public User user() {return new User();}
}
package com.guigu.spring.ioc;/*** 主入口文件*/
@SpringBootApplication
public class Spring01IocApplication {/*** 组件的声明周期*/public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(Spring01IocApplication.class, args);}}

实验2

了解 InitializingBean接口 和 DisposableBean接口的 调用时机

package com.guigu.spring.ioc.bean;@Data
public class User implements InitializingBean, DisposableBean {private String username;private String password;private Car car;@Autowiredpublic void setCar(Car car) {System.out.println("setter自动注入: 属性值" + car);this.car = car;}public User() {System.out.println("User 构造器...");}/*** 组件初始化*/public void initUser() {System.out.println("User组件初始化");}/*** 组件销毁*/public void destoryUser() {System.out.println("User组件销毁");}/*** 属性设置之后调用: set赋值完成了* @throws Exception*/@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("[InitializingBean]接口调用afterPropertiesSet方法");}@Overridepublic void destroy() throws Exception {System.out.println("[DisposableBean]接口调用destroy方法");}
}

实验3

了解 @PostConstruct 和 @PreDestroy 的执行时机

package com.guigu.spring.ioc.bean;@Data
public class User implements InitializingBean, DisposableBean {private String username;private String password;private Car car;/*** 构造器后置处理钩子* 构造器之后执行*/@PostConstructpublic void postConstruct() {System.out.println("@PostConstruct....");}/*** 销毁预处理钩子*/@PreDestroypublic void preDestroy() {System.out.println("@PreDestroy....");}
}

实验4

理解后置处理器机制: 前面的周期都是本质都是通知, 处理机制本质是拦截, 可以直接修改bean

package com.guigu.spring.ioc.processor;@Component // 拦截所有Bean的后置处理器
public class MyTestBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("[postProcessBeforeInitialization]: " + beanName);if(bean instanceof User hello) {hello.setUsername("张三测试");System.out.println("User: " + bean);}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("[postProcessAfterInitialization]: " + beanName);return bean;}
}

单元测试

使用单元测试测试容器

  • @SpringBootTest注解用来开启测试,
  • 是测试那个主程序类呢? 根据包进行匹配,
  • 所以单元测试类所在的包要和主程序所在的包保持一致

注入组件并查看

package com.guigu.spring.ioc;@SpringBootTest // 测试SpringBoot功能, 测试容器
class Spring01IocApplicationTests {@AutowiredCar car;@Testvoid contextLoads() {System.out.println(car);}}

查看容器的创建

查看单元测试方法的结果

相关文章:

  • 碎片笔记|AI生成图像溯源方法源码复现经验(持续更新中……)
  • 设计模式-中介者模式
  • 研读论文《Attention Is All You Need》(4)
  • 【Oracle专栏】清理告警日志、监听日志
  • 如何创建自动工作流程拆分Google Drive中的PDF文件
  • 【kafka】kafka概念,使用技巧go示例
  • 【!!!!终极 Java 中间件实战课:从 0 到 1 构建亿级流量电商系统全链路解决方案!!!!保姆级教程---超细】
  • 试除法判断素数优化【C语言】
  • 解决docker alpine缺少字体的问题 Could not initialize class sun.awt.X11FontManager
  • 使用 Docker Desktop 安装 Neo4j 知识图谱
  • 面试--HTML
  • scikit-learn在无监督学习算法的应用
  • 网络协议分析 实验五 UDP-IPv6-DNS
  • Leetcode (力扣)做题记录 hot100(62,64,287,108)
  • Java 虚拟线程(Virtual Threads):原理、性能提升与实践
  • Vue 图片预览功能(含缩略图)
  • 5.14本日总结
  • 常见 RPC 协议类别对比
  • WEB安全--Java安全--CC1利用链
  • 如何迁移 WSL 卸载 Ubuntu WSL
  • 特朗普促卡塔尔说服伊朗放弃核计划,伊朗总统:你来吓唬我们?
  • 泽连斯基:正在等待俄方确认参加会谈的代表团组成
  • 国新办将就2025年4月份国民经济运行情况举行新闻发布会
  • “老中青少”四代同堂,季春艳携锡剧《玲珑女》冲击梅花奖
  • 持续8年仍难终了的纠纷:败诉方因拒执罪被立案,胜诉方银行账户遭冻结
  • 反制美国钢铝关税!印度拟对美国部分商品征收关税