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 초기 화 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.