자바 스프링 어노테이션 @PostConstruct 실용 설명

머리말

        최근 연구에서 매우 실용적인 주석인 @PostConstruct를 발견했습니다. 배움과 이해를 통해 원래 복잡한 많은 문제를 더 쉽게 해결하는 데 도움이 될 수 있다는 것을 점차 발견했습니다.

        아래에서는 @PreDestroy를 기본적으로 사용하지 않기 때문에 공간 낭비가 없기 때문에 @PostConstruct 어노테이션의 기능을 예제와 함께 소개한다.


텍스트

1. 적용 시나리오

        @PostConstruct는 Java5에 도입된 주석으로, Servlet 수명 주기에 따라 작동하고 Bean 초기화 전에 사용자 정의 작업을 구현합니다. 프로젝트에서 @PostConstruct 주석은 주로 데이터 사전, 읽기 속성 구성 파일 등과 같은 서블릿 초기화 전에 일부 캐시된 데이터를 로드하는 것입니다.

        일반적으로 @PostConstruct 주석은 초기화를 수행하기 위해 종속성 주입이 완료된 후 실행해야 하는 메서드에 사용됩니다. @PostConstruct에 의해 수정된 메서드는 서버가 Servle을 로드할 때 실행되며 서버에서 한 번만 실행됩니다.

       @PostConstruct의 용도와 특성을 요약합니다.

  • 하나의 비정적 메서드만 이 주석을 사용할 수 있습니다.
  • 주석이 달린 메서드에는 매개변수가 없어야 합니다.
  • 주석이 달린 메서드의 반환 값은 무효여야 합니다.
  • 주석이 있는 메서드는 확인된 예외를 throw하면 안 됩니다.
  • 이 메서드는 한 번만 실행됩니다.

2. 집행명령

        종종 프로젝트 시작 시 메서드를 로드해야 할 때 @Component와 @PostConstruct의 조합을 사용하여 메서드의 초기화 작업을 완료할 수 있으며 @PostConstruct 주석이 달린 메서드는 종속성 주입이 완료된 후 자동으로 호출됩니다. .

        전체 Bean 초기화에서 주석이 실행되는 순서: @Constructor(구성 방법) -> @Autowired(의존성 주입) -> @PostConstruct(주석이 있는 방법).

3. 주의사항

        이 주석을 사용하면 서비스 시작 시간에 영향을 미칩니다. 서비스가 시작되면 WEB-INF/classes의 모든 파일과 WEB-INF/lib의 모든 jar 패키지를 검색합니다.

4. 사례 분석

        위에서 언급했듯이 @PostConstruct는 데이터 사전 워밍업, 속성 구성 파일 읽기와 같은 서블릿 초기화 전에 일부 캐시된 데이터를 로드할 수 있으며 케이스는 다음 두 시나리오를 시뮬레이트합니다.

4.1 데이터 예열

        Redis를 이용한 데이터 예열은 프로젝트 시작 후 캐시 생성을 위한 첫 번째 호출이 필요하며,  @PostConstruct 주석을 사용하면 Redis보다 빠른 Bean 초기화 단계에서 데이터 예열을 완료할 수 있습니다.

  • @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);
    }
}
  • 비즈니스 서비스 데모
@Slf4j
@Service
public class BusinessServiceImpl implements BusinessService {

    /**
     * 模拟从数据库查询数据的操作
     */
    public String demo5() {
        log.info("〓〓〓〓〓〓〓〓〓〓 demo5:执行!!");
        return "mysql data";
    }
}
  • 실행 효과: 보시다시피 종속성 주입 후 프로젝트 시작 전에 데이터가 로드됩니다.

4.2 구성 파일 로드

        @Value 주석에 의해 수정된 상수는 정적일 수 없습니다. 그렇지 않으면 정적이 @Value보다 먼저 로드되기 때문에 null이 됩니다. 정적이 아닌 경우 사용할 때마다 .properties 파일을 로드해야 하므로 상수 클래스를 설정하려는 원래 의도에 위배됩니다.

        이제 @PostConstruct 주석은 @PostConstruct의 로딩이 정적 이후이고 null 상황이 없기 때문에 기대치를 충족하는 데 도움이 될 수 있습니다.

  • @Value는 데이터를 가져온 다음 @PostConstruct를 통해 정적 상수에 값을 할당합니다.
@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";
    }
}
  • 결과 표시: 로드 프로세스는 프로젝트가 성공적으로 시작되기 전입니다.


요약하다

  1. @PostConstruct 주석은 서비스 시작 시간에 영향을 미치며 서비스가 시작되면 WEB-INF/classes의 모든 파일과 WEB-INF/lib의 모든 jar 패키지를 스캔합니다.
  2. @PostConstruct는 Servlet 초기화 전에 일부 캐시된 데이터를 로드할 수 있습니다 . 예: 데이터 사전 워밍업, 속성 구성 파일 읽기;

Supongo que te gusta

Origin blog.csdn.net/weixin_44259720/article/details/130385797
Recomendado
Clasificación