Guns框架学习记录-2

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

猜你喜欢

转载自blog.csdn.net/Nerver_77/article/details/81392402
今日推荐