복붙노트

[SPRING] 봄 부팅 @Component에서 @PostConstruct가 호출되지 않음

SPRING

봄 부팅 @Component에서 @PostConstruct가 호출되지 않음

나는 봄에 익숙하지 않으며 https://start.spring.io/를 사용하여 새로운 스프링 부트 프로젝트를 만들었습니다. 더 이상 의존성이없고 zip 파일의 압축을 풀고 IntelliJ IDEA에서 프로젝트를 열었습니다. 나는 더 이상의 설정을하지 않았다. 이제는 @PostConstruct 메서드로 빈을 설정하려고합니다. 그러나이 메서드는 스프링에 의해 호출되지 않습니다.

다음은 제 수업입니다.

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 () - Method가 호출되지 않습니다.

내가 뭘 잘못하고 있죠? 어떤 도움을 주셔서 감사합니다.

업데이트 1 내 application.properties에서 다음을 구성했습니다.

logging.level.com = DEBUG

이것을 logging.level.root = DEBUG로 변경하면 대용량 로그가 생성됩니다. 그러나, 그것은 여전히 ​​내 init () 메소드의 디버그 메시지를 포함하지 않습니다.

업데이트 2 패키지 및 가져 오기 문을 추가했습니다.

업데이트 3 이것이 로깅 문제가 아니라는 것을 명확하게하기 위해 init () 메소드에 의해 변경되어야하는 코드에 새로운 int를 추가했습니다. @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)

해결법

  1. ==============================

    1.주석 클래스가 클래스 경로에 없기 때문에 Java9의 새로운 모듈 시스템으로 인해 SpringBoot-1.5.9는 @PostConstruct를 처리하지 못합니다. 문제 (또는 유사)는 여기와 여기에 설명되어 있습니다. 문제를 해결할 수있는 몇 가지 방법이 있습니다.

    주석 클래스가 클래스 경로에 없기 때문에 Java9의 새로운 모듈 시스템으로 인해 SpringBoot-1.5.9는 @PostConstruct를 처리하지 못합니다. 문제 (또는 유사)는 여기와 여기에 설명되어 있습니다. 문제를 해결할 수있는 몇 가지 방법이 있습니다.

  2. ==============================

    2.나는이 문제가 이미 해결되었음을 알고 있지만,이 문제를봤을 때 나온 첫 번째 Stackoverflow 질문이므로 여기에 남겨 둘 것입니다.

    나는이 문제가 이미 해결되었음을 알고 있지만,이 문제를봤을 때 나온 첫 번째 Stackoverflow 질문이므로 여기에 남겨 둘 것입니다.

    나는 동일한 문제가 있었고 나의 오류는 필자의 패키지 이름에 오타가 있다는 것이었다. name을 호출하는 클래스는 SpringBootApplication 클래스와 다른 패키지 이름을가집니다. 그래서 내 주요 응용 프로그램은 내 구성 요소를 찾지 못했습니다.

    따라서 비슷한 문제가있는 경우 항상 패키지 이름을 확인하십시오.

  3. ==============================

    3.너는 뭔가 정의하지 않은 것 같아.

    너는 뭔가 정의하지 않은 것 같아.

    logging.level.root=debug
    

    귀하의 application.properties에?

    없음 = 로그 없음

    함께 =

    2018-01-22 12:34:06.117 DEBUG 8516 --- [main] com.example.demo.TestBean  : Constructor of TestBean called. 
    ...
    2018-01-22 12:34:06.117 DEBUG 8516 --- [main] com.example.demo.TestBean : init()-Method of TestBean called. 
    ...
    2018-01-22 12:34:06.241 DEBUG 8516 --- [main]  com.example.demo.TestBean : Test Method of TestBean called.
    
  4. from https://stackoverflow.com/questions/48380553/spring-boot-postconstruct-not-called-on-component by cc-by-sa and MIT license