原文: http://zetcode.com/springboot/postconstruct/

Spring Boot @PostConstruct教程显示了如何在 Spring 应用中使用@PostConstruct注解。

Spring 是流行的 Java 应用框架,而 Spring Boot 是 Spring 的演进,可以帮助轻松地创建独立的,生产级的基于 Spring 的应用。

@PostConstruct

@PostConstruct是在依赖注入完成以执行任何初始化之后需要执行的方法上使用的注解。

Spring Boot @PostConstruct示例

以下应用演示了@PostConstruct的用法。 它使用注解创建两个日志方法,在初始化它们的 bean 之后调用它们。 这些消息在应用运行后显示。 应用本身向客户端发送一条消息。 从配置文件中读取文本消息。

  1. $ tree
  2. .
  3. ├── pom.xml
  4. └── src
  5. ├── main
  6. ├── java
  7. └── com
  8. └── zetcode
  9. ├── Application.java
  10. ├── controller
  11. └── MyController.java
  12. └── service
  13. ├── IMessageService.java
  14. └── MessageService.java
  15. └── resources
  16. ├── application.properties
  17. └── static
  18. └── index.html
  19. └── test
  20. └── java

这是项目结构。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>SpringBootPostConstruct</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>jar</packaging>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <maven.compiler.source>1.8</maven.compiler.source>
  14. <maven.compiler.target>1.8</maven.compiler.target>
  15. </properties>
  16. <parent>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-parent</artifactId>
  19. <version>1.5.9.RELEASE</version>
  20. </parent>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-web</artifactId>
  25. </dependency>
  26. </dependencies>
  27. <build>
  28. <plugins>
  29. <plugin>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-maven-plugin</artifactId>
  32. </plugin>
  33. </plugins>
  34. </build>
  35. </project>

这是 Maven pom.xml文件。 spring-boot-starter-parent是父 POM,它为使用 Maven 构建的应用提供依赖关系和插件管理。 spring-boot-starter-web是使用 Spring MVC 构建 Web(包括 RESTful)应用的入门工具。 它使用 Tomcat 作为默认的嵌入式容器。 spring-boot-maven-plugin将 Spring 应用打包到可执行的 JAR 或 WAR 归档文件中。

application.properties

  1. my.msg=Hello there
  2. spring.main.banner-mode=off
  3. logging.level.org.springframework=ERROR

application.properties是 Spring Boot 中的主要配置文件。 我们设置了一个message属性,该属性将由应用返回给客户端。 我们关闭 Spring 横幅并减少 Spring 框架的日志记录量。

MyController.java

  1. package com.zetcode.controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. import com.zetcode.service.IMessageService;
  6. import javax.annotation.PostConstruct;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. @RestController
  10. public class MyController {
  11. private static final Logger logger = LoggerFactory.getLogger(MyController.class);
  12. @Autowired
  13. IMessageService messageService;
  14. @RequestMapping(value = "/getMessage")
  15. public String getMessage() {
  16. String message = messageService.getMessage();
  17. return message;
  18. }
  19. @PostConstruct
  20. public void doLog() {
  21. logger.info("Info message in MyController");
  22. }
  23. }

这是MyController。 它向客户端发送一条消息。

  1. @RequestMapping(value = "/getMessage")
  2. public String getMessage() {
  3. String message = messageService.getMessage();
  4. return message;
  5. }

从消息服务生成一条消息,并将其返回给客户端。

  1. @PostConstruct
  2. public void doLog() {
  3. logger.info("Info message in MyController");
  4. }

doLog()方法用@PostConstruct注解修饰。 在初始化MyController bean 之后调用该方法。 它记录一条简单的参考消息。

IMessageService.java

  1. package com.zetcode.service;
  2. public interface IMessageService {
  3. public String getMessage();
  4. }

IMessageService包含getMessage()合约方法。

MessageService.java

  1. package com.zetcode.service;
  2. import javax.annotation.PostConstruct;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.stereotype.Service;
  7. @Service
  8. public class MessageService implements IMessageService {
  9. private static final Logger logger = LoggerFactory.getLogger(MessageService.class);
  10. @Value(value = "${my.msg}")
  11. private String message;
  12. @Override
  13. public String getMessage() {
  14. return message;
  15. }
  16. @PostConstruct
  17. public void doLog() {
  18. logger.info("Info message in MessageService");
  19. }
  20. }

MessageService包含getMessage()方法的实现。

  1. @Value(value = "${my.msg}")
  2. private String message;

从带有@Value注解的application.properties文件中读取返回给客户端的消息,并将其设置为message字段。

  1. @Override
  2. public String getMessage() {
  3. return message;
  4. }

getMessage()返回消息字符串。

  1. @PostConstruct
  2. public void doLog() {
  3. logger.info("Info message in MessageService");
  4. }

MessageService还包含用@PostConstruct装饰的doLog()方法。 在 bean 初始化之后调用它。

index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Home page</title>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. </head>
  8. <body>
  9. <p>
  10. <a href="getMessage">Get Message</a>
  11. </p>
  12. </body>
  13. </html>

这是主页。 它包含一个获取消息的链接。

Application.java

  1. package com.zetcode;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Application.class, args);
  8. }
  9. }

Application是设置 Spring Boot 应用的入口。 @SpringBootApplication注解启用自动配置和组件扫描。

  1. $ mvn -q spring-boot:run
  2. ...
  3. 2017-12-14 21:35:30.788 INFO 10665 --- [main] com.zetcode.service.MessageService : Info message in MessageService
  4. 2017-12-14 21:35:30.791 INFO 10665 --- [main] com.zetcode.controller.MyController : Info message in MyController
  5. ...

应用运行后,我们可以在控制台上看到这两个日志消息。

在本教程中,我们展示了如何在 Spring 应用中使用@PostConstruct注解。 您可能也对相关教程感兴趣: Java Servlets 教程Spring Boot @Controller教程Spring Boot @ExceptionHandler教程Spring Boot 上传文件Spring Boot @PathVariable教程Spring Boot @RequestParam教程Spring Boot @ResponseBody教程Java 教程