java - Springboot 组件返回属性值 null
问题描述
我实现了这个 springboot 组件,它应该在运行时返回一些属性的值
@Component
public class ConnectionService {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("{spring.liquibase.change-log}")
private String changelog;
public ConnectionService() {
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getChangelog() {
return changelog;
}
public void setChangelog(String changelog) {
this.changelog = changelog;
}
}
但由于某种原因,所有属性都返回为 null
这就是我调用组件的方式
@SpringBootApplication
public class MigrationsApplication {
private static final Logger logger = LoggerFactory.getLogger(MigrationsApplication.class);
@Autowired
static
ConnectionService cs;
public static void main(String[] args) throws DatabaseException {
try{
cs=new ConnectionService();
String dbUrl=cs.getUrl();
logger.info("URL:"+dbUrl);
String dbUsername=cs.getUsername();
logger.info("USERNAME:"+dbUsername);
String dbPassword=cs.getPassword();
logger.info("PASSWORD:"+dbPassword);
String changelogPath=cs.getChangelog();
}
我究竟做错了什么?我需要一个完整的组件构造函数吗?因为 cs 是静态的吗?springboot 不是要自动填充值吗?
解决方案
Component
意味着这是一个 bean,所以 Spring 将处理它的生命周期。创建 bean 时,它将用请求的数据填充它。但是,您尝试用它填充静态值,这不是生命周期的一部分。在类中添加一个完整的 arg 构造函数,让 Spring 将其注入到您要使用它的地方,它会正常工作。
编辑:
我刚刚意识到您没有使用静态变量,因此当您正确地让 Spring 初始化您的 bean 时,字段注入应该可以工作
编辑2:
根据您的代码段,您错误地使用了它。不要将业务逻辑放入主空白中,使用SpringApplication.run
,另外,如果您想要 CLI,请使用 Spring 的 CommandLineRunner 接口,如下所示:
@SpringBootApplication
public class MigrationsApplication.class implements CommandLineRunner {
private static final Logger logger = LoggerFactory.getLogger(MigrationsApplication.class);
@Autowired
ConnectionService cs;
public static void main(String[] args) {
SpringApplication.run(MigrationsApplication.class, args);
}
@Override
public void run(String... args) {
String dbUrl=cs.getUrl();
logger.info("URL:"+dbUrl);
String dbUsername=cs.getUsername();
logger.info("USERNAME:"+dbUsername);
String dbPassword=cs.getPassword();
logger.info("PASSWORD:"+dbPassword);
String changelogPath=cs.getChangelog();
}
}
推荐阅读
- javascript - 查询?在正则表达式中 - JAVASCRIPT
- powershell - Powershell FolderBrowserDialog 无法选择外部共享
- reactjs - 为什么 create-react-app 将类型和打字稿放在依赖项而不是开发依赖项中?
- node.js - 从 Docker 连接 Redis 本地主机
- node.js - 谁能帮我解决与passportjs相关的错误
- robotframework - 在执行下一步之前如何等待运行(来自操作系统库)?
- javascript - 如何使用 highcharts 显示圆形进度饼图
- javascript - 我可以将多个 useEffect 重构为单个 useEffect 吗?
- powershell - 写入文件时PowerShell错误编码
- java - 如何在Android中实现“像相机模式选项一样的慢速滚动视图”?