springboot覆盖自动配置

当Spring Boot的自动配置不能满足需求时,可以通过覆盖自动配置的Bean和外部属性配置进行调整。本文介绍了如何使用命令行参数、application.properties或application.yml文件来设置配置,并展示了在不同环境下进行细微配置的方法,以及如何自定义错误页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

覆盖自动配置的Bean

大多数情况下,自动配置的Bean刚好能满足你的需要,不需要去覆盖它们。但某些情况下,
Spring Boot在自动配置时还不能很好地进行推断。

保护应用程序
引入maven

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-security</artifactId>
</dependency> 
``创建覆盖文件
覆盖自动配置的显式安全配置

	package readinglist;
	
	import org.springframework.beans.factory.annotation.Autowired;
	import org.springframework.context.annotation.Configuration;
	import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
	import org.springframework.security.config.annotation.web.builders.HttpSecurity;
	import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
	import org.springframework.security.core.userdetails.UserDetails;
	import org.springframework.security.core.userdetails.UserDetailsService;
	import org.springframework.security.core.userdetails.UsernameNotFoundException;
	
	@Configuration
	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 {
	          UserDetails userDetails = readerRepository.findOne(username);
	          if (userDetails != null) {
	            return userDetails;
	          }
	          throw new UsernameNotFoundException("User '" + username + "' not found.");
	        }
	      });
	  }
	
	}

定义实体

package readinglist;

import java.util.Arrays;
import java.util.Collection;

import javax.persistence.Entity;
import javax.persistence.Id;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

@Entity
public class Reader implements UserDetails {

  private static final long serialVersionUID = 1L;

  @Id
  private String username;
  
  private String fullname;
  private String password;
  
  public String getUsername() {
    return username;
  }
  
  public void setUsername(String username) {
    this.username = username;
  }
  
  public String getFullname() {
    return fullname;
  }
  
  public void setFullname(String fullname) {
    this.fullname = fullname;
  }
  
  public String getPassword() {
    return password;
  }
  
  public void setPassword(String password) {
    this.password = password;
  }

  @Override
  public Collection<? extends GrantedAuthority> getAuthorities() {
    return Arrays.asList(new SimpleGrantedAuthority("ROLE_READER"));
  }

  @Override
  public boolean isAccountNonExpired() {
    return true;
  }

  @Override
  public boolean isAccountNonLocked() {
    return true;
  }

  @Override
  public boolean isCredentialsNonExpired() {
    return true;
  }

  @Override
  public boolean isEnabled() {
    return true;
  }

}

用外指属性进行配置(在自动配置基础上修改)

外部文件配置

有三种方式
第一种启动的时候使用命令行配置
java -jar readinglist-0.0.1-SNAPSHOT.jar --spring.main.show-banner=false

第二种创建application.properties将信息添加进去。
一般文件放在resources中
spring.main.show-banner=false

第三种方式创建application.yml一般放在resources中
spring:
main:
show-banner: false

如果同时使用按照下面优先级配置。

(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) 默认属性
这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先
级的相同属性。例如,命令行参数会覆盖其他属性源里的属性。

应用程序 Bean 的配置外置

属性注入

假设我们在某人的阅读列表里不止想要展示图书标题,还要提供该书的Amazon链接。我们
不仅想提供该书的链接,还要标记该书,以便利用Amazon的Associate Program,这样如果有人用
我们应用程序里的链接买了书,我们还能收到一笔推荐费。
这很简单,只需修改Thymeleaf模板,以链接的形式来呈现每本书的标题就可以了:

<a th:href="'http://www.amazon.com/gp/product/'
 + ${book.isbn}
 + '/tag=habuma-20'"
 th:text="${book.title}">Title</a> 

1、定义一个bean装载属性

package readinglist;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties("amazon")
public class AmazonProperties {

  private String associateId;
  
  public void setAssociateId(String associateId) {
    this.associateId = associateId;
  }
  
  public String getAssociateId() {
    return associateId;
  }
  
}

2、在properties或yml外置文件中配置
amazon.associateId=habuma-20
yml中配置
amazon:
associateId: habuma-20

不同环境细微配置

使用 Profile 进行配置
比如:

logging:
 level:
 root: INFO
---
spring:
 profiles: development
logging:
 level:
 root: DEBUG
---
spring:
 profiles: production
logging:
 path: /tmp/
 file: BookWorm.log
 level:
 root: WARN 

自定义错误页

Spring Boot自动配置的默认错误处理器会查找名为error的视图,如果找不到就用默认的白标
错误视图
error.html

<html>
  <head>
    <title>Oops!</title>
    <link rel="stylesheet" th:href="@{/style.css}"></link>
  </head>

  <html>
    <div class="errorPage">
      <span class="oops">Oops!</span><br/>
      <img th:src="@{/MissingPage.png}"></img>
      <p>There seems to be a problem with the page you requested 
         (<span text="${path}">/readingList</span>).</p>
      <p th:text="${'Details: ' + message}"></p>
    </div>
  </html>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值