当前位置: 首页 > 知识库问答 >
问题:

Spring Bean没有自动连线

王昊
2023-03-14

我对从abstract类扩展的Spring beandefaultconfigurationservice初始化有一个问题。我完全卡住了。

类hiearchy如下所示:

public interface ConfigurationService {
    TaxPayer getTaxPayer();
} 

提到该类对需要初始化的服务很有用:

public abstract class BaseInitializationAwareService {

    private boolean initialized = false;

    public abstract void initialize();

    protected void checkInitialization() {
        if (!initialized) {
            initialize();
        }
    }

    protected void setInitialized() {
        this.initialized = true;
    }
}
public abstract class BaseConfigurationService extends BaseInitializationAwareService implements ConfigurationService {


}
    public class DefaultConfigurationService extends BaseConfigurationService {

        private TaxPayerService taxPayerService;

        @Autowired
        public void setTaxPayerService(TaxPayerService taxPayerService) {
            Assert.notNull(taxPayerService);
            this.taxPayerService = taxPayerService;
        }

public void initialize() {
        Optional<TaxPayer> dbtaxPayer = taxPayerService.getActiveTaxPayer();
        if (!dbtaxPayer.isPresent()) {
            throw new IllegalStateException("Tax payer setting not found!");
        }
        this.taxPayer = dbtaxPayer.get();
        setInitialized();
    }

    // the rest omitted...
    }

创建defaultconfigurationservicebean时:

@Bean
    public BaseConfigurationService configurationService() {
        DefaultConfigurationService configurationService = new DefaultConfigurationService();
        configurationService.initialize();
        return configurationService;
    }

defaultconfigurationservice中的纳税人服务为null-似乎没有自动连线。

它能否与defaultconfigurationservice是从抽象类扩展而来的这一事实相联系?

@Bean
    public TaxPayerService taxPayerService() {
        DatabaseTaxPayerService taxPayer = new DatabaseTaxPayerService();
        return taxPayer;
    }

这个bean可能从未初始化过...

这是个例外:

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“WebSecurityConfig.APISecurity”的bean时出错:通过方法“Set ContentNegotationStrategy”参数0表示的不满足的依赖关系;嵌套异常为org.springframework.beans.factory.unsatisfieddependencyexception:创建名为“org.springframework.web.servlet.config.annotation.delegatingwebmvcconfiguration”的bean时出错:通过方法“set configurers”参数0表示的不满足依赖项;嵌套异常为org.springframework.beans.factory.unsatisfieddependencyexception:创建名为“password recovercontroller”的bean时出错:通过方法“set userservice”参数0表示的不满足的依赖关系;嵌套异常为org.springframework.beans.factory.unsatisfieddependencyexception:创建名为“default userservice”的bean时出错:通过方法“set notificationservice”参数0表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.unsatisfieddependencyexception:创建名称为“notification service”的bean时出错:通过方法“set configurationservice”参数0表示的不满足的依赖关系;嵌套异常为org.springframework.beans.factory.beanCreationException:创建类路径资源[com.example.config/appconfig.class]中定义的名为“configuration service”的bean时出错:通过工厂方法实例化bean失败;嵌套异常为org.springframework.beans.beanInstantiationException:无法实例化[com.example.services.baseConfigurationService]:工厂方法“configuration service”引发异常;嵌套异常是java.lang.NullPointerException

例如,需要baseConfigurationService的bean:

    public class EmailNotificationService extends BaseService implements NotificationService {

        private BaseConfigurationService configurationService;

@Autowired
    public void setConfigurationService(BaseConfigurationService configurationService) {
        Assert.notNull(configurationService);
        this.configurationService = configurationService;
    }

    // the rest omitted... 
    }

更新次数1

具有与其他Bean的内部依赖关系的Bean初始化示例:

@Bean
    public TransactionDataService transactionDataService() {
        return new DefaultTransactionDataService();
    }
public class DefaultTransactionDataService implements TransactionDataService {
    private PrivateKeyService privateKeyService;

    @Autowired
    public void setPrivateKeyService(PrivateKeyService privateKeyService) {
        Assert.notNull(privateKeyService);
        this.privateKeyService = privateKeyService;
    }
}
@Bean
    public PrivateKeyService privateKeyService() {
        return new DefaultPrivateKeyAwareService();
    }

而且起作用了。

共有1个答案

法弘壮
2023-03-14

它与您对Spring如何初始化bean的指导有关:

@bean用于显式声明单个bean,而不是像上面那样让Spring自动完成。它将bean的声明与类定义解耦,并允许您完全按照自己的选择来创建和配置bean。

因此,当您手动创建类的实例时,您也必须手动设置所有类字段。

@Bean
public BaseConfigurationService configurationService() {
    DefaultConfigurationService configurationService = new DefaultConfigurationService();
    configurationService.setTaxPayerService(taxPayerService());
    configurationService.initialize();
    return configurationService;
}
@Bean
public BaseConfigurationService configurationService() {
    DefaultConfigurationService configurationService = new DefaultConfigurationService(taxPayerService());
    configurationService.initialize();
    return configurationService;
}
 类似资料:
  • 在Springs的最新版本中,我们可以使用注释作为自动连接bean。这将使用bean的类型(或构造函数,如果应用于它的话)自动连接bean。有什么方法可以使用基于bean名称的注释吗?我们在Spring的XML文件中没有注释autowire=“byName”?

  • 我正在编写单元测试,有一个非常复杂的设置。 依赖bean设置一些侦听器,并将它们传递给自动连线服务。 我想测试侦听器是否存在,但不调用它们,因此我想传递'null'而不是自动连线服务。(特别是:我没有二传手…) 请注意,SUT确实间接依赖于返回侦听器的类。 因为这是一个来自大设置的非常小的示例,所以我不想在这里使用mock,因为我只想测试侦听器的存在性而不是行为。 嘲笑20或30个这样的服务会大大

  • 我正在使用< code>MapStruct,为此我必须定义一个具有相应映射函数的接口。通过使用用< code > @ before mapping < code > 和@AfterMapping注释的< code>default方法,可以实现一些逻辑。在这样一个带注释的默认方法中,我想使用我的SpringBoot应用程序的一个配置类。我该怎么做?我可以将这样的配置(bean)自动连接到接口吗?这样

  • 我有一个简单的udp客户机/服务器程序。 如果客户端正在失去连接,或者服务器正在重新启动,客户端不会自动重新连接。我总是要手动重启客户端。 这是我的客户端套接字配置:

  • 我有几个EJB3。x无状态会话bean,未定义接口。我需要将这些bean注入到Springbean中,但我无法这样做。 无接口EJB: 我的豆子: 还有我的豆子。xml 在初始化Spring容器时,我得到以下错误: 异常本身非常清楚——spring容器期望MyBean有一个本地接口视图作为其业务接口;但是,我没有(也不能介绍)。 非常感谢您的帮助!

  • 问题内容: 我正在尝试在32位Linux上使用LiteIDE(Go IDE)。除自动完成功能外,其他所有功能均可用。构建,运行,一切正常。该二进制文件似乎正在运行: 我可能做错了什么? 问题答案: 您可能需要设置GOROOT =。要在LiteIDE中进行设置,请寻找环境工具栏;它应该是一个下拉列表,可能已预先选择了“系统”和一个按钮。单击按钮以显示“编辑环境”窗格,然后双击“ system.env