继续水文
水文总比在公司睡觉好,太明目张胆了!!!
众所周知,茴字有四种写法,同样,读取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
没有评论 :
发表评论