東川印記

一本東川,笑看爭龍斗虎;寰茫兦者,度橫佰昧人生。

通过idea 2020 gradle 搭建 Spring Boot 基础学习demo 03 开始读取properties

2020年10月15日星期四



继续水文

水文总比在公司睡觉好,太明目张胆了!!!


众所周知,茴字有四种写法,同样,读取properties至少也有四种,所以本文介绍其中种!

1,通过@Value注解直接获取application.properties

2,通过@Autowired注解注入环境配置Environment,通过环境配置取application.properties;

3,通过@Autowired注解依赖注入component类,component类中@Value获取application.properties;

4,正常项目中,一般通过自定义properties文件,更简洁明确,代码可读性更高;

结构如下:

SENRSL:main senrsl$ tree
.
├── java
│   └── dc
│       └── test
│           └── spring
│               └── boot2
│                   ├── lee
│                   │   ├── TestLeeApplication.java
│                   │   ├── controller
│                   │   │   └── TestLeeController.java
│                   │   └── domain
│                   │       └── LeeBean.java
│                   ├── qian
│                   │   ├── TestWebService01Application.java
│                   │   └── servlet
│                   │       └── Test01HttpServlet.java
│                   ├── sun
│                   │   ├── TestSunApplication.java
│                   │   └── controller
│                   │       └── TestSun01Controller.java
│                   ├── wu
│                   │   ├── TestWuApplication.java
│                   │   ├── component
│                   │   │   ├── TestWu01Properties.java
│                   │   │   └── TestWuOwnerProperties.java
│                   │   └── controller
│                   │       ├── TestWu01Controller.java
│                   │       └── TestWuOwnController.java
│                   ├── zhao
│                   │   └── SpringBoot2Application.java
│                   └── zhou
│                       ├── TestZhouApplication.java
│                       ├── configuration
│                       │   └── TestZhouConfiguration.java
│                       ├── controller
│                       │   └── TestZhouController.java
│                       └── filter
│                           └── TestZhou01Filter.java
└── resources
    ├── application.properties
    ├── static
    ├── templates
    └── wu.properties

23 directories, 19 files
SENRSL:main senrsl$

其中TestWuApplication是简单的入口,跟之前的所有入口一样。。。。

application.properties为主配置,内容由TestWu01Controller示例读取,内容如下:

SENRSL:main senrsl$ cat resources/application.properties
sb2.title=Sb2
dc.test.wu.title=Wu's Title
dc.test.wu.desc=Wu's Desc
SENRSL:main senrsl

TestWu01Controller实现了1,2,3三种方式,如下:

SENRSL:wu senrsl$ cat controller/TestWu01Controller.java
package dc.test.spring.boot2.wu.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import dc.test.spring.boot2.wu.component.TestWu01Properties;


/**
 * http://localhost:8080/wu
 * Sb2 Sb2
 * TestWu01Controller Wu's Title Wu's Desc  Sb2
 *
 * @author senrsl
 * @ClassName: TestWu01Controller
 * @Package: dc.test.spring.boot2.wu.controller
 * @CreateTime: 2020/10/14 2:56 下午
 */
@RestController
public class TestWu01Controller {

    //方式1,直接读取application.properties
    @Value("${sb2.title}")
    private String sb2Title;

    //方式2,依赖注入环境配置
    @Autowired
    private Environment env;

    //方式3,依赖注入component类,类变量直接取application.properties
    @Autowired
    TestWu01Properties properties;

    @RequestMapping("wu")
    public String wu() {

        System.out.printf(properties.toString());
        return String.format("%s\t%s\n<br/>%s\t%s\t%s",
                sb2Title, env.getProperty("sb2.title"),
                getClass().getSimpleName(), properties.getTitle(), properties.getDesc());
    }

}
SENRSL:wu senrsl$

方式3中,注入了component类

SENRSL:wu senrsl$ cat component/TestWu01Properties.java
package dc.test.spring.boot2.wu.component;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * @author senrsl
 * @ClassName: WuProperties
 * @Package: dc.test.spring.boot2.wu.component
 * @CreateTime: 2020/10/14 2:54 下午
 */
@Component
public class TestWu01Properties {

    @Value("${sb2.title}")
    private String sb2Title;
    @Value("${dc.test.wu.title}")
    private String title;
    @Value("${dc.test.wu.desc}")
    private String desc;

    public String getSb2Title() {
        return sb2Title;
    }

    public String getTitle() {
        return title;
    }

    public String getDesc() {
        return desc;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "TestWu01Properties{" +
                "sb2Title='" + sb2Title + '\'' +
                ", title='" + title + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}
SENRSL:wu senrsl$

这个看起来跟 方式1和方式2是一样的,只是做了一次封装。。。。


但是,项目中常用的,还是单独拆分prop文件。。。。

SENRSL:main senrsl$ cat resources/wu.properties
wu.own.title=Wu's own title
wu.own.desc=Wu's own desc

然后封装一个Component类去读取

SENRSL:wu senrsl$ cat component/TestWuOwnerProperties.java
package dc.test.spring.boot2.wu.component;

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

/**
 * @author senrsl
 * @ClassName: TestWuOwnerProperties
 * @Package: dc.test.spring.boot2.wu.component
 * @CreateTime: 2020/10/15 11:28 上午
 */
@Component
@ConfigurationProperties(prefix = "wu.own")
@PropertySource(value = {"wu.properties"})
public class TestWuOwnerProperties {

    //类注解前缀加变量名组合成prop文件中name
    private String title;
    private String desc;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}
SENRSL:wu senrsl$

在类中使用这个Component类

SENRSL:wu senrsl$ cat controller/TestWuOwnController.java
package dc.test.spring.boot2.wu.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import dc.test.spring.boot2.wu.component.TestWuOwnerProperties;

/**
 * http://localhost:8080/wu2
 * TestWuOwnController Wu's own title Wu's own desc
 *
 * @author senrsl
 * @ClassName: TestWuOwnController
 * @Package: dc.test.spring.boot2.wu.controller
 * @CreateTime: 2020/10/15 11:34 上午
 */
@RestController
public class TestWuOwnController {


    //@Autowired Field injection is not recommended
    private final TestWuOwnerProperties prop;

    public TestWuOwnController(TestWuOwnerProperties prop) {
        this.prop = prop;
    }

    @RequestMapping("wu2")
    public String callOwn() {
        return String.format("%s\t%s\t%s\t", getClass().getSimpleName(), prop.getTitle(), prop.getDesc());
    }

}
SENRSL:wu senrsl$

这样就能满足一般需求了。。。。

另外,此处对prop类的注入,之前都是使用@Autowired,但是idea报警,说Field injection is not recommended,根据提示改成了这种构造方式传入,并且没有加任何注解,竟然可以直接能获取到。。。。

好神奇呀。。。。

pkg wu 提交记录:https://github.com/senRsl/TestSpringBoot/tree/9a437476b8f7298268bf078b626065ab72e9004e


又到了吃饭时间了,吃完饭睡觉,睡醒了泡茶听歌,喝会茶刷刷新闻听会儿歌下班。。。。

无聊的公司日常。。。。

--
senRsl
2020年10月15日11:48:02

没有评论 :

发表评论