SpringBoot自動配置原理解析
來源:京東雲開發者
3.1 DispatcherServlet的自動配置原理
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>${spring-boot.version}</version> </dependency>
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration在這個類中存在有一個靜態內部類:
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration.DispatcherServletConfiguration
3.1.1:@EnableConfigurationProperties({WebMvcProperties.class})註解解析
3.1.2:@Conditional({DefaultDispatcherServletCondition.class}註解解析
public interface Condition { boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);}
3.1.3:@ConditionOnClass註解解析
protected static Class<?> resolve(String className, ClassLoader classLoader) throws ClassNotFoundException { return classLoader != null ? Class.forName(className, false, classLoader) : Class.forName(className);}
3.1.4:總結
@ConfigurationProperties@EnableConfigurationProperties
@Conditional@ConditionalOnClass
/META-INF/spring-factoriesorg.springframework.boot.autoconfigure.EnableAutoConfiguration=自動配置類全路徑名稱
4.1 首先定義一個標記需要列印出入參日誌的註解@PrintLog
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface PrintLog {}
4.2 定義一個存放列印日誌配置的實體類
//自動注入application配置檔案中已log.switch開頭的配置引數@ConfigurationProperties("log.switch")public class LogProperties { //是否啟用列印日誌功能 private Boolean enabled = false; //是否列印呼叫者ip private Boolean printIp = false; //是否列印呼叫者url private Boolean printUrl = false}
4.3 定義一個@PrintLog註解的切面類
public class LogAspect {
private static final Log LOGGER = LogFactory.getLog(LogAspect.class);
private LogProperties logProperties;
"@annotation(com.zl.annotation.PrintLog)") (
public void Log(){}
"Log()") (
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
String methodName = method.getName();
//列印呼叫url
if (Boolean.TRUE.equals(logProperties.getPrintUrl())){
LOGGER.info("URL:" + request.getRequestURL().toString());
}
//列印ip
if (Boolean.TRUE.equals(logProperties.getPrintIp())) {
LOGGER.info("IP :" + request.getRemoteAddr());
}
//列印方法
LOGGER.info("method :" + methodName);
//列印引數
LOGGER.info("parameter :" + Arrays.toString(joinPoint.getArgs()));
Object result = joinPoint.proceed();
//列印返回結果
LOGGER.info("return :" + JSON.toJSONString(result));
return result;
}
}
4.4 定義一個列印日誌的自動配置類
@Configuration@EnableConfigurationProperties({LogProperties.class})//表示在application配置檔案中必須配置log.switch.enabled = true才啟動自動配置@ConditionalOnProperty(prefix = "log.switch", value = "enabled", havingValue = "true")public class LogAutoConfigure { @Bean //Advice.class是aop切面中關鍵的切面方法類(@Before,@After等) //程式中有Advice.class類說明需要使用切面功能,這時才載入自定義的切面類 @ConditionalOnClass(Advice.class) public LogAspect webLogAspect(LogProperties logProperties){ return new LogAspect(logProperties); }}
4.5 配置自定義配置類的載入路徑
META-INF/spring.factoriesorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.zl.autoConfigure.LogAutoConfigure
4.6 Maven打包部署
maven install
5.1 在專案中引入Starter
<dependency> <groupId>com.zl.demo</groupId> <artifactId>LogStarter</artifactId> <version>1.0-SNAPSHOT</version></dependency>
5.2 在application.yml中配置引數
log: switch: enabled: true //啟用列印日誌功能 printIp: true //列印請求ip printUrl: true //列印請求url
5.3 定義一個Controller並標上列印日誌的註解
@RestController@RequestMapping("/test")public class HelloWorldController { @PrintLog @RequestMapping("/hello") public String helleWorld(String test){ return "hello world!"; }}
5.4 啟動專案開始測試
com.zl.aspect.LogAspect : URL:[test]com.zl.aspect.LogAspect : return :"hello world!"
提高研發效率。我們可以快速構建開發環境,對於開發中使用到的開源元件和中介軟體,我們直接引入對應的Starter就可以直接開發了,例如Redis和Mybatis等,可以直接引入對應的spring-boot-starter-data-redis就可以直接使用RedisTemplate來操作Redis了,這樣可以極大的提高研發的效率,無需再進行復雜的起步配置了和各種版本依賴管理了。 標準模組複用。對於業務開發中的一些標準模組,例如常用的一些三方服務,我們可以利用Starter直接配置好,在需要使用的專案中直接引入這個starter就可以立即使用了,無需再去引入Jar包和編寫配置檔案等,同樣的,對於一些標準非業務強耦合的功能,例如監控,鑑權等,也可以定義一個Starter,需要使用鑑權和監控功能的專案就可以直接複用了,無需再次開發。
-end-
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2992543/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SpringBoot | 自動配置原理Spring Boot
- SpringBoot自動配置原理Spring Boot
- springboot 自動配置原理Spring Boot
- springboot_自動配置原理Spring Boot
- SpringBoot的自動配置原理Spring Boot
- SpringBoot自動裝配原理解析Spring Boot
- springboot自動配置原理和啟動流程Spring Boot
- SpringBoot-04-自動配置原理再理解Spring Boot
- 圖解原始碼 | SpringBoot中自動配置原理圖解原始碼Spring Boot
- SpringBoot自動配置原理原始碼級別分析Spring Boot原始碼
- 笑死,面試官又問我SpringBoot自動配置原理面試Spring Boot
- SpringBoot 自動配置原理,翻原始碼看一下Spring Boot原始碼
- Springboot MVC 自動配置Spring BootMVC
- SpringBoot的自動配置Spring Boot
- SpringBoot(03)——自動配置Spring Boot
- SpringBoot(二)自動配置Spring Boot
- (第四講)Spring Boot 自動化配置原理解析Spring Boot
- springboot之啟動原理解析Spring Boot
- SpringBoot原始碼解析-Bean的載入與自動化配置Spring Boot原始碼Bean
- SpringBoot | 2.1 SpringBoot自動裝配原理Spring Boot
- springboot 自動配置案例分析Spring Boot
- SpringBoot自動裝配原理分析Spring Boot
- SpringBoot系列--自動裝配原理Spring Boot
- 這一次搞懂SpringBoot核心原理(自動配置、事件驅動、Condition)Spring Boot事件
- 好程式設計師Java培訓分享SpringBoot -自動配置原理程式設計師JavaSpring Boot
- 這樣講 SpringBoot 自動配置原理,你應該能明白了吧Spring Boot
- Spring Boot 自動配置原理Spring Boot
- SpringBoot入門(四)——自動配置Spring Boot
- SpringBoot系列--自動裝配原理2Spring Boot
- SpringBoot 自動裝配的原理分析Spring Boot
- SpringBoot配置檔案及自動配置原理詳解,這應該是SpringBoot最大的優勢了吧Spring Boot
- SpringBoot原理深入及原始碼剖析(一) 依賴管理及自動配置Spring Boot原始碼
- 案例解析:springboot自動配置未生效問題定位(條件斷點)Spring Boot斷點
- Spring Boot核心原理-自動配置Spring Boot
- [spring-rabbit]自動配置原理Spring
- PHP 自動載入功能原理解析PHP
- 小BUG大原理:重寫WebMvcConfigurationSupport後SpringBoot自動配置失效WebMVCSpring Boot
- SpringBoot | 4.1 SpringMVC的自動配置Spring BootSpringMVC