springboot自定义属性和编码格式的设置

自定义属性
application.properties提供自定义属性的支持,这样我们就可以把一些常量配置在这

mysql.jdbcName=com.mysql.jdbc.Driver
mysql.jdbcUrl=jdbc:mysql://localhost:3306/test
mysql.userName=root
mysql.userPassword=root

然后直接在要使用的地方通过注解@Value(value=”${config.name}”)取出:

package com.example.demo.Controller;
import com.example.demo.properties.MysqlBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class DemoController {
    /**
     * 数据库的属性的注入
     */
    @Value(value="${mysql.jdbcName}")
    private String jdbcName;
    @Value(value="${mysql.jdbcUrl}")
    private String jdbcUrl;
    @Value(value="${mysql.userName}")
    private String userName;
    @Value(value="${mysql.userPassword}")
    private String userPassword;
    @RequestMapping("/sjk")
    public String shk(){
     return "mysql.jdbcName:"+jdbcName+"<br/>"                                   +"mysql.jdbcUrl:"+jdbcUrl+"<br/>"                 +"mysql.userName:"+userName+"<br/>"                  +"mysql.userPassword:"+userPassword+"</br>";
        }
    }

在这边配置中我们发现有一个特点,所有配置都是以”mysql”开头的,而且有时候属性太多了,一个个绑定到属性字段上太累,官方提倡绑定一个对象的bean,这里我们建一个MysqlProperties .java类,顶部需要使用注解@ConfigurationProperties(prefix = “mysql”)来进行声明:

package com.example.demo.properties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * @Component转换为实体bean
 */
@Component
@ConfigurationProperties(prefix = "mysql")
public class MysqlBean {
    private String jdbcName;
    private String jdbcUrl;
    private String userName;
    private String userPassword;
    public String getJdbcName() {
        return jdbcName;
    }
    public void setJdbcName(String jdbcName) {
        this.jdbcName = jdbcName;
    }
    public String getJdbcUrl() {
        return jdbcUrl;
    }
    public void setJdbcUrl(String jdbcUrl) {
        this.jdbcUrl = jdbcUrl;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPassword() {
        return userPassword;
    }
    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }
}
@Resource
   private MysqlBean mysqlBean;
        @RequestMapping("/sjk")
        public String shk(){
            return "mysql.jdbcName:"+mysqlBean.getJdbcName()+"<br/>"                  +"mysql.jdbcUrl:"+mysqlBean.getJdbcUrl()+"<br/>"                  +"mysql.userName:"+mysqlBean.getUserName()+"<br/>"                   +"mysql.userPassword:"+mysqlBean.getUserPassword()+"</br>";
        }

此时配置完还需要在spring Boot入口类加上@EnableConfigurationProperties并指明要加载哪个bean,如果不写RandomProperties.class,在bean类那边添加@Configuration或者@Component

@SpringBootApplication
@EnableConfigurationProperties({RandomProperties.class})
public class SpringbootdemoApplication 
    public static void main(String[] args) {     SpringApplication.run(SpringbootdemoApplication.class, args);
    }
}

把所有的自定义配置都放在application.properties里面会显得臃肿,这时候我们可以另外定义一个配置文件,这里我明取名为random.properties,路径放在src/main/resources/waiting下面。
这里只需要在之前的bean上添加@PropertySource(“classpath:waiting/random.properties”) 和@Configuration这个注解就可以了。
注意:不能再采取之前的@EnableConfigurationProperties({RandomProperties.class})这个方法。
最后controller层或service获取的时候用@Autowired注解就可以获取。

中文乱码问题

当在.properties的配置文件中有中文时,读取出来的是乱码。需要进行如下操作:
1、添加配置

设置spring-boot 编码格式

banner.charset=UTF-8
server.tomcat.uri-encoding=UTF-8
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.messages.encoding=UTF-8

1
2
3
4
5
6
7

2、设置文件类型

将application.properites的文件类型修改为UTF-8的编码类型。
通过以上方法测试获取出来的值还是乱码。

解决办法
2.1、IDEA

设置 File Encodings的Transparent native-to-ascii conversion为true,具体步骤如下:
依次点击
File -> Settings -> Editor -> File Encodings
将Properties Files (*.properties)下的Default encoding for properties files设置为UTF-8,将Transparent native-to-ascii conversion前的勾选上。
注解
@RequestMapping 配置url 映射
@Controller 处理http请求
@RestController 处理ajax的请求
@PathVariable 获取url 参数
@RequestParam 获取请求的参数

@Controller
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/query")
    public ModelAndView query(@RequestParam(value = "q",required = false)String q ){
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("q",q);
        ***modelAndView.setViewName("param");***
        return  modelAndView;
    }
}

这里出现一个错误, modelAndView.setViewName(“param”);和@RequestMapping(“/param”)

springboot采纳了建立生产就绪Spring应用程序的观点。 Spring Boot优先于配置的惯例,旨在让您尽快启动和运行。在一般情况下,我们不需要做太多的配置就能够让spring boot正常运行。在一些特殊的情况下,我们需要做修改一些配置,或者需要有自己的配置属性。

一、自定义属性

当我们创建一个springboot项目的时候,系统默认会为我们在src/main/java/resources目录下创建一个application.properties。个人习惯,我会将application.properties改为application.yml文件,两种文件格式都支持。

在application.yml自定义一组属性:

my:
name: forezp
age: 12
如果你需要读取配置文件的值只需要加@Value(“${属性名}”):

@RestController
public class MiyaController {

    @Value("${my.name}")
    private String name;
    @Value("${my.age}")
    private int age;

    @RequestMapping(value = "/miya")
    public String miya(){
        return name+":"+age;
    }

}

启动工程,访问:localhost:8080/miya,浏览器显示:

forezp:12

二、将配置文件的属性赋给实体类

当我们有很多配置属性的时候,这时我们会把这些属性作为字段来创建一个javabean,并将属性值赋予给他们,比如:

my:
 name: forezp
 age: 12
 number:  ${random.int}
 uuid : ${random.uuid}
 max: ${random.int(10)}
 value: ${random.value}
 greeting: hi,i'm  ${my.name}

其中配置文件中用到了${random} ,它可以用来生成各种不同类型的随机值。

怎么讲这些属性赋于给一个javabean 呢,首先创建一个javabean :

@ConfigurationProperties(prefix = "my")
@Component
public class ConfigBean {

    private String name;
    private int age;
    private int number;
    private String uuid;
    private int max;
    private String value;
    private String greeting;

    省略了getter setter....

需要加个注解@ConfigurationProperties,并加上它的prrfix。另外@Component可加可不加。另外spring-boot-configuration-processor依赖可加可不加,具体原因不详。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

另外需要在应用类或者application类,加EnableConfigurationProperties注解。

@RestController
@EnableConfigurationProperties({ConfigBean.class})
public class LucyController {
    @Autowired
    ConfigBean configBean;

    @RequestMapping(value = "/lucy")
    public String miya(){
        return configBean.getGreeting()+" >>>>"+configBean.getName()+" >>>>"+ configBean.getUuid()+" >>>>"+configBean.getMax();
    }

启动工程,访问localhost:8080/lucy,我们会发现配置文件信息读到了。

三、自定义配置文件

上面介绍的是我们都把配置文件写到application.yml中。有时我们不愿意把配置都写到application配置文件中,这时需要我们自定义配置文件,比如test.properties:

com.forezp.name=forezp
com.forezp.age=12

怎么将这个配置文件信息赋予给一个javabean呢?

@Configuration
@PropertySource(value = "classpath:test.properties")
@ConfigurationProperties(prefix = "com.forezp")
public class User {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

在最新版本的springboot,需要加这三个注解。@Configuration
@PropertySource(value = “classpath:test.properties”)
@ConfigurationProperties(prefix = “com.forezp”);在1.4版本需要
PropertySource加上location。

@RestController
@EnableConfigurationProperties({ConfigBean.class,User.class})
public class LucyController {
    @Autowired
    ConfigBean configBean;

    @RequestMapping(value = "/lucy")
    public String miya(){
        return configBean.getGreeting()+" >>>>"+configBean.getName()+" >>>>"+ configBean.getUuid()+" >>>>"+configBean.getMax();
    }

    @Autowired
    User user;
    @RequestMapping(value = "/user")
    public String user(){
        return user.getName()+user.getAge();
    }

}

启动工程,打开localhost:8080/user;浏览器会显示:

forezp12

四、多个环境配置文件

在现实的开发环境中,我们需要不同的配置环境;格式为application-{profile}.properties,其中{profile}对应你的环境标识,比如:

application-test.properties:测试环境
application-dev.properties:开发环境
application-prod.properties:生产环境
怎么使用?只需要我们在application.yml中加:

spring:
profiles:
active: dev
其中application-dev.yml:

server:
port: 8082
启动工程,发现程序的端口不再是8080,而是8082。

源码下载:https://github.com/forezp/SpringBootLearning

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页