Spring 이 시 작 될 때 초기 화 를 실현 하 는 방법 은 어떤 방법 이 있 습 니까?

8871 단어 Spring초기 화
1.Spring 이 시 작 될 때 초기 화 되 는 몇 가지 방식
정확히 말 하면 spring 용기 의 예화 가 완 료 된 후 몇 가지 초기 화 방식 입 니 다.왜 그 러 세 요?다음 보기 예시:

@Slf4j
@Component
public class InitBeanDemo {
    @Autowired
    private Environment env;

    public InitBeanDemo() {
        log.info("DefaultProfiles: {}", Arrays.asList(env.getDefaultProfiles()));
        log.info("ActiveProfiles: {}", Arrays.asList(env.getActiveProfiles()));
    }
예 를 들 어 bean 의 구조 방법 에서 초기 화 작업 을 하 는 것 입 니 다.예 를 들 어 로그 인쇄 만 하 는 것 이 비교적 간단 합 니 다.이상 이 풍부 하고 현실 이 뼈 있 습 니 다.잘못 보 고 했 습 니 다:Constructor threw exception;nested exception is java.lang.NullPointerException。
환경 이 초기 화 되 지 않 았 기 때문이다.
다음은 위의 예시 적 인 수 요 를 충족 시 킬 수 있 는 어떤 초기 화 방식 이 있 는 지 살 펴 보 자.
2.구조 방법 에서 초기 화
모든 초기 화 방식 에서 가장 먼저 실행 할 수 있 습 니 다.원 리 는 InitBeanDemo 가 실례 화 되 기 전에 Environment 를 실례 화 한 것 이다.

@Component
public class InitBeanDemo {

    private final Environment env;

    @Autowired
    public InitBeanDemo (Environment environment) {
        this.env = environment;
        log.info("Constructor DefaultProfiles: {}", Arrays.asList(env.getDefaultProfiles()));
        log.info("Constructor ActiveProfiles: {}", Arrays.asList(env.getActiveProfiles()));
    }
}
3.일반적인 3 가지 세트
일반적인 세 가지 세트:@PostConstruct,InitialingBean,initMethod.원 하신 다 면 세 가지 방식 을 같은 Bean 에서 동시에 사용 할 수 있 습 니 다.우선 순위@PostConstruct>InitializingBean>initMethod 를 실행 할 수 있 습 니 다.
@PostConstruct 주해
빈 에 스 캔 할 수 있 는 Public void xxx()방법 을 추가 하고@Post Construct 주 해 를 추가 합 니 다.방법 에 초기 화 할 논 리 를 작성 합 니 다.
같은 프로그램 에@PostConstruct 주석 이 여러 개 있 을 수 있 고 같은 Bean 에 도@PostConstruct 주석 이 여러 개 있 을 수 있 습 니 다.

@Slf4j
@Component
public class InitBeanDemo {
    @Autowired
    private Environment env;

    @PostConstruct
    public void init() {
        log.info("@PostConstruct DefaultProfiles: {}", Arrays.asList(env.getDefaultProfiles()));
        log.info("@PostConstruct ActiveProfiles: {}", Arrays.asList(env.getActiveProfiles()));
    }
InitialingBean 인터페이스 구현
InitializingBean 인 터 페 이 스 를 실현 하고 after PropertiesSet()방법 에서 초기 화 할 논 리 를 작성 합 니 다.
같은 프로그램 에 서 는 InitialingBean 인 터 페 이 스 를 실현 하 는 클래스 가 여러 개 있 으 며,실행 할 때 기 회 는 클래스 이름 의 자연 순서에 따라 정렬 할 수 있 습 니 다.

@Slf4j
@Component
public class InitBeanDemo implements InitializingBean {
    @Autowired
    private Environment env;

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("InitializingBean DefaultProfiles: {}", Arrays.asList(env.getDefaultProfiles()));
        log.info("InitializingBean ActiveProfiles: {}", Arrays.asList(env.getActiveProfiles()));
    }
}
Bean 의 initMethod 방법 을 지정 합 니 다.
@Bean 주해 의 initMethod 속성 을 사용 하면 Bean 의 초기 화 후 실행 하 는 방법 에 사용 할 수 있 습 니 다.initMethod 는 Public void 의 무 참 구조 방법 이 어야 합 니 다.

@Slf4j
public class InitBeanDemo implements InitializingBean {
    @Autowired
    private Environment env;
    
	public void initMethod() {
        log.info("initMethod DefaultProfiles: {}", Arrays.asList(env.getDefaultProfiles()));
        log.info("initMethod ActiveProfiles: {}", Arrays.asList(env.getActiveProfiles()));
    }

@Configuration
public class InitBeanConfig {

    @Bean(initMethod="initMethod")
    public InitBeanDemo initBeanDemo () {
        return new InitBeanDemo();
    }

}
XML 설정 에 있 는 init-method 속성 과 같 습 니 다:

<bean id="initBeanDemo" class="com.xxx.InitBeanDemo" init-method="initMethod"></bean>
4.사용자 정의 ApplicationListener 감청
두 가지 방식,하 나 는 인 터 페 이 스 를 실현 하고 다른 하 나 는 주 해 를 사용한다.
ApplicationListener 인터페이스 구현
Context RefreshedEvent 사건 을 감청 합 니 다.

@Slf4j
@Component
public class InitBeanDemo implements ApplicationListener<ContextRefreshedEvent>{
    @Autowired
    private Environment env;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        log.info("ApplicationListener DefaultProfiles: {}", Arrays.asList(env.getDefaultProfiles()));
        log.info("ApplicationListener ActiveProfiles: {}", Arrays.asList(env.getActiveProfiles()));
    }
}
@EventListener 주석
방법 매개 변수 에 ContextRefreshedEvent 이 벤트 를 지정 합 니 다.

@Slf4j
@Component
public class InitBeanDemo {
    @Autowired
    private Environment env;

    @EventListener
    public void onApplicationEvent2(ContextRefreshedEvent event) {
        log.info("@EventListener DefaultProfiles: {}", Arrays.asList(env.getDefaultProfiles()));
        log.info("@EventListener ActiveProfiles: {}", Arrays.asList(env.getActiveProfiles()));
    }
}
5.Spring Boot 가 제공 하 는 초기 화 인터페이스
 응용 프로그램 러 너 인터페이스

@Slf4j
@Component
public class InitBeanDemo implements ApplicationRunner {
    @Autowired
    private Environment env;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.info("ApplicationRunner: {}", args);
        log.info("ApplicationRunner: {}", args.getOptionNames());
        log.info("ApplicationRunner DefaultProfiles: {}", Arrays.asList(env.getDefaultProfiles()));
        log.info("ApplicationRunner ActiveProfiles: {}", Arrays.asList(env.getActiveProfiles()));
    }
}
CommandLineRunner 인터페이스
같은 프로그램 컨 텍스트 에서 여러 개의 CommandLine Runner bean 을 정의 할 수 있 으 며,@Ordered 인터페이스 나@Order 주석 으로 정렬 할 수 있 습 니 다.

@Slf4j
@Component
public class InitBeanDemo implements CommandLineRunner {
    @Autowired
    private Environment env;

    @Override
    public void run(String... args) throws Exception {
        log.info("CommandLineRunner: {}", args);
        log.info("CommandLineRunner DefaultProfiles: {}", Arrays.asList(env.getDefaultProfiles()));
        log.info("CommandLineRunner ActiveProfiles: {}", Arrays.asList(env.getActiveProfiles()));
    }
}
같은 Bean 에서 위 와 같은 초기 화 방식 을 사용 한 우선 순위
같은 Bean 에서 위 와 같은 초기 화 방식 을 사용 하여 실행 중인 로그 세 션:
2021-06-07 11:24:41|INFO |main|c.c.s.s.t.ConstructorInitDemo|Constructor DefaultProfiles: [default]
2021-06-07 11:24:41|INFO |main|c.c.s.s.t.ConstructorInitDemo|Constructor ActiveProfiles: [sit]
2021-06-07 11:24:42|INFO |main|c.c.s.s.test.InitBeanDemo|@PostConstruct DefaultProfiles: [default]
2021-06-07 11:24:42|INFO |main|c.c.s.s.test.InitBeanDemo|@PostConstruct ActiveProfiles: [sit]
2021-06-07 11:24:42|INFO |main|c.c.s.s.test.InitBeanDemo|InitializingBean DefaultProfiles: [default]
2021-06-07 11:24:42|INFO |main|c.c.s.s.test.InitBeanDemo|InitializingBean ActiveProfiles: [sit]
2021-06-07 11:24:42|INFO |main|c.c.s.s.test.InitBeanDemo|initMethod DefaultProfiles: [default]
2021-06-07 11:24:42|INFO |main|c.c.s.s.test.InitBeanDemo|initMethod ActiveProfiles: [sit]
2021-06-07 11:24:44|INFO |main|c.c.s.s.test.InitBeanDemo|@EventListener DefaultProfiles: [default]
2021-06-07 11:24:44|INFO |main|c.c.s.s.test.InitBeanDemo|@EventListener ActiveProfiles: [sit]
2021-06-07 11:24:44|INFO |main|c.c.s.s.test.InitBeanDemo|ApplicationListener DefaultProfiles: [default]
2021-06-07 11:24:44|INFO |main|c.c.s.s.test.InitBeanDemo|ApplicationListener ActiveProfiles: [sit]
2021-06-07 11:24:44|INFO |main|c.c.s.s.test.InitBeanDemo|ApplicationRunner: org.springframework.boot.DefaultApplicationArguments@68bef3df
2021-06-07 11:24:44|INFO |main|c.c.s.s.test.InitBeanDemo|ApplicationRunner: []
2021-06-07 11:24:44|INFO |main|c.c.s.s.test.InitBeanDemo|ApplicationRunner DefaultProfiles: [default]
2021-06-07 11:24:44|INFO |main|c.c.s.s.test.InitBeanDemo|ApplicationRunner ActiveProfiles: [sit]
2021-06-07 11:24:44|INFO |main|c.c.s.s.test.InitBeanDemo|CommandLineRunner: {}
2021-06-07 11:24:44|INFO |main|c.c.s.s.test.InitBeanDemo|CommandLineRunner DefaultProfiles: [default]
2021-06-07 11:24:44|INFO |main|c.c.s.s.test.InitBeanDemo|CommandLineRunner ActiveProfiles: [sit]
즉,전체 문장 정리 의 선착순 이다.
스프링 이 시 작 될 때 초기 화 하 는 방법 은 무엇 입 니까?의 글 은 여기까지 소개 합 니 다.더 많은 관련 Spring 초기 화 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기