Spring Boot 第二d,配置文件详解-史上最全

Spring Boot 第二d,配置文件详解-史上最全,第1张

  Spring Boot 官方 提供了两种常用的配置文件格式,分别是 properties 、 YML 格式。相比于 properties 来说, YML 更加年轻,层级也是更加分明。 强烈推荐使用 YML 格式

  Spring Boot项目 启动会扫描以下位置的 application.properties 或者 application.yml 作为默认的配置文件.

徒手撕源码

内部类Loader的load方法

getSearchLocations()方法

asResolvedSet()

下面给出优先级 从高到低 的配置文件排列顺序:

以设置应用端口为例 初体验Spring Boot配置坦昌文件

properties后缀结尾(application.properties)

yml/yaml后缀结尾(application.yml/application.yaml)

数字,字符串,布尔,日期

对象、Map

数组

数字,字符串,布尔,日改缓期

对象、Map

数组

@ConfigurationProperties(prefix = "person")详解

标注在类上

标注在方法上

综上所述

  @ConfigurationProperties 注解能够轻松的让配置文件跟实体类绑定在一起。

 值得关注的是: @ConfigurationProperties 这个注解仅仅是支持从 Spring Boot的默认配置文件 中取值,也就是 application.properties 、 application.yml 、 application.yaml ,那我们如何从自定义配置文件取值呢???

 别着急,有解决办法,那就是再加一个注解: @PropertySource(value = "classpath:custom-profile.properties") ,下面会有对 @PropertySource 注解的介绍。请耐心往下面看。

使用@PropertySource注解

对应配置文件

创建两个配置文件 custom-profile.yml、custom-profile1.yml ,如下去引入。

我们可以通过控制变量法进行测试,具体过程我这里就不赘述了。

直接说 结论 吧: Spring加载顺序 为 从左到右顺序加载 ,后加载的会 覆盖 先加载的属性值。

另外需要注意的是 : @PropertySource 默认加载 xxx.properties类型 的配置文件,不能加载 YML格式 的配置文件。如何解决呢?下面来解决这一问题

对应配置文件:

编写PropertiesController

扩展功能

application.yml 主配置文件

application-dev.yml 开发配置文件让歼扒

application-prod.yml 生产配置文件

application-test.yml 测试配置文件

(1)主配置文件:配置激活选项

(2)其他配置文件:指定属于哪个环境(同yml,只不过表现形式是 key=value 的,三个配置文件分别是: application-dev.properties , application-prod.properties , application-test.properties )

 无论是使用上述 多文档块 的方式,还是新建 application-test.yml 文件,都可以在配置文件中指定 spring.profiles.active=test 激活指定的profile。

感谢阅读小生文章。祝大家早日富可敌国,实现财富自由。

写文不易 ,一定要 点赞、评论、收藏哦 , 感谢感谢感谢!!!

SpringBoot支持动态的读取文件,留下的扩展接口 org.springframework.boot.env.EnvironmentPostProcessor 。这个接口是spring包下的,使用这个进行配置文件的集中管理,闷孙而不需要每个项目都去配置配置文件。这种方法也是springboot框架留下的一个扩展(哗竖可以自己去扩展)

在 /Users/naeshihiroshi/study/studySummarize/SpringBoot/ (自己测试也可以随机在一个目录下建立一文件),目录下建立一个名为 springboot.properties 文件,

springboot.properties 中定义一些配置,配置如下:

定义 MyEnvironmentPostProcessor 实现 EnvironmentPostProcessor 接口

在classpath定义一个 META-INF 文件夹然后在其下面先建 spring.factories 文件乱罩大,在其中指定:

启动类测试:

打印结果:

逐条解释肯定解释不完,就跟你讲一下事务管理的相关理解吧。

下面是Spring较早时期的一个配置,能体现出一点底层的东西。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

    <property name="driverClass" value="桥源com.mysql.jdbc.Driver" />

    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/" />

    <property name="user" value="root" />

    <property name="password" value="fuhaiwei" />

</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

    <property name="dataSource" ref="dataSource" />

    <property name="mappingResources" value="com/fuhaiwei/domain/domain.xml" />

    <property name="hibernateProperties">

        <props>

            <prop key="hibernate.hbm2ddl.auto">update</prop>

            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>

        </props>

    </property>

</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" >

    <property name="dataSource" ref="dataSource" />

</bean>

//看这个,这个是关键,事务管理是靠AOP实现的,下面是一个拦截器。

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">

    <property name="transactionManager" ref="transactionManager" />

    <property name="transactionAttributes">

        //指定事务传播属性,例如getUser给予只读事务

        <props>

            <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

            <prop key="add*">PROPAGATION_REQUIRED</prop>

            <prop key="update*">PROPAGATION_REQUIRED</prop>

            <prop key="update*">PROPAGATION_REQUIRED</prop>

        </props>

    </property>

</bean>

//这个谈蔽也是关键,指定那些Bean会启动上面的拦截器。

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

    <property name="interceptorNames" value="transactionInterceptor" />

    //指定所有Service结尾的Bean会启用事务管理。

    <property name="beanNames" value="*Service" />

</bean>

//现在使用的<tx:annotation-driven transaction-manager="transactionManager"/>

//直接替代了上述两条配置。

从上敏侍态面的配置可以看出,Spring的事务管理要发挥作用有一些条件。

一:这个类要由Spring来管理,也就是说配置成一个Bean,并且程序中实际使用的必须是由容器注入的。(因为事务管理的实现原理是AOP代理,我们实际使用的UserService对象将是一个代理对象)

二:我们应该告诉Spring,我们想在那些类或者说Bean上启用事务。

三:我们应该告诉Spring,我们想在那些方法上启用事务。(因为AOP代理一般是使用JDK动态代理机制,而JDK想要代理的方法,必须实现于一个接口,所以我们经常发现由Spring管理的项目,其Service和Dao常常都有接口类)

四:我们在Dao中,获取Session时,应该用getCurrentSession()方法,而不是openSession()方法,因为openSession()方法会打开一个全新的Session,且不与线程关联。事务管理器到时候无法获取这个Session也就无法管理事务。而如果使用getCurrentSession()方法,这个方法获取的事务是与线程关联的,到时候事务管理器就可以打开事务,提交事务,或者回滚事务。

五:这是的transactionInterceptor一个片段

 public Object invoke(final MethodInvocation invocation) throws Throwable {

     //如有必要打开事务。

    TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification)

    Object retVal = null

    try {

        //运行被代理类的实际方法,也就是我们的Service类的某个方法

        retVal = invocation.proceed()

    }

    catch (Throwable ex) {

        //如果抛出异常就回滚事务(默认配置情况下)

        completeTransactionAfterThrowing(txInfo, ex)

        throw ex

    }

    finally {

        cleanupTransactionInfo(txInfo)

    }

    //如果没有异常就提交事务

    commitTransactionAfterReturning(txInfo)

    return retVal

}

最后总结,这里面设计到很多个知识点,如什么是AOP,SpringAOP实现的方法是什么,什么是JDK动态代理,什么是Spring自动代理工厂,很多很多,不知道你掌握的情况,所以有问题请追问吧。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12282461.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存