• Spring Boot自定义配置


     

    一、方法

    覆盖自动配置很简单,就当自动配置不存在,直接显式地写一段配置。这段显式配置的形式 不限, Spring支持的XML和Groovy形式配置都可以。

    二、原理

    @ConditionalOnMissingBean注解是覆盖自动配置的关键。 Spring Boot的设计是加载应用级配置,随后再考虑自动配置类。 关于Spring Security,自动配置会考虑几个配置类 其中最重要的一个类是SpringBootWebSecurityConfiguration。

    @Configuration
    @EnableConfigurationProperties
    @ConditionalOnClass({ EnableWebSecurity.class })
    @ConditionalOnMissingBean(WebSecurityConfiguration.class)
    @ConditionalOnWebApplication
    public class SpringBootWebSecurityConfiguration {
    ...
    }

    这里@ConditionalOnClass注解表示必须要有@EnableWebSecurity注解。 @ConditionalOnWebApplication 表示必须是个Web应用程序。 @ConditionalOnMissingBean注解要求当下没有WebSecurityConfiguration类型的Bean。

    所以覆盖Spring Security的自动配置,可以写一个类:

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private ReaderRepository readerRepository;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
    http
    .authorizeRequests()
    .antMatchers("/").access("hasRole('READER')")
    .antMatchers("/**").permitAll()
    .and()
    .formLogin()
    .loginPage("/login")
    .failureUrl("/login?error=true");
    }
    @Override
    protected void configure(
    AuthenticationManagerBuilder auth) throws Exception {
    auth
    .userDetailsService(new UserDetailsService() {
    @Override
    public UserDetails loadUserByUsername(String username)
    throws UsernameNotFoundException {
    return readerRepository.findOne(username);
    }
    });
    }
    }

    虽然表面上我们并没有这么一个Bean,但通过在SecurityConfig上添加@EnableWebSecurity注解, 我们实际上间接创建了一个WebSecurityConfiguration Bean。所以在自动配置时, 这个Bean就已经存在了, @ConditionalOnMissingBean条件不成立, SpringBootWebSecurityConfiguration提供的配置就被跳过了。

    三、简单方案——通过属性文件外置配置

    全部外置配置(优先级从高到低):

    • (1) 命令行参数
    • (2) java:comp/env里的JNDI属性
    • (3) JVM系统属性
    • (4) 操作系统环境变量
    • (5) 随机生成的带random.*前缀的属性(在设置其他属性时,可以引用它们,比如${random. long})
    • (6) 应用程序以外的application.properties或者appliaction.yml文件
    • (7) 打包在应用程序内的application.properties或者appliaction.yml文件
    • (8) 通过@PropertySource标注的属性源
    • (9) 默认属性

    常用的外置配置:

    • xml(@ImportResource(a.xml,b.xml))
    • 命令行参数(java -jar x.jar --server.port=8000)
    • properties文件/yaml文件(可以结合@ConfigurationProperties注解使用: @ConfigurationProperties(prefix="aa",locations="a.properties"))

    application.properties和application.yml文件能放在以下四个位置 (优先级从高到低,同一优先级位置yml文件优先级高于properties文件)。

    • (1) 外置,在相对于应用程序运行目录的/config子目录里。
    • (2) 外置,在应用程序运行的目录里。
    • (3) 内置,在config包内。
    • (4) 内置,在Classpath根目录。
  • 相关阅读:
    Excel Formulas-Vlookup
    C#字符串与unicode互相转换
    string.IsNullOrWhiteSpace
    CREATE SEQUENCE sqlserver
    error CS1056
    WebExceptionStatus
    运维踩坑记
    C# 快捷命令
    sqlserver2019安装教程
    sql server 数据库mdf文件和log文件过大问题
  • 原文地址:https://www.cnblogs.com/goingforward/p/7348372.html
Copyright © 2020-2023  润新知