首页 > 解决方案 > 两个代码(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);
        }
    }

标签: spring-boot

解决方案


第一个有private范围,框架无法访问它。您可以@inject在私有范围变量之前添加,以便框架可以对其进行初始化。然而,最佳实践是定义一个公共依赖设置器以使其工作。

另一方面,第二个在开始时启动值,顺便说一下,这不是依赖注入。我不是在谈论好的和坏的做法。这是错误的。我们不初始化假设由框架初始化的变量。

所以让我们开始第一个,尝试setter为它添加一个。

看看这个链接


推荐阅读