springboot學(xué)習(xí)之配置文件注解說明解析

我們都知道springboot可以簡化Spring框架帶來的大量XML配置以及復(fù)雜的依賴管理,讓開發(fā)人員可以更加關(guān)注業(yè)務(wù)邏輯的開發(fā)腻要。

怎么簡化我們的xml配置

Spring Boot更多的是采用Java Config的方式享完,對Spring進行配置舞终。

我們不僅可以通過它提供的properties或者yaml來設(shè)置一些基礎(chǔ)的配置信息霞揉。如:server.port 等旬薯。還可以很輕松的實現(xiàn)多環(huán)境多配置文件的啟動,打包适秩。springboot學(xué)習(xí)之maven多環(huán)境打包的幾種方式

我們還可以自定義配置文件來做我們自己的業(yè)務(wù)邏輯绊序。如:配置系統(tǒng)常量硕舆,第三方數(shù)據(jù)管理等等。

我們自己很多時候會寫一些自定義的配置文件(基于java Config)骤公,寫這些配置的時候我們會用到很多注解抚官。正確的運用這些注解會給我們的開發(fā)帶來方便。但是錯誤的使用也會造成很嚴重的后果阶捆。

配置文件注解詳解

我們以freemarker為例來給大家說下springboot配置文件注解的解釋,大家可以直接看代碼的注釋凌节。

看一下它的自動化配置類:

@Configuration // 使用Configuration注解,自動構(gòu)造一些內(nèi)部定義的bean
@ConditionalOnClass({ freemarker.template.Configuration.class,
        FreeMarkerConfigurationFactory.class }) // 需要freemarker.template.Configuration和FreeMarkerConfigurationFactory這兩個類存在在classpath中才會進行自動配置
@AutoConfigureAfter(WebMvcAutoConfiguration.class) // 本次自動配置需要依賴WebMvcAutoConfiguration這個配置類配置之后觸發(fā)洒试。這個WebMvcAutoConfiguration內(nèi)部會配置很多Wen基礎(chǔ)性的東西刊咳,比如RequestMappingHandlerMapping、RequestMappingHandlerAdapter等
@EnableConfigurationProperties(FreeMarkerProperties.class) // 使用FreeMarkerProperties類中的配置
public class FreeMarkerAutoConfiguration {

    private static final Log logger = LogFactory
            .getLog(FreeMarkerAutoConfiguration.class);

    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    private FreeMarkerProperties properties;

    @PostConstruct // 構(gòu)造之后調(diào)用的方法儡司,組要檢查模板位置是否存在
    public void checkTemplateLocationExists() {
        if (this.properties.isCheckTemplateLocation()) {
            TemplateLocation templatePathLocation = null;
            List<TemplateLocation> locations = new ArrayList<TemplateLocation>();
            for (String templateLoaderPath : this.properties.getTemplateLoaderPath()) {
                TemplateLocation location = new TemplateLocation(templateLoaderPath);
                locations.add(location);
                if (location.exists(this.applicationContext)) {
                    templatePathLocation = location;
                    break;
                }
            }
            if (templatePathLocation == null) {
                logger.warn("Cannot find template location(s): " + locations
                        + " (please add some templates, "
                        + "check your FreeMarker configuration, or set "
                        + "spring.freemarker.checkTemplateLocation=false)");
            }
        }
    }

    protected static class FreeMarkerConfiguration {

        @Autowired
        protected FreeMarkerProperties properties;

        protected void applyProperties(FreeMarkerConfigurationFactory factory) {
            factory.setTemplateLoaderPaths(this.properties.getTemplateLoaderPath());
            factory.setPreferFileSystemAccess(this.properties.isPreferFileSystemAccess());
            factory.setDefaultEncoding(this.properties.getCharsetName());
            Properties settings = new Properties();
            settings.putAll(this.properties.getSettings());
            factory.setFreemarkerSettings(settings);
        }

    }

    @Configuration
    @ConditionalOnNotWebApplication // 非Web項目的自動配置
    public static class FreeMarkerNonWebConfiguration extends FreeMarkerConfiguration {

        @Bean
        @ConditionalOnMissingBean
        public FreeMarkerConfigurationFactoryBean freeMarkerConfiguration() {
            FreeMarkerConfigurationFactoryBean freeMarkerFactoryBean = new FreeMarkerConfigurationFactoryBean();
            applyProperties(freeMarkerFactoryBean);
            return freeMarkerFactoryBean;
        }

    }

    @Configuration // 自動配置的類
    @ConditionalOnClass(Servlet.class) // 需要運行在Servlet容器下
    @ConditionalOnWebApplication // 需要在Web項目下
    public static class FreeMarkerWebConfiguration extends FreeMarkerConfiguration {

        @Bean
        @ConditionalOnMissingBean(FreeMarkerConfig.class)
        public FreeMarkerConfigurer freeMarkerConfigurer() {
            FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
            applyProperties(configurer);
            return configurer;
        }

        @Bean
        public freemarker.template.Configuration freeMarkerConfiguration(
                FreeMarkerConfig configurer) {
            return configurer.getConfiguration();
        }

        @Bean
        @ConditionalOnMissingBean(name = "freeMarkerViewResolver") // 沒有配置freeMarkerViewResolver這個bean的話,會自動構(gòu)造一個freeMarkerViewResolver
        @ConditionalOnProperty(name = "spring.freemarker.enabled", matchIfMissing = true) // 配置文件中開關(guān)開啟的話余指,才會構(gòu)造
        public FreeMarkerViewResolver freeMarkerViewResolver() {
            // 構(gòu)造了freemarker的ViewSolver捕犬,這就是一開始我們分析的為什么沒有設(shè)置ViewResolver,但是最后卻還是存在的原因
            FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
            this.properties.applyToViewResolver(resolver);
            return resolver;
        }

    }
}

freemarker對應(yīng)的配置類:

@ConfigurationProperties(prefix = "spring.freemarker") // 使用配置文件中以spring.freemarker開頭的配置
public class FreeMarkerProperties extends AbstractTemplateViewResolverProperties {
    public static final String DEFAULT_TEMPLATE_LOADER_PATH = "classpath:/templates/"; // 默認路徑

    public static final String DEFAULT_PREFIX = ""; // 默認前綴

    public static final String DEFAULT_SUFFIX = ".ftl"; // 默認后綴

    ...

}

下面是官網(wǎng)上的freemarker配置:

# FREEMARKER (FreeMarkerAutoConfiguration)
spring.freemarker.allow-request-override=false # Set whether HttpServletRequest attributes are allowed to override (hide) controller generated model attributes of the same name.
spring.freemarker.allow-session-override=false # Set whether HttpSession attributes are allowed to override (hide) controller generated model attributes of the same name.
spring.freemarker.cache=false # Enable template caching.
spring.freemarker.charset=UTF-8 # Template encoding.
spring.freemarker.check-template-location=true # Check that the templates location exists.
spring.freemarker.content-type=text/html # Content-Type value.
spring.freemarker.enabled=true # Enable MVC view resolution for this technology.
spring.freemarker.expose-request-attributes=false # Set whether all request attributes should be added to the model prior to merging with the template.
spring.freemarker.expose-session-attributes=false # Set whether all HttpSession attributes should be added to the model prior to merging with the template.
spring.freemarker.expose-spring-macro-helpers=true # Set whether to expose a RequestContext for use by Spring's macro library, under the name "springMacroRequestContext".
spring.freemarker.prefer-file-system-access=true # Prefer file system access for template loading. File system access enables hot detection of template changes.
spring.freemarker.prefix= # Prefix that gets prepended to view names when building a URL.
spring.freemarker.request-context-attribute= # Name of the RequestContext attribute for all views.
spring.freemarker.settings.*= # Well-known FreeMarker keys which will be passed to FreeMarker's Configuration.
spring.freemarker.suffix= # Suffix that gets appended to view names when building a URL.
spring.freemarker.template-loader-path=classpath:/templates/ # Comma-separated list of template paths.
spring.freemarker.view-names= # White list of view names that can be resolved.

總結(jié)

springboot內(nèi)部提供了很多自動化配置的類酵镜,這些類會判斷classpath中是否存在自己需要的那個類碉碉,如果存在則會自動配置相關(guān)的配置,否則就不會自動配置淮韭。根據(jù)自己的實際開發(fā)環(huán)境合理使用配置文件才能事半功倍垢粮!

參考: SpringBoot內(nèi)部的一些自動化配置原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市靠粪,隨后出現(xiàn)的幾起案子蜡吧,更是在濱河造成了極大的恐慌,老刑警劉巖占键,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昔善,死亡現(xiàn)場離奇詭異,居然都是意外死亡畔乙,警方通過查閱死者的電腦和手機君仆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牲距,“玉大人返咱,你說我怎么就攤上這事‰咕希” “怎么了咖摹?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長难述。 經(jīng)常有香客問我楞艾,道長参咙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任硫眯,我火速辦了婚禮蕴侧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘两入。我一直安慰自己净宵,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布裹纳。 她就那樣靜靜地躺著择葡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剃氧。 梳的紋絲不亂的頭發(fā)上敏储,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音朋鞍,去河邊找鬼已添。 笑死,一個胖子當(dāng)著我的面吹牛滥酥,可吹牛的內(nèi)容都是我干的更舞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼坎吻,長吁一口氣:“原來是場噩夢啊……” “哼缆蝉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瘦真,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤刊头,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后诸尽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芽偏,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年弦讽,在試婚紗的時候發(fā)現(xiàn)自己被綠了污尉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡往产,死狀恐怖被碗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仿村,我是刑警寧澤锐朴,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站蔼囊,受9級特大地震影響焚志,放射性物質(zhì)發(fā)生泄漏衣迷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一酱酬、第九天 我趴在偏房一處隱蔽的房頂上張望壶谒。 院中可真熱鬧,春花似錦膳沽、人聲如沸汗菜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陨界。三九已至,卻和暖如春痛阻,著一層夾襖步出監(jiān)牢的瞬間菌瘪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工阱当, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俏扩,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓斗这,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啤斗。 傳聞我的和親對象是個殘疾皇子表箭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容