当前位置: 首页 > 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);}}

查看容器的创建

查看单元测试方法的结果

http://www.xdnf.cn/news/447841.html

相关文章:

  • 【Linux网络】传输层协议TCP
  • TypeScript泛型:从入门到精通的全方位指南
  • Linux下的c/c++开发之操作Redis数据库
  • 上网行为审计软件系统说明书:上网行为审计是什么?是干啥的?哪家好?
  • AI世界的崩塌:当人类思考枯竭引发数据生态链断裂
  • new optimizers for dl
  • 在Unity中制作拥有36年历史的游戏系列新作《桃太郎电铁世界》
  • 通过宝塔配置HTTPS证书
  • Python爬虫实战:研究拦截器,实现逆向解密
  • UI 原型设计:交互规则的三要素——重要性、原则与实践
  • 【Liblib】基于LiblibAI自定义模型,总结一下Python开发步骤
  • 小说所有设定(v3.0 preview)
  • Qml自定义组件之车辆风扇展示
  • 【Linux】掌握 setsid:让进程脱离终端独立运行
  • 三种映射方式总结
  • 第二十九节:直方图处理-直方图均衡化
  • ET ProcessInnerSender类(实体) 分析
  • ultralytics中tasks.py---parse_model函数解析
  • 求助求助,重金酬谢
  • Java知识框架
  • AIGC与数字媒体实验室解决方案分享
  • Jmeter对服务端进行压测快速上手
  • 【电路笔记 通信】8B/10B编码 高速数据传输的串行数据编码技术 论文第三部分 The 8B/10B coding map
  • HarmonyOS NEXT 适配高德地图FlutterSDK实现地图展示,添加覆盖物和移动Camera
  • OpenCV CUDA 模块中用于在 GPU 上计算两个数组对应元素差值的绝对值函数absdiff(
  • Flutter 开发入门:从一个简单的计数器应用开始
  • 操作系统-物理结构
  • 【拥抱AI】Deer-Flow字节跳动开源的多智能体深度研究框架
  • MCP:开启AI的“万物互联”时代
  • 网站安全防御