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 방법 을 집행 한다
  • postprocessBeanFactory(Configurable Listable BeanFactory beanFactory)방법 이 좋 습 니 다.beanFactory 에 게 주 었 습 니 다.뿐만 아니 라 이 방법 이전에 모든 빈 대상 이 주입 되 었 기 때문에 이전에 당신 의 대상 이 주입 되 지 않 았 다 면 여기에서 빈 팩 트 로 이 를 통 해 대상 을 얻 은 후에 대상 을 다시 주입 할 수 있 습 니 다
  • 在这里插入图片描述  
    소각 순서
    在这里插入图片描述  
    3@Dependon 과@Order
  • @Dependon 과@Order 는 공동으로 Bean 대상 의 주입 순 서 를 결정 합 니 다
  • A 대상@Dependon B 대상 의 경우 A 대상 과 B 대상 의@Order 값 이 무엇 이 든@Dependon 라벨 을 위주 로 합 니 다
  • 예 를 들 어 A 대상@Dependon("b"),@Order(1),B 대상@Order(15)는 B 대상 이 A 대상 보다 먼저 spring 용기 에 주입 된다
  • 4 BeanFactory PostProcessor 를 이용 하여 초기 화
    4.1 일반 초기 화
  • 위의 실험 에 따 르 면 우 리 는 BeanFactory PostProcessor 인 터 페 이 스 를 실현 한 후에 void post ProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)를 다시 쓰 는 것 을 알 고 있다
  • 4.567917.이 방법 이 실 행 될 때 모든 bean 대상 은 spring 용기 에 주입 되 었 습 니 다.이 때 관찰자 모드 를 이용 하여 초기 화 할 대상 을 초기 화 할 수 있 습 니 다우선 Observer ForInit 인 터 페 이 스 를 써 야 합 니 다
    
    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 프레임 워 크 내부 에 변화 가 생기 면 우리 프로그램 내부 의 초기 순서 에 문제 가 생 길 수 있 습 니 다
  • TreeSet 을 설정 하고 정렬 정책 을 지정 합 니 다.인 터 페 이 스 를 옮 겨 다 닐 때 찾 은 대상 을 TreeSet 에 넣 고 정렬 한 다음 에 옮 겨 다 닌 다음 에 해당 하 는 동작 을 수행 합 니 다
  • 수 정 된 인터페이스
    
    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 를 바탕 으로 포 노 이만 구 조 를 실현 한다.
  • 다음은 소동 조작 을 설명 합 니 다
  • 4.567917.포 노 이만 구조:프로그램 과 데 이 터 를 각각 메모리 에 저장 합 니 다4.567917.이런 사상 을 바탕 으로 우 리 는 데 이 터 를 용기 에 저장 할 수 있 을 뿐만 아니 라 코드 도 springboot 용기 에 저장 할 수 있다
  • Bean 대상 을 만 들 고 Bean Factory PostProcessor 인 터 페 이 스 를 실현 합 니 다.이 방법 을 실행 할 때 대부분의 대상 은 spring 용기 에 불 러 왔 습 니 다.나중에 필요 한 곳 에서 spring 용기 에서 이 코드 를 추출 하여 실행 할 수 있 습 니 다
  • 
    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 순서 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기