springboot2.x 운행 순서 및 Bean 대상 주입 순서 문제 해결
26534 단어 springboot주입Bean
지정 한 인 터 페 이 스 를 통 해 지정 한 방법 을 다시 쓰 면 Bean 에 대응 하 는 라 이 프 사이클 방법 에서 해당 하 는 프로그램 을 실행 할 수 있 습 니 다.
2 테스트
4.567917.본 고 는 몇 개의 Bean 대상 을 분석 하여 우선 순위(@Order 를 통 해)를 설정 한 다음 에 디 버 깅 을 중단 하고 각종 생명 주기 방법의 운행 순 서 를 테스트 할 것 이다4.567917.프로젝트 에서 가장 골 치 아 픈 것 은 bean 대상 이 주입 되 지 않 는 문제 이다.본 고 를 통 해 이 문 제 를 잘 해결 할 수 있다이 프로그램 이 사용 하 는 의존 도 를 먼저 봅 시다.
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wu</groupId>
<artifactId>smartport</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>smartport</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</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>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.1 Order = 1
package com.wu.smartport.controller;
import com.wu.smartport.test.User;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Component
@Order(1)
public class TestController implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, BeanDefinitionRegistryPostProcessor, InitializingBean, DisposableBean {
@Autowired
private User user;
/**
* , BeanNameAware
*
* @param name
*/
@Override
public void setBeanName(String name) {
// testController, Spring
System.out.println("setBeanName:" + name);
}
/**
* 2 , BeanFactoryAware
* beanFactory Bean ,
*
* @param beanFactory
* @throws BeansException
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
}
/**
* 3 , ApplicationContextAware
* applicationContext, 、 、 bean
*
* @param applicationContext
* @throws BeansException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
//
AutowireCapableBeanFactory beanFactory = applicationContext.getAutowireCapableBeanFactory();
}
/**
* 4 , InitializingBean
*
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
}
/**
* 5 , BeanDefinitionRegistryPostProcessor
* ,
* @param registry
* @throws BeansException
*/
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
}
/**
* 6 , BeanFactoryPostProcessor , BeanDefinitionRegistryPostProcessor 。
* Bean , , 。
* @param beanFactory
* @throws BeansException
*/
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
Object user = beanFactory.getBean("user");
}
/**
* 7 , , BeanPostProcessor
* ,
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return null;
}
/**
* 8 , , BeanPostProcessor
* ,
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return null;
}
/**
* , DisposableBean
* @throws Exception
*/
@Override
public void destroy() throws Exception {
}
}
2.2 Order = 15
package com.wu.smartport.test;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
/**
* @Author :
* @Date :2021-01-05 8:40
* @Version :1.0
*/
@Service
@Order(15)
public class User implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, BeanDefinitionRegistryPostProcessor, InitializingBean, DisposableBean {
@Value(" ")
private String name;
@Value("12")
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
/**
* , BeanNameAware
*
* @param name
*/
@Override
public void setBeanName(String name) {
System.out.println("setBeanName:" + name);
}
/**
* 2 , BeanFactoryAware
* beanFactory Bean ,
*
* @param beanFactory
* @throws BeansException
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
}
/**
* 3 , ApplicationContextAware
* applicationContext, 、 、 bean
*
* @param applicationContext
* @throws BeansException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
}
/**
* 4 , InitializingBean
*
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
}
/**
* 5 , BeanDefinitionRegistryPostProcessor
* ,
* @param registry
* @throws BeansException
*/
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
}
/**
* 6 , BeanFactoryPostProcessor , BeanDefinitionRegistryPostProcessor 。
* Bean , , 。
* @param beanFactory
* @throws BeansException
*/
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
Object user = beanFactory.getBean("user");
}
/**
* 7 , , BeanPostProcessor
* ,
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return null;
}
/**
* 8 , , BeanPostProcessor
* ,
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return null;
}
/**
* , DisposableBean
* @throws Exception
*/
@Override
public void destroy() throws Exception {
}
}
2.3 Order = 30
package com.wu.smartport.test;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* @Author :
* @Date :2021-01-05 9:48
* @Version :1.0
*/
@Order(30)
@Component
public class User2 implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, BeanDefinitionRegistryPostProcessor, InitializingBean, DisposableBean {
@Value(" ")
private String name;
@Value("12")
private int age;
public User2() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
/**
* , BeanNameAware
*
* @param name
*/
@Override
public void setBeanName(String name) {
System.out.println("setBeanName:" + name);
}
/**
* 2 , BeanFactoryAware
* beanFactory Bean ,
*
* @param beanFactory
* @throws BeansException
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
}
/**
* 3 , ApplicationContextAware
* applicationContext, 、 、 bean
*
* @param applicationContext
* @throws BeansException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
}
/**
* 4 , InitializingBean
*
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
}
/**
* 5 , BeanDefinitionRegistryPostProcessor
* ,
* @param registry
* @throws BeansException
*/
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
}
/**
* 6 , BeanFactoryPostProcessor , BeanDefinitionRegistryPostProcessor 。
* Bean , , 。
* @param beanFactory
* @throws BeansException
*/
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
Object user = beanFactory.getBean("user");
}
/**
* 7 , , BeanPostProcessor
* ,
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return null;
}
/**
* 8 , , BeanPostProcessor
* ,
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return null;
}
/**
* , DisposableBean
* @throws Exception
*/
@Override
public void destroy() throws Exception {
}
}
2.4 실험 결과다음 그림 에서 보 듯 이TestController 의 Order=1,최고 우선 순위사용자 의 Order=15,중간 우선 순위User 2 의 Order=30,낮은 우선 순위4.567917.앞의 네 가지 방법 은 우선 순위 의 순서에 따라 선후 로 집행 한 다음 에 우선 순위 순서에 따라 post ProcessBean Definition Registry 방법 을 집행 한 다음 에 우선 순위 순서에 따라 post ProcessBean Factory 방법 을 집행 한다
소각 순서
3@Dependon 과@Order
4.1 일반 초기 화
package com.wu.smartport.controller;
/**
* ,
* @Author :
* @Date :2021-01-05 11:02
* @Version :1.0
*/
public interface ObserverForInit {
/**
*
*/
void observerInit();
}
초기 화 작업 이 필요 한 bean 대상 이 이 인 터 페 이 스 를 실현 하도록 합 니 다.
package com.wu.smartport.test;
import com.wu.smartport.controller.ObserverForInit;
import org.springframework.stereotype.Component;
/**
* @Author :
* @Date :2021-01-05 11:11
* @Version :1.0
*/
@Component
public class User implements ObserverForInit {
@Override
public void observerInit() {
System.out.println(" !");
}
}
그 다음 에 bean 초기 화 를 관리 하 는 클래스 를 작성 하여 모든 Bean 대상 을 옮 겨 다 니 며 지정 한 인터페이스 나 사용자 정의 주 해 를 조회 하고 해당 하 는 작업 을 수행 합 니 다(예 를 들 어 초기 화 작업).
package com.wu.smartport.manager;
import com.wu.smartport.controller.ObserverForInit;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
import java.util.Iterator;
/**
* @Author :
* @Date :2021-01-05 11:06
* @Version :1.0
*/
@Component
public class ControllerInitManager implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
Iterator<String> its = beanFactory.getBeanNamesIterator();
while (its.hasNext()) {
String beanName = its.next();
try {
Object bean = beanFactory.getBean(beanName);
analysisObject(bean);
} catch (BeanCreationException e) {
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* bean
*
* @param bean
*/
private void analysisObject(Object bean) {
analysisInterface(bean);
analysisAnnotation(bean);
}
/**
*
*
* @param bean
*/
private void analysisInterface(Object bean) {
Class<?> beanClass = bean.getClass();
// Interface Annotation
Class<?>[] interfaces = beanClass.getInterfaces();
// Class
for (Class infs : interfaces) {
if (infs.equals(ObserverForInit.class)) {
((ObserverForInit) bean).observerInit();
}
}
}
/**
*
*
* @param bean
*/
private void analysisAnnotation(Object bean) {
}
}
4.2 순서대로 초기 화4.567917.초기 화 순서 에 대한 요구 가 있 으 면 다음 과 같은 방법 을 취 할 수 있다.4.1 의 옮 겨 다 니 는 순서 에 대해 독자 들 은 스스로 연구 할 수 있 지만 스스로 순 서 를 쓰 는 것 을 권장 합 니 다.그렇지 않 으 면 springboot 프레임 워 크 내부 에 변화 가 생기 면 우리 프로그램 내부 의 초기 순서 에 문제 가 생 길 수 있 습 니 다
package com.wu.smartport.controller;
/**
* ,
* @Author :
* @Date :2021-01-05 11:02
* @Version :1.0
*/
public interface ObserverForInit {
/**
*
*/
void observerInit();
/**
* , ,
* @return
*/
int getInitOrder();
}
bean 개체
/**
* @Author :
* @Date :2021-01-04 22:51
* @Version :1.0
*/
@Component
public class PageManager implements ObserverForInit {
@Override
public void observerInit() {
System.out.println("PageManager ");
}
@Override
public int getInitOrder() {
return 1000;
}
}
초기 화 클래스 관리
package com.wu.smartport.manager;
import com.wu.smartport.controller.ObserverForInit;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
/**
* @Author :
* @Date :2021-01-05 11:06
* @Version :1.0
*/
@Component
public class ControllerInitManager implements BeanFactoryPostProcessor {
private TreeSet<ObserverForInit> inits = new TreeSet<>(Comparator.comparingInt(ObserverForInit::getInitOrder));
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
Iterator<String> its = beanFactory.getBeanNamesIterator();
while (its.hasNext()) {
String beanName = its.next();
try {
Object bean = beanFactory.getBean(beanName);
analysisObject(bean);
} catch (BeanCreationException e) {
} catch (Exception e) {
e.printStackTrace();
}
}
//
analysisByAfterIterator();
}
/**
* bean
*
* @param bean
*/
private void analysisObject(Object bean) {
analysisInterface(bean);
analysisAnnotation(bean);
}
/**
*
*/
private void analysisByAfterIterator() {
//
// ,order
for (ObserverForInit o : inits) {
o.observerInit();
}
}
/**
*
*
* @param bean
*/
private void analysisInterface(Object bean) {
Class<?> beanClass = bean.getClass();
// Interface Annotation
Class<?>[] interfaces = beanClass.getInterfaces();
// Class
for (Class infs : interfaces) {
if (infs.equals(ObserverForInit.class)) {
inits.add((ObserverForInit) bean);
}
}
}
/**
*
*
* @param bean
*/
private void analysisAnnotation(Object bean) {
}
}
5.Springboot 를 바탕 으로 포 노 이만 구 조 를 실현 한다.
package com.wu.smartport.test;
import com.wu.smartport.SmartportApplication;
import javafx.stage.Stage;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.function.Function;
import static com.wu.smartport.config.BeanInitOrder.INIT_METHODS;
import static com.wu.smartport.config.BeanInitOrder.STAGE_BEAN;
/**
* @Author :
* @Date :2021-01-05 19:27
* @Version :1.0
*/
public class Manager implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// javaFx
ArrayList<Function> arr;
try{
//
Object bean = beanFactory.getBean("function");
arr = (ArrayList<Function>)bean;
}catch (Exception e2){
//
arr = new ArrayList<>();
}
//
Function<Void,Void> f = aVoid -> {
//
return null;
};
arr.add(f);
// spring
DefaultListableBeanFactory factory = (DefaultListableBeanFactory)beanFactory;
factory.registerSingleton(INIT_METHODS,arr);
}
}
다음 에 반드시 실 행 될 코드,예 를 들 어 시작 클래스 를 실행 한 후에 지정 한 코드 세그먼트 를 실행 할 수 있 습 니 다.
package com.wu.smartport;
import javafx.application.Application;
import javafx.stage.Stage;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import java.util.ArrayList;
import java.util.function.Function;
import static com.wu.smartport.config.BeanInitOrder.INIT_METHODS;
import static com.wu.smartport.config.BeanInitOrder.STAGE_BEAN;
/**
*
* @author Wu_Sir
*/
@SpringBootApplication
public class SmartportApplication{
private static volatile ConfigurableApplicationContext run;
/**
*
*
* @param args
*/
public static void main(String[] args) {
run = SpringApplication.run(SmartportApplication.class, args);
//
try{
Object bean = beanFactory.getBean("function");
ArrayList<Function> arr = (ArrayList<Function>) bean;
for (int i = 0; i < arr.size(); i++) {
// , 。
Function f = arr.get(i);
f.apply(null);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
springboot 2.x 운영 순서 및 Bean 대상 의 주입 순서 에 관 한 문 제 를 해결 하 는 글 은 여기까지 입 니 다.더 많은 springboot 주입 Bean 순서 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.