服务类的@autowired注释在@configure类中无法使用Spring Boot

时间:2018-12-28 12:52:24

标签: java spring spring-mvc spring-boot

  

当我使用@autowire在配置中注入依赖项时   将其归类为null,请参见下面的代码。

/messages
  如果我将使用

appService进行调用,则此处为null   BeanDefinitionRegistryPostProcessor beanPostProcessor(AppService
  appService),那么在AppServiceImpl类中,AppDao依赖项将为空

@Configuration
public class DataSourceConfig {



    @Autowired
    AppService   appService;

    @Bean
    public BeanDefinitionRegistryPostProcessor beanPostProcessor() {
        return new BeanDefinitionRegistryPostProcessor() {

            public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {

            }

            public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanRegistry) throws BeansException {

                createBeans(beanRegistry);

            }

        };
    }

    private void createBeans(BeanDefinitionRegistry beanRegistry,DataSourceConfigService ds) {


        appService.getDbDetails();
  

我想要的是什么时候我的beanPostProcessor()       执行后,我希望所有依赖的bean都应实例化,即

}
}


//// Service

@Service
public class AppServiceImpl  implements AppService{


    @Autowired
    AppDao ds;


    @Override
    public List<A> getDatabaseConfiguration() {
        return ds.getDbDetails(); // here ds is null 
    }


}

//dao
@Repository
public class AppDaoImpl implements AppDao {

    @Qualifier("nameParamJdbcTemplate")
    @Autowired
    public NamedParameterJdbcTemplate nameParamJdbcTemplate;

    @Override
    public List<A> getDbDetails() {
        return nameParamJdbcTemplate.query(SELECT_QUERY, new DataSourceMapper());  // nameParamJdbcTemplate is null 
    }


// datasource config

@Configuration
public class DataSourceBuilderConfig {

 @Bean(name = "dbSource")
 @ConfigurationProperties(prefix = "datasource")
 @Primary
 public DataSource dataSource1() {

    return DataSourceBuilder.create().build();

 }

 @Bean(name = "nameParamJdbcTemplate")
 @DependsOn("dbSource")
 @Autowired
 public NamedParameterJdbcTemplate jdbcTemplate1(@Qualifier("dbSource") DataSource dbSource) {
       return new NamedParameterJdbcTemplate(dbSource);
 }




}

1 个答案:

答案 0 :(得分:1)

它是null,因为此@Configuration类还定义了一个BeanDefinitionRegistryPostProcessor,它强制上下文非常早地创建该bean。

因为您使用的是字段注入,所以上下文必须解析AppService bean,但还不能解决,因为必须先应用后处理器。

您的配置看起来非常复杂,因此您可能需要简化一下:

  • 将底层基础结构配置与主要配置分开
  • 始终将此类后处理器定义为public static方法,以便上下文可以调用@Bean方法而不必先构造类。