spring-boot - 两个代码(Spring Boot)有什么区别?
问题描述
这两个代码应该做完全相同的事情,但第一个有效,第二个无效。任何人都可以查看代码并详细说明代码在第二种方法中失败的原因。
第一个代码:
@Component
public class AdminSqlUtil implements SqlUtil {
@Autowired private ApplicationContext context;
DataSource dataSource =(DataSource) context.getBean("adminDataSource");
public void runSqlFile(String SQLFileName) {
Resource resource = context.getResource(SQLFileName);
EncodedResource encodedResource = new EncodedResource(resource, Charset.forName("UTF-8"));
try {
ScriptUtils.executeSqlScript(dataSource.getConnection(), encodedResource);
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
}
第二个代码:
@Component
public class AdminSqlUtil implements SqlUtil {
@Autowired private ApplicationContext context;
public void runSqlFile(String SQLFileName) {
Resource resource = context.getResource(SQLFileName);
EncodedResource encodedResource = new EncodedResource(resource, Charset.forName("UTF-8"));
try {
ScriptUtils.executeSqlScript((DataSource)context.getBean("adminDataSource").getConnection(), encodedResource);
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
}
解决方案
第一个有private
范围,框架无法访问它。您可以@inject
在私有范围变量之前添加,以便框架可以对其进行初始化。然而,最佳实践是定义一个公共依赖设置器以使其工作。
另一方面,第二个在开始时启动值,顺便说一下,这不是依赖注入。我不是在谈论好的和坏的做法。这是错误的。我们不初始化假设由框架初始化的变量。
所以让我们开始第一个,尝试setter
为它添加一个。
看看这个链接。
推荐阅读
- flutter - 在键盘可见时执行 Navigator.pop() 会导致渲染 flex 错误
- javascript - 显示错误消息时更改 div 的大小
- javascript - Service Worker 需要双重刷新
- riscv - 我们现在有 RISC-V 矢量指令的编译器吗?
- grails - 嵌套闭包无法访问私有静态字段
- c# - 如何触发从 bot 到 Skype 用户的新对话?不确定在 Skype 频道的 id 参数中发送什么
- vb.net - 如何从父文本框中获取 FK 以在子数据网格中使用
- c# - 当鼠标悬停在某个文本上时更改字体,然后恢复。(事件处理程序)
- haskell - 多态模式匹配导致类型不明确
- java - Itext7 - 在单个 pdf 上编写多个文档