首页 > 其他分享 >浅谈@PostConstruct注解

浅谈@PostConstruct注解

时间:2022-11-29 10:33:58浏览次数:52  
标签:RuleResultSet 浅谈 PostConstruct context 注解 itpcsConfigMapper itpcsConfig


目录

  • ​​前言:​​
  • ​​常见业务背景:​​

前言:

我们在Spring项目中经常会遇到@PostConstruct注解,可能有的伙伴对这个注解很陌生,出现场景如:

浅谈@PostConstruct注解_spring


首页介绍一下它的用途:@PostConstruct该注解在​​Java EE5​​​规范中加入,被用来修饰一个​​非静态​​​的​​void()方法​​​。被@PostConstruct修饰的方法会在服务器​​加载Servlet​​​的时候运行,并且只会被服务器​​执行一次​​​。PostConstruct在​​构造函数之后执行​​​,​​init()方法之前执行​​。

通常在Spring项目中,该注解的方法在整个Bean初始化中的执行顺序:

Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)

注意:

  1. 除了拦截器这个特殊情况以外,其他情况都不允许有参数,否则spring框架会报IllegalStateException;而且返回值要是void,但实际也可以有返回值,至少不会报错,只会忽略
  2. 方法随便你用什么权限来修饰,public、protected、private都可以,反正功能是由反射来实现
  3. 方法不可以是static的,但可以是final的
  4. 文档中说一个类只能有一个方法加此注解,但实际测试中,我在一个类中多个方法加了此注解,并没有报错,而且都执行了,我用的是 Spring Boot 框架。

常见业务背景:

数据预热:在程序启动的过程中需要从数据库中加载数据并缓存到程序的内存中。

在使用@PostConstruct注解以前,我们的做法是容器启动过程中,通过依赖查找的方式获取到mapper,然后从数据库中获取数据并缓存到内存中,实现方式如下:

@Slf4j
public class MainClass {

public static ClassPathXmlApplicationContext context = null;

private static CountDownLatch shutdownLatch = new CountDownLatch(1);

public static void main(String[] args) throws Exception {
// 加载spring上下文
context = new ClassPathXmlApplicationContext(new String[]{"spring-config.xml"});
context.start();
// 从数据库获取数据并缓存到内存
// 1.从容器中获取mapper
ItpcsConfigMapper itpcsConfigMapper = (ItpcsConfigMapper) context.getBean("itpcsConfigMapper");
// 2.从数据库中获取数据
List<ItpcsConfig> RuleResultSet = itpcsConfigMapper.selectAll();
// 3.将数据加载到PropertyMap中
RuleResultSet.forEach(itpcsConfig -> PropertyMap.add(itpcsConfig.getName(), itpcsConfig.getValue()));

context.registerShutdownHook();
log.info(LogUtil.marker(), "System already started.");
shutdownLatch.await();
}
}

使用@PostConstruct注解后:

@Slf4j
@Component
public class InitConfigParameter {


@Resource
private ItpcsConfigMapper itpcsConfigMapper;

@PostConstruct
public void init() throws Exception {
// 将数据库中的参数加载到哈希表中
List<ItpcsConfig> RuleResultSet = itpcsConfigMapper.selectAll();
log.info(LogUtil.marker(RuleResultSet), "init propertyMap");
RuleResultSet.forEach(itpcsConfig -> PropertyMap.add(itpcsConfig.getName(), itpcsConfig.getValue()));
}
}

使用@PostConstruct注解修饰的init方法就会在Spring容器的启动时自动的执行


标签:RuleResultSet,浅谈,PostConstruct,context,注解,itpcsConfigMapper,itpcsConfig
From: https://blog.51cto.com/u_15895329/5894212

相关文章

  • SpringBoot2 常用注解
    目录​​SpringBoot2常用注解​​​​@SpringBootApplication​​​​@EnableAutoConfiguration​​​​@ImportResource​​​​@Value​​​​@ConfigurationProperties(......
  • 浅谈学习
    学习技术,比起抢跑的益处,对技术本身的热爱应该会让你走的更远。学习底层,让你的思考方式高度更高。以前总觉得学习是一个完全积累的过程,以积累为量化,容易急切而不安。现在......
  • 《浅谈决策单调性动态规划的线性解法》阅读随笔
    读下来唯二的感想这就是集训队吗真nb这就是集训队吗写的什么jb这latex就很离谱好吧一个变量改好几次名字我都不知道他在干什么啊对了没实现代码啊都是找的st......
  • Java 注解和反射(四)Java内存分析
     类的加载过程 类的加载与ClassLoader的理解加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法去区的运行时数据结构,然后生成一个代表这个......
  • redis + 注解自动缓存
    1、redis配置引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></depende......
  • 注解开发-->面向切面
    1.创建一个接口 2.编写切面的方法   3.在方法上调用注解 ......
  • 浅谈一道数学题
    今天不讲编程知识,谈谈与编程相关的数学。本文使用数学符号:⁰¹²³⁴⁵⁶⁷⁸⁹⁻ⁿ∵∴0123456789+-n因为所以请确认能否正常显示:题......
  • [FE] 浅谈 Chakra UI 的现代化浅封装 - 语义化大行其道
     Web2.0发展至今,网页元素越来越丰富和多样化,数据越来越多。从需求上来说,也已经不再是展示简单个静态网页,高效的开发交互、打通后端数据,产生了React和Vue两个著名框......
  • 一文带你了解 Spring 的@Enablexxx 注解
    layout:postcategories:Javatitle:一文带你了解Spring的@Enablexxx注解tagline:by子悠tags:-子悠前面的文章给大家介绍Spring的重试机制的时候有提到......
  • 第3章-Spring基于注解配置的容器
    目录一、Bean管理1.扫描类路径配置2.使用注解管理Bean二、依赖管理1.依赖注入1.1字段注入1.2构造器注入1.3Setter方法注入2.依赖关系3.懒加载三、附录1.配置属......