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


@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();



  如果我将使用这种方式调用appService,则此处为null
  BeanDefinitionRegistryPostProcessor beanPostProcessor(AppService
  appService),则在AppServiceImpl类中AppDao依赖项将为null


}
}


//// 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);
 }




}



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


 @Autowired
  AppService appService;

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

I am new to spring so any help or working examples would be great. Thanks

最佳答案

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

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

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


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

09-26 15:50