gpt4 book ai didi

java - spring boot - @PostConstruct 未在 @Component 上调用

转载 作者:行者123 更新时间:2023-12-02 09:14:15 25 4
gpt4 key购买 nike

我是 Spring 新手,我使用 https://start.spring.io/ 创建了一个新的 Spring Boot 项目没有进一步的依赖项,解压缩 zip 文件并在 IntelliJ IDEA 中打开该项目。我还没有进行任何进一步的配置。我现在尝试使用 @PostConstruct 方法设置一个 bean - 但是,spring 永远不会调用该方法。

这些是我的类(class):

SpringTestApplication.java

package com.habichty.test.testspring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class SpringTestApplication {

public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringTestApplication.class, args);
context.getBean(TestBean.class).testMethod();
}
}

TestBean.java

package com.habichty.test.testspring;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class TestBean {
private final Logger log = LoggerFactory.getLogger(this.getClass());
private int a = 1;

public TestBean()
{
log.debug("Constructor of TestBean called.");
}

@PostConstruct
public void init()
{
log.debug("init()-Method of TestBean called.");
a = 2;
}

public void testMethod()
{
log.debug("Test Method of TestBean called. a=" + a);
}

}

当我启动应用程序时,这是我的输出:

 :: Spring Boot ::        (v1.5.9.RELEASE)

2018-01-22 13:15:57.960 INFO 12035 --- [ main] c.h.t.testspring.SpringTestApplication : Starting SpringTestApplication on pbtp with PID 12035 (/home/pat/prj/testspring/testspring/target/classes started by pat in /home/pat/prj/testspring/testspring)
2018-01-22 13:15:57.962 DEBUG 12035 --- [ main] c.h.t.testspring.SpringTestApplication : Running with Spring Boot v1.5.9.RELEASE, Spring v4.3.13.RELEASE
2018-01-22 13:15:57.962 INFO 12035 --- [ main] c.h.t.testspring.SpringTestApplication : No active profile set, falling back to default profiles: default
2018-01-22 13:15:58.018 INFO 12035 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2931522b: startup date [Mon Jan 22 13:15:58 CET 2018]; root of context hierarchy
2018-01-22 13:15:58.510 DEBUG 12035 --- [ main] com.habichty.test.testspring.TestBean : Constructor of TestBean called.
2018-01-22 13:15:58.793 INFO 12035 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2018-01-22 13:15:58.822 INFO 12035 --- [ main] c.h.t.testspring.SpringTestApplication : Started SpringTestApplication in 1.073 seconds (JVM running for 2.025)
2018-01-22 13:15:58.822 DEBUG 12035 --- [ main] com.habichty.test.testspring.TestBean : Test Method of TestBean called. a=1
2018-01-22 13:15:58.826 INFO 12035 --- [ Thread-1] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@2931522b: startup date [Mon Jan 22 13:15:58 CET 2018]; root of context hierarchy
2018-01-22 13:15:58.828 INFO 12035 --- [ Thread-1] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown

如您所见,spring 初始化 TestBean 并执行 testMethod() - 但使用 @PostConstruct 注释的 init() 方法并未被调用。

我做错了什么?非常感谢任何帮助。

更新1在我的 application.properties 中,我配置了:

logging.level.com = DEBUG

将其更改为 logging.level.root = DEBUG 会产生更大的日志。但是,它仍然不包含我的 init() 方法的调试消息。

更新2添加了包和导入语句。

更新 3 为了进一步澄清这不是日志记录问题,我在代码中添加了一个新的 int ,该代码应由 init() 方法更改。据我理解 @PostConstruct 注释的概念,它应该在任何其他方法执行之前执行。因此,testMethod() 的输出现在应包含 a=2。在更新的输出中,您可能会发现情况并非如此。

更新 4 这是我的 POM

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.habichty.test.testspring</groupId>
<artifactId>springTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>springTest</name>
<description>springTest</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

java -version 的输出:

java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)

最佳答案

由于Java9中的新模块系统,SpringBoot-1.5.9无法处理@PostConstruct,因为注释类不在类路径上。问题(或类似问题)描述为 herehere 。有以下几种方法可以解决:

  • 使用 Java8 运行应用程序,
    或者,如果仍然使用 Java9:
  • 向 POM 添加 javax.annotation:javax.annotation-api 依赖项,或者
  • 升级到包含该依赖项的较新 Spring-Boot 版本 2.0.0+(在撰写本文时仍处于 PRERELEASE 状态);

关于java - spring boot - @PostConstruct 未在 @Component 上调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48380553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com