Java spring 注解 @PostConstruct 实战讲解

这篇具有很好参考价值的文章主要介绍了Java spring 注解 @PostConstruct 实战讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

@postconstruct,PostConstruct,java

前言

        在最近的学习中,发现了一个非常实用的注解 —— @PostConstruct。通过学习了解,逐步发现它能帮助我更轻松的解决不少原本很复杂的问题。

        下面,结合实例介绍 @PostConstruct 注解的特性,因为@PreDestroy基本用不到,所以不浪费篇幅啦。


正文

1. 适用场景

        @PostConstruct 是Java5的时候引入的注解,作用在Servlet生命周期上,实现在Bean初始化之前自定义操作。在项目中,@PostConstruct注解主要是在Servlet初始化之前加载一些缓存数据,如:数据字典,读取properties配置文件等。

        通常,@PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。

       总结一下 @PostConstruct 的使用和特点:

  • 只有一个非静态方法能使用此注解;
  • 被注解的方法不得有任何参数;
  • 被注解的方法返回值必须为void;
  • 被注解方法不得抛出已检查异常;
  • 此方法只会被执行一次;

2.执行顺序

        往往我们在项目启动时需要加载某个方法的时候,可以使用@Component和@PostConstruct组合将一个方法完成初始化操作,@PostConstruct 注解的方法会将在依赖注入完成之后被自动调用。

        该注解在整个Bean初始化中执行的顺序:@Constructor(构造方法)-> @Autowired(依赖注入)-> @PostConstruct(注解的方法)。

@postconstruct,PostConstruct,java

3.注意事项

        使用此注解时会影响服务启动时间。服务启动时会扫描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包。

4.案例分析

        上面提到过, @PostConstruct 可以在Servlet初始化之前加载一些缓存数据,如:预热数据字典,读取properties配置文件,那案例就模拟这两个场景:

4.1 数据预热

        使用Redis进行的数据预热,需要项目启动以后,触发第一次调用才能生成缓存,而利用 @PostConstruct 注解能让预热数据在Bean初始化阶段完成,比Redis更早。

  • @Component+@PostConstruct完成预热
@Slf4j
@Configuration
public class BeanConfiguration {

    @Autowired
    private BusinessService businessService;

    // 模拟预热的数据
    private static String mysql_data;

    @PostConstruct
    public void construct(){
        log.info("〓〓〓〓〓〓〓〓〓〓 Autowired 加载完成!!");
        mysql_data = businessService.demo5();
        log.info("〓〓〓〓〓〓〓〓〓〓 mysql_data = " + mysql_data);
    }
}
  • BusinessService 演示
@Slf4j
@Service
public class BusinessServiceImpl implements BusinessService {

    /**
     * 模拟从数据库查询数据的操作
     */
    public String demo5() {
        log.info("〓〓〓〓〓〓〓〓〓〓 demo5:执行!!");
        return "mysql data";
    }
}
  • 执行效果:可以看到,数据的加载是在依赖注入之后,项目启动完成之前

@postconstruct,PostConstruct,java

4.2 加载配置文件

        @Value 注解修饰的常量不能是静态的,否则会 null,因为 static 的加载在 @Value 之前。如果不是 static 的,就要每次使用都要去加载一次 .properties 文件,有悖我们设置常量类的初衷。

        现在,@PostConstruct注解可以帮我们完成预期,因为@PostConstruct的加载是在static之后的,不会出现null的情况,演示一下:

  • @Value获取数据,再通过@PostConstruct向static常量赋值
@Slf4j
@Component
public class GlobalConstent {

    @Value("${server.port}")
    private String port;
    // 模拟静态常量
    public static String server_port;
    
    @PostConstruct
    public void construct(){
        log.info("〓〓〓〓〓〓〓〓〓〓 Before PostConstruct:" + server_port);
        server_port = port;
        log.info("〓〓〓〓〓〓〓〓〓〓 After PostConstruct:" + server_port);
    }
}
  • 使用过程很友好,直接采用“类名·”的方式访问
@Slf4j
@RestController
@RequestMapping("/construct")
public class PostConstructController {

    @RequestMapping("/demo")
    public String demo() {
        log.info("〓〓〓〓〓〓〓〓〓〓 server_port:" + GlobalConstent.server_port);
        return "success";
    }
}
  • 结果展示:加载过程都在项目成功启动之前

@postconstruct,PostConstruct,java文章来源地址https://www.toymoban.com/news/detail-773753.html


总结

  1. @PostConstruct注解时会影响服务启动时间,服务启动时会扫描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包;
  2. @PostConstruct注解在整个Bean初始化中执行的顺序:@Constructor(构造方法)-> @Autowired(依赖注入)-> @PostConstruct(注解的方法);
  3. @PostConstruct 可以在Servlet初始化之前加载一些缓存数据,如:预热数据字典,读取properties配置文件;

到了这里,关于Java spring 注解 @PostConstruct 实战讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • spring管理的bean在静态方法使用技巧——@PostConstruct

            如果我们使用正常的 @Component 注解将一个类交由spring管理,然后在使用的时候用@Resource注入对象,在没有碰到静态方法的时候,是不会出现问题,但是如果出现了静态方法,这样的使用方法就会出现 空指针的异常 ,也就是你@Resource注入的对象是空         一

    2024年02月10日
    浏览(14)
  • @PostConstruct和@PreDestroy与servlet生命周期的关系

    @PostConstruct和@PreDestroy与servlet生命周期的关系

      在 Servlet 的生命周期中, init()  和  destroy()  方法的作用分别是: init() : 此方法在 Servlet 实例化后立即调用,用于执行一次性的初始化工作(例如,打开数据库连接、初始化配置设置等)。Servlet 容器在部署后首次接收到对该 Servlet 的请求时,或者服务器启动时,会创建

    2024年02月16日
    浏览(8)
  • Java、Java EE、Spring和Spring Boot核心注解

    文章迁移至个人博客 此页面包含常用 Java 、 Java EE 、 Spring 、 Spring Boot 、 JPA 常用注解的一站式说明。 @Component注解 @Component 注解表明被注解的类是一个“spring bean/组件”。@Component注解告诉Spring容器自动创建Spring bean。 @Autowired注解 @Autowired 注解用于自动注入 bean。@Autowired 注

    2024年02月15日
    浏览(15)
  • 计算机毕业设计 基于Spring Boot智能停车计费系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

    计算机毕业设计 基于Spring Boot智能停车计费系统的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

    🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不

    2024年02月07日
    浏览(13)
  • Java注解方式实现aop,切点切面实战

    Java注解方式实现aop,切点切面实战

    注解方式实现aop我们主要分为如下几个步骤(有更好的方法的话,欢迎交流): 1.在切面类(为切点服务的类)前用@Aspect注释修饰,声明为一个切面类。 2.用@Pointcut注释声明一个切点,目的是为了告诉切面,谁是它的服务对象。(此注释修饰的方法的方法体为空,不需要写功

    2024年02月12日
    浏览(9)
  • java spring boot 注解、接口和问题解决方法(持续更新)

    java spring boot 注解、接口和问题解决方法(持续更新)

    @RestController         是SpringMVC框架中的一个注解,它结合了@Controller和@ResponseBody两个注解的功能,用于标记一个类或者方法,表示该类或方法用于处理HTTP请求,并将响应的结果直接返回给客户端,而不需要进行视图渲染 @Controller         是Spring Framework中的注解,用于

    2024年02月06日
    浏览(10)
  • Spring-2-深入理解Spring 注解依赖注入(DI):简化Java应用程序开发

    Spring-2-深入理解Spring 注解依赖注入(DI):简化Java应用程序开发

      掌握纯注解开发依赖注入(DI)模式 学习使用纯注解进行第三方Bean注入 问题导入 思考:如何使用注解方式将Bean对象注入到类中 1.1 使用@Autowired注解开启自动装配模式(按类型) 说明:不管是使用配置文件还是配置类,都必须进行对应的Spring注解包扫描才可以使用。@Autowired默

    2024年02月14日
    浏览(15)
  • Spring boot注解讲解

    Spring boot注解讲解

    人不走空                                                                            目录         🌈个人主页:人不走空       💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨   注解 注解列表如下 JPA注解 作者其他作品:   @SpringBootApplication :申

    2024年02月19日
    浏览(13)
  • Spring CORS 跨域使用与原理(@CrossOrigin注解,Java配置类方式,xml方式)

    出于安全原因,浏览器禁止AJAX调用当前源之外的资源。 跨域资源共享(CORS)是由大多数浏览器实现的W3C规范,它允许您以一种灵活的方式指定授权哪种跨域请求,而不是使用一些不太安全、功能不太强大的hack(如IFrame或JSONP)。 Spring Framework 4.2 GA为CORS提供了一流的开箱即用支持

    2024年02月08日
    浏览(14)
  • Spring 声明式事务讲解,和 @Transactional注解的用法

    Spring 声明式事务讲解,和 @Transactional注解的用法

    目录 一、Spring框架介绍 二、什么是声明式事务 三、如何解决并发性事务问题 四、@Transactional注解的用法 Spring框架是一个开源的Java应用程序开发框架,旨在简化企业级Java应用程序的开发。它提供了一种轻量级的、全面的编程和配置模型,可以帮助开发人员构建可扩展、模块

    2024年01月25日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包