Guns框架学习记录-2
3.SpringBoot条件注解
SpringBoot核心:
1.自动配置
2.起步依赖
3.命令行模式
4.Actuator监控
自动配置:这里着重讲解下自动配置这一核心。自动配置,见名知意,springboot会根据需要进行配置。即:autoConfiguration
SpringBoot内部提供了特有的注解:条件注解(Conditional Annotation)。
比如@ConditionalOnBean、@ConditionalOnClass、@ConditionalOnExpression、@ConditionalOnMissingBean等。
条件注解存在的意义在于动态识别(也可以说是代码自动化执行)。
所有的配置类都在spring-boot-autoconfigure.jar中,每个配置类都在应用程序的classpath中。配置类名称都以AutoConfiguration结尾。
名称 | 说明 |
---|---|
@ConditionalOnBean | 配置了某个特定bean |
@ConditionalOnMissingBean | 没有配置特定bean |
@ConditionalOnClass | classpath中有指定类 –依赖所加载的jar包都在classpath中 |
@ConditionalOnMissingClass | classpath中没有指定类 |
@ConditionalOnProperty | 给定配置属性中包含某个值 |
@ConditionalOnResource | classpath有指定资源 – 项目中的resources文件夹下 |
@ConditionalOnWebApplication | 是一个web应用程序 |
@ConditionalOnNotWebApplication | 不是一个web应用程序 |
这里就经常使用的条件注解进行说明:
@ConditionalOnProperty:这里的配置文件是指的:application.yml文件
/**
* 单数据源连接池配置
*/
@Bean
@ConditionalOnProperty(prefix = "guns", name = "muti-datasource-open", havingValue = "false")
public DruidDataSource singleDatasource() {
return dataSourceGuns();
}
/**
* 多数据源连接池配置
*/
@Bean
@ConditionalOnProperty(prefix = "guns", name = "muti-datasource-open", havingValue = "true")
public DynamicDataSource mutiDataSource() {
//...
}
坐标:application.yml
guns:
muti-datasource-open: false #是否开启多数据源
配置类注解@Configuration,其次配置方法条件注解(按需使用,这里采用了@ConditionalOnProperty)。
上述例子表示:当配置文件中,属性名为:guns.muti-datasource-open 的属性的值为false时,自动配置singleDatasource()方法。
反之自动配置mutiDataSource()方法。
条件注解的使用比较灵活,按需使用。
起步依赖:本质上是pom,当引入一个依赖时,springboot会连带的导入该依赖需要的其他模块。覆盖传递依赖:实际应用中可能会遇到需要替换依赖的情况。
比如:springboot-web模块包含了Jackson的json处理依赖,而我们想采用fastjson。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 剔除依赖 -->
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入我们需要的依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>{fastjson.version}</version>
</dependency>
命令行界面:通过命令行方式进行springboot项目构建,可以采用groovy语言进行开发。
Actuator监控:监控spring项目的健康状态,以及一些配置信息。
4.SpringBoot中的配置
1.覆盖自动配置
2.配置文件
3.spring profile
4.错误页
覆盖自动配置:这里说的覆盖自动配置是采用配置类方式。
上文中已经提到了条件注解可以更灵活的自动配置,这里举个例子:
在spring-boot-autoconfigure.jar中,找到jdbc/DataSourceTransactionManagerAutoConfiguration这个配置类。
可以看到:该类名上标注了这是一个配置类,并且在JdbcTemplate和PlatformTransactionManager加载时进行自动配置。
@Configuration
@ConditionalOnClass({ JdbcTemplate.class, PlatformTransactionManager.class })
这个配置类中包含两个方法:我们看第二个方法
@Bean
@ConditionalOnMissingBean(PlatformTransactionManager.class)
public DataSourceTransactionManager transactionManager(
DataSourceProperties properties) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(
this.dataSource);
if (this.transactionManagerCustomizers != null) {
this.transactionManagerCustomizers.customize(transactionManager);
}
return transactionManager;
}
DataSourceTransactionManagerAutoConfiguration这个配置类中声明了一个bean(这里等同于xml文件中<bean>标签的bean生成方式)。
配置了条件注解@ConditionalOnMissingBean:当没有PlatformTransactionManager时进行加载自动配置。
我们就是要覆写这个方法:当PlatformTransactionManager存在时该方法不会被自动配置。
@Configuration
public class Xxx(){
/*
* 测试覆盖配置类方法
* */
@Bean
public DataSourceTransactionManager transactionManager() {
//...
return xxx;
}
}
上述例子是一个配置类,所以类名上必须有@Configuration注解,注入的bean必须在方法名上加入@Bean注解。
方法名,返回值相同,参数签名不同,为有效覆写。另外没有加入条件注解,当配置类加载时即可进行自动配置。
配置文件:这里所提到配置文件包含了外部的项目配置方法。
下面所提到的外置配置方法优先级依次降低
1.命令行参数:java -jar xx.jar --spring.profiles.active=dev
2.JVM系统属性:可以在Application的Edit Configuration中VM options中进行配置
3.系统环境变量
4.yml/properties配置文件(项目外部,同一路径下)
5.yml/properties配置文件(项目内部) -- 常用
针对常用的内部yml配置文件除了框架自带的配置属性之外,也可以自定义配置:
自定义一个配置类:
//声明该类是配置属性类
@Component
@ConfigurationProperties(prefix = DIYProperties.PREFIX)
public class DIYProperties{
//自定义配置属性前缀
public static final String PREFIX = "diy";
public int test = 500;
}
application.yml文件中可以这样配置:
diy:
test: 600 #直接引用了配置属性类中的成员变量
spring profile:针对不同环境,spring自动应用不同的配置。
在application.yml文件中配置环境信息,例如:dev开发环境、test测试环境、pro生产环境。
两种配置方式:
1.在application.yml文件中采用"---"分割进行环境配置
例:
---
####开发环境####
spring:
profiles: dev
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?
username: root
password: 1234
filters: log4j,wall,mergeStat
2.创建application-{profile}.yml文件,将上述代码转移至该文件内。(类比外链css文件)
如何使环境配置生效?
在application.yml文件中的spring配置中找到:active,此处可以进行环境配置的变更。
spring:
profiles:
active: dev
错误页:自定义错误页,当请求404时,按照配置加载自定义的错误页。
自定义错误页:
1.配置属性类:添加component注解并注明id为error,实现spring的View接口。
@Component("error")
public class ErrorView implements View {
//表示返回的页面内容类型为text/html
@Override
public String getContentType() {
return "text/html";
}
//render进行渲染,forward进行转发请求,请求将进入controller。
@Override
public void render(Map<String, ?> map, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
httpServletRequest.getRequestDispatcher("/global/error").forward(httpServletRequest, httpServletResponse);
}
}
2.controller:接受请求后,对RequestMapping进行匹配返回,返回的错误页面我们可以自定义。
@Controller
@RequestMapping("/global")
public class GlobalController {
/**
* 跳转到404页面
*/
@RequestMapping(path = "/error")
public String errorPage() {
return "/404.html";
}
}
8/3/2018 6:15:27 PM