Spring Boot 자동 설정 원리, 실전
8168 단어 SpringSpringBoot
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
이 정도 면 됐어.
자동 설정 보고서 보기
자신 이 추가 한 자동 설정 클래스 가 불 러 왔 는 지, 아니면 모든 자동 설정 이 활성화 되 었 는 지, 활성화 되 지 않 은 것 은 다음 과 같은 몇 가지 시험 을 통 해 볼 수 있 습 니 다.
시작 하면 콘 솔 에서 다음 과 같은 자동 설정 보고 정 보 를 볼 수 있 습 니 다.
=========================
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 가 자동 으로 설정 되 어 있 음 을 보 았 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.