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自动代理工厂,很多很多,不知道你掌握的情况,所以有问题请追问吧。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)