最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot自動配置原理及案例源碼解析

 更新時間:2023年11月08日 10:52:34   作者:純真的蟠桃  
這篇文章主要為大家介紹了SpringBoot自動配置原理及自動配置案例源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、什么是SpringBoot自動配置

首先介紹一下什么是SpringBoot,SpringBoost是基于Spring框架開發(fā)出來的功能更強大的Java程序開發(fā)框架,其最主要的特點是:能使程序開發(fā)者快速搭建一套開發(fā)環(huán)境。SpringBoot 能將主流的開發(fā)框架(例如SpringMVC,Dubbo,Mybatis,Redis等),做到像Maven導入Jar包一樣的簡潔快速,做到開箱即用。其中最關(guān)鍵的技術(shù)就是 SpringBoot定制的各種Starter,通Maven引入Starter就能快速搭建開發(fā)環(huán)境。

二、SpringBoot Starter自動裝配案例

在以前單獨使用SpringMVC Web編程框架時,我們需要單獨配置DispatcherServlet和Tomcat,使用SpringBoot之后,我們只需要引入SpringBoot-Starter-Web就能直接開始編寫Controller等Web相關(guān)的代碼,這就是SpringBoot為們提供的開箱即用的便捷能力,下面就以SpringBoot-Starter-Web 來說明SpringBoot自動配置的關(guān)鍵原理
 

三、SpringBoot自動裝配案例源碼解析

3.1 DispatcherServlet的自動配置原理

首先我們定位到SpringBoot自動配置的Maven依賴

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
        <version>${spring-boot.version}</version>
</dependency>

在依賴的Jar包中我們可以在META-INF/spring.factories中找到自動配置類:

org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration.DispatcherServletConfiguration

下圖是這個配置類的主要源碼和解析:

下面將上圖中關(guān)鍵的注解功能,分別進行功能說明

3.1.1:@EnableConfigurationProperties ({WebMvcProperties.class}) 注解解析

這個注解表示使WebMvcProperties.class類上的@ConfigurationProperties這個注解生效,同時@ConfigurationProperties這個注解是將application.xml中以 spring.mvc開頭的配置參數(shù)自動注入到WebMvcProperties.class類的字段中

3.1.2:@Conditional ({DefaultDispatcherServletCondition.class} 注解解析

該注解的原理就是將滿足特定條件情況下的Bean自動加載到Spring容器中,該注解對應的Spring接口就是 rg.springframework.context.annotation.Condition這個接口

public interface Condition {
    boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}

3.1.3:@ConditionOnClass注解解析

@ConditionOnClass這個注解是在當程序代碼環(huán)境classpath下存在xxx.class的情況下條件成立,同時最終也會調(diào)用到matches方法中,其中關(guān)鍵的源碼如下:

protected static Class<?> resolve(String className, ClassLoader classLoader) throws ClassNotFoundException {
    return classLoader != null ? Class.forName(className, false, classLoader) : Class.forName(className);
}

從上面可以看到,代碼利用Class.forName方法加載classpath下的xxx.class類,如果加載成功條件就會成立。最后,在滿足了所有@ConditionOnal注解條件后,SpringBoot就會自動為我們在Spring容器中注入DispatcherServlet了,無需單獨配置了,直接引入pring-boot-starter-webr即可開始使用web相關(guān)功能。

3.1.4:小結(jié)

我們以DispatcherServlet是如何自動配置到容器中為例,探究了SpringBoot Starter的自動配置原理,其中涉及了幾個關(guān)鍵的注解和步驟:

第一步:涉及到了配置文件的讀取和個性化配置,這里就涉及到了下面這兩個注解

@ConfigurationProperties
@EnableConfigurationProperties

第二步:設(shè)計到了在什么條件下才自動配置的注解

@Conditional
@ConditionalOnClass

第三步:約定了自動配置類的加載路徑

/META-INF/spring-factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=自動配置類全路徑名稱

在我們了解到了SpringBoot自動配置的原理之后,我們就可以自定義一個SpringBoot Starter來快速搭建我們的開發(fā)環(huán)境了。

四、自定義一個打印輸入輸出日志的Starter

4.1 首先定義一個標記需要打印出入?yún)⑷罩镜淖⒔釦PrintLog

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PrintLog {
}

4.2 定義一個存放打印日志配置的實體類

//自動注入application配置文件中已log.switch開頭的配置參數(shù)
@ConfigurationProperties("log.switch")
public class LogProperties {
    //是否啟用打印日志功能
    private Boolean enabled = false;
    //是否打印調(diào)用者ip
    private Boolean printIp = false;
    //是否打印調(diào)用者url
    private Boolean printUrl = false
}

4.3 定義一個@PrintLog注解的切面類

@Aspect
public class LogAspect {
    private static final Log LOGGER = LogFactory.getLog(LogAspect.class);
    private LogProperties logProperties;
    @Pointcut("@annotation(com.zl.annotation.PrintLog)")
    public void Log(){}
    @Around("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();
        //打印調(diào)用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);
        //打印參數(shù)
        LOGGER.info("parameter :" + Arrays.toString(joinPoint.getArgs()));
        Object result = joinPoint.proceed();
        //打印返回結(jié)果
        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切面中關(guān)鍵的切面方法類(@Before,@After等)
    //程序中有Advice.class類說明需要使用切面功能,這時才加載自定義的切面類
    @ConditionalOnClass(Advice.class)
    public LogAspect webLogAspect(LogProperties logProperties){
        return new LogAspect(logProperties);
    }
}

總結(jié)

SpringBoot自動配置功能帶給我們的是開箱即用,快速便捷的功能,自動配置為我們研發(fā)人員帶來的優(yōu)點,我主要總結(jié)為以下兩點:

  • 提高研發(fā)效率 。我們可以快速構(gòu)建開發(fā)環(huán)境,對于開發(fā)中使用到的開源組件和中間件,我們直接引入對應的Starter就可以直接開發(fā)了,例如Redis和Mybati等,可以直接引入對應的spring-boot-starter-data-redis就可以直接使用RedisTemplate來操作 Redis了,這樣可以極大的提高研發(fā)的效率,無需再進行復雜的起步配置了和各種版本依賴管理了。
  • 標準模塊復用。對于業(yè)務開發(fā)中的一些標準模塊,例如常用的一些三方服務,我們可以利用Starter直接配置好,在需要使用的項目中直接引入這個starter就可以立即使用了,無需再去引入Jar包和編寫配置文件等,同樣的,對于一些標準非業(yè)務強耦合的功能,例如監(jiān)控,鑒權(quán)等,也可以定義一個Starter,需要使用鑒權(quán)和監(jiān)控功能的項目就可以直接復用了,無需再次開發(fā)。

以上就是SpringBoot自動配置原理及案例源碼解析的詳細內(nèi)容,更多關(guān)于SpringBoot自動配置的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mybatis中的緩存機制解析

    Mybatis中的緩存機制解析

    這篇文章給大家介紹mybatis中的緩存機制,本文結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Java實現(xiàn)并查集示例詳解

    Java實現(xiàn)并查集示例詳解

    這篇文章主要通過一個題目示例為大家詳細介紹Java如何實現(xiàn)并查集,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • java生成excel報表文件示例

    java生成excel報表文件示例

    本篇文章主要介紹了java生成excel報表文件示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • 一篇文章帶你了解java接口與繼承

    一篇文章帶你了解java接口與繼承

    這篇文章主要介紹了Java接口和繼承操作,結(jié)合具體實例形式分析了Java接口和繼承與使用的相關(guān)原理、操作技巧與注意事項,需要的朋友可以參考下
    2021-08-08
  • java基于QuartzJobBean實現(xiàn)定時功能的示例代碼

    java基于QuartzJobBean實現(xiàn)定時功能的示例代碼

    QuartzJobBean是Quartz框架中的一個抽象類,用于定義和實現(xiàn)可由Quartz調(diào)度的作業(yè),本文主要介紹了java基于QuartzJobBean實現(xiàn)定時功能的示例代碼,具有一定的參考價值,感興趣可以了解一下
    2023-09-09
  • Spring創(chuàng)建IOC容器的方式解析

    Spring創(chuàng)建IOC容器的方式解析

    這篇文章主要介紹了Spring創(chuàng)建IOC容器的方式解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • java多態(tài)注意項小結(jié)

    java多態(tài)注意項小結(jié)

    面向?qū)ο蟮娜筇匦裕悍庋b、繼承、多態(tài)。從一定角度來看,封裝和繼承幾乎都是為多態(tài)而準備的。今天通過本文給大家介紹java多態(tài)注意項總結(jié),感興趣的朋友一起看看吧
    2021-10-10
  • java 鍵盤輸入一個數(shù),輸出數(shù)組中指定元素的示例

    java 鍵盤輸入一個數(shù),輸出數(shù)組中指定元素的示例

    今天小編就為大家分享一篇java 鍵盤輸入一個數(shù),輸出數(shù)組中指定元素的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • SpringBoot整合Lombok及常見問題解決

    SpringBoot整合Lombok及常見問題解決

    本文主要介紹了SpringBoot整合Lombok及常見問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • 深入淺析drools中Fact的equality?modes

    深入淺析drools中Fact的equality?modes

    這篇文章主要介紹了drools中Fact的equality?modes的相關(guān)知識,本文通過圖文實例代碼相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論

宾川县| 婺源县| 隆尧县| 铜山县| 樟树市| 永昌县| 龙川县| 醴陵市| 南丰县| 乌拉特前旗| 手游| 米泉市| 濮阳市| 班玛县| 大邑县| 河间市| 营口市| 雷波县| 嘉黎县| 临猗县| 湖州市| 绩溪县| 光泽县| 绥化市| 五常市| 定襄县| 玛曲县| 巴林左旗| 东乡县| 望都县| 涿州市| 新龙县| 施甸县| 大余县| 宜川县| 瑞金市| 乌鲁木齐县| 饶河县| 安仁县| 进贤县| 汉川市|