Spring Boot 자동 설정 원리, 실전

8168 단어 SpringSpringBoot
Spring Boot 자동 설정 원리, 실전
Spring Boot 자동 설정 원리
Spring Boot 의 자동 설정 설명 은 @ EnableAutoConfiguration 입 니 다. 위의 @ Import 클래스 에서 자동 으로 설 정 된 맵 을 찾 을 수 있 습 니 다.
    org.springframework.core.io.support.SpringFactoriesLoader.loadFactoryNames(Class>, ClassLoader)
    public static List loadFactoryNames(Class> factoryClass, ClassLoader classLoader) {

        String factoryClassName = factoryClass.getName();

        try {

            Enumeration urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :

                    lassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));

            List result = new ArrayList();

            while (urls.hasMoreElements()) {

                URL url = urls.nextElement();

                Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));

                String factoryClassNames = properties.getProperty(factoryClassName);

                result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));

            }

            return result;

        }

        catch (IOException ex) {

            throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +

                    "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);

        }

    }

이 방법 은 클래스 경로 와 모든 jar 패키지 에 META - INF / spring. factories 설정 에 비 친 자동 설정 클래스 를 불 러 옵 니 다.
    /**

     * The location to look for factories.

     * 

Can be present in multiple JAR files. */ public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";


 
Spring Boot 가 가지 고 있 는 자동 설정 패 키 지 를 보십시오: spring - boot - autoconfigure - 1.5.6. RELEASE. jar. 이 패 키 지 를 열 면 자동 으로 설 정 된 맵 을 찾 을 수 있 습 니 다.
    # Auto Configure

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

    org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\

    org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\

    org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\

    org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\

    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\

    org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\

    org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\

    ...

데이터 원본 자동 설정 의 실현 주 해 를 다시 보 겠 습 니 다.
    @Configuration

    @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })

    @EnableConfigurationProperties(DataSourceProperties.class)

    @Import({ Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class })

    public class DataSourceAutoConfiguration {

    ...

@ Configuration, @ ConditionalOnClass 는 자동 설정 의 핵심 입 니 다. 우선 설정 파일 이 어야 합 니 다. 그 다음 에 클래스 경로 에 따라 이 클래스 가 자동 으로 설정 되 는 지 여부 입 니 다.
실전 자동 배치
그래서 자동 설정 의 원 리 를 알 게 되 었 고 스스로 자동 설정 을 실현 하 는 것 은 간단 하 다.
설정 클래스 추가:
    import org.slf4j.Logger;

    import org.springframework.context.EnvironmentAware;

    import org.springframework.core.env.Environment;

    import com.oceanpayment.common.utils.logger.LoggerUtils;

    public class EnvConfig implements EnvironmentAware {

        private final Logger logger = LoggerUtils.getLogger(this);

        private Environment env;

        public String getStringValue(String key) {

            return env.getProperty(key);

        }

        public Long getLongValue(String key) {

            String value = getStringValue(key);

            try {

                return Long.parseLong(value);

            } catch (Exception e) {

                logger.error("     Long  :{} = {}", key, value);

            }

            return 0L;

        }

        public int getIntValue(String key) {

            return getLongValue(key).intValue();

        }

        @Override

        public void setEnvironment(Environment environment) {

            this.env = environment;

        }

    }

자동 설정 클래스 추가:
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;

    import org.springframework.context.annotation.Bean;

    import org.springframework.context.annotation.Configuration;

    import org.springframework.core.env.PropertyResolver;

    @Configuration

    @ConditionalOnClass(PropertyResolver.class)

    public class EnvAutoConfig {

        @Bean

        public EnvConfig envConfig() {

            return new EnvConfig();

        }

    }

META - INF / spring. factories 파일 을 만 들 고 자동 설정 맵 을 추가 합 니 다.
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\

    com.oceanpayment.common.config.env.EnvAutoConfig

이 정도 면 됐어.
자동 설정 보고서 보기
자신 이 추가 한 자동 설정 클래스 가 불 러 왔 는 지, 아니면 모든 자동 설정 이 활성화 되 었 는 지, 활성화 되 지 않 은 것 은 다음 과 같은 몇 가지 시험 을 통 해 볼 수 있 습 니 다.
  • spring - boot: run 이 실행 하 는 대화 상자 Enviroment 에 debug = true 변 수 를 추가 합 니 다. 
  • java -jar xx.jar --debug
  • main 방법 으로 실행 되 며, VM Argumanets 에 - Debug
  • 를 추가 합 니 다.
  • application 파일 에 debug = true
  • 를 직접 추가 합 니 다.
  • spring - boot - starter - actuator 모니터링 을 통합 하면 autoconfig 터미널 을 통 해 도 볼 수 있 습 니 다.

  • 시작 하면 콘 솔 에서 다음 과 같은 자동 설정 보고 정 보 를 볼 수 있 습 니 다.
        =========================
    
        AUTO-CONFIGURATION REPORT
    
        =========================
    
        Positive matches:
    
        -----------------
    
           AopAutoConfiguration matched:
    
              - @ConditionalOnClass found required classes 'org.springframework.context.annotation.EnableAspectJAutoProxy', 'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
    
              - @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)
    
           ...
    
           EnvAutoConfig matched:
    
              - @ConditionalOnClass found required class 'org.springframework.core.env.PropertyResolver'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
    
           ErrorMvcAutoConfiguration matched:
    
              - @ConditionalOnClass found required classes 'javax.servlet.Servlet', 'org.springframework.web.servlet.DispatcherServlet'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
    
              - @ConditionalOnWebApplication (required) found StandardServletEnvironment (OnWebApplicationCondition)
    
           ErrorMvcAutoConfiguration#basicErrorController matched:
    
              - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.ErrorController; SearchStrategy: current) did not find any beans (OnBeanCondition)
    
           ...
    
        Negative matches:
    
        -----------------
    
           ActiveMQAutoConfiguration:
    
              Did not match:
    
                 - @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)
    
           AopAutoConfiguration.JdkDynamicAutoProxyConfiguration:
    
              Did not match:
    
                 - @ConditionalOnProperty (spring.aop.proxy-target-class=false) found different value in property 'proxy-target-class' (OnPropertyCondition)
    
           ArtemisAutoConfiguration:
    
              Did not match:
    
                 - @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 'org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory' (OnClassCondition)
    
           BatchAutoConfiguration:
    
              Did not match:
    
                 - @ConditionalOnClass did not find required class 'org.springframework.batch.core.launch.JobLauncher' (OnClassCondition)
    
           ...

    Positive matches: 사용 한 자동 설정
    Negative matches: 사용 하지 않 은 자동 설정
    보고서 에서 자신 이 추가 한 EnvAutoConfig 가 자동 으로 설정 되 어 있 음 을 보 았 습 니 다.

    좋은 웹페이지 즐겨찾기