写点什么

spring- 注入配置

用户头像
Isuodut
关注
发布于: 2020 年 11 月 13 日
spring-注入配置



classpath:/logo.txt表示在classpath中搜索logo.txt文件,

然后,我们直接调用Resource.getInputStream()就可以获取到输入流



@Value("classpath:/logo.txt")
//@Value("file:/path/to/logo.txt")
private Resource resource;
/*
*/
public void init() throws IOException {
try (var reader = new BufferedReader(
new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8))) {
this.logo = reader.lines().collect(Collectors.joining("\n"));
}
}




也可以在IOC容器启动(配置)类中 添加bean @PropertySource("config.file")



@Configuration
@ComponenScan
@PropertySource("app.properties")
public class AppConfig() {
@Value("${app.zone:Z}")
String zoneId;
}
/*"${app.zone}"表示读取key为app.zone的value,如果key不存在,启动将报错;
"${app.zone:Z}"表示读取key为app.zone的value,但如果key不存在,就使用默认值Z。
*/






第三种方式是通过创建一个javabean来获取其持有的配置 注入后,



注:在 IOC启动(配置类) 使用@PropertySource注入的配置 会成为全局配置,可以被任何bean引用获取注入,所以此处没有@propertySource

@Component
public class SmtpConfig {
@Value("${smtp.host}")
private String host;
@Value("${smtp.port:25}")
private int port;
public String getHost() {
return host;
}
public int getPort() {
return port;
}
}

然后,在需要读取的地方,使用#{smtpConfig.host}注入:

@Component
public class MailService {
@Value("#{smtpConfig.host}")
private String smtpHost;
@Value("#{smtpConfig.port}")
private int smtpPort;
}



注意观察#{}这种注入语法,它和${key}不同的是,#{}表示从JavaBean读取属性。"#{smtpConfig.host}"的意思是,从名称为smtpConfig的Bean读取host属性,即调用getHost()方法。一个Class名为SmtpConfig的Bean,它在Spring容器中的默认名称就是smtpConfig,除非用@Qualifier指定了名称。

使用一个独立的JavaBean持有所有属性,然后在其他Bean中以#{bean.property}注入的好处是,多个Bean都可以引用同一个Bean的某个属性。例如,如果SmtpConfig决定从数据库中读取相关配置项,那么MailService注入的@Value("#{smtpConfig.host}")仍然可以不修改正常运行。






初始化和销毁

//初始化和销毁
//当前bean(类) 1、@Autowired 注入以后执行 2、@PostConstruct后跟的无参方法初始化
@PostConstruct
public void init() {
System.out.println("Init mail service with zoneId = " + this.zoneId);
}
@PreDestroy
public void shutdown() {
System.out.println("Shutdown mail service");
}



用户头像

Isuodut

关注

小白的成长之路 2018.12.04 加入

土豆丝

评论

发布
暂无评论
spring-注入配置