在Spring javaconfig中,如何初始化依赖于@Service的@Bean

ygl*_*odt 16 java spring hibernate spring-java-config

我已经将基于Spring 4.0的项目从xml转换为javaconfig.

在初始化时,我的一个bean需要访问Hibernate以通过Spring @Service(buildingService)从DB获取一些配置数据.bean初始化如下所示:

@Bean
@DependsOn({ "transactionManager", "webSocketHandler", "buildingService" })
Smarty smarty() {
    Smarty bean = new Smarty();
    bean.init(); // I also tried @Bean(initMethod = "init") with no difference
    return bean;
}
Run Code Online (Sandbox Code Playgroud)

问题在于,在bean.init()访问服务时,服务失败了NullPointerException.

我补充说buildingService,@DependsOn但没有帮助.

可能在@Service注释后的类被处理了@Bean!?

我可以自己初始化@Service-annotated类吗?

编辑1

感谢所有反馈!

我需要添加一些细节:

buildingService不是@Bean,它是,嗯,a @Service,看起来像这样:

@Service("buildingService")
@Transactional
public class BuildingService {

...

    public List<Building> getAll() {
        final Session session = sessionFactory.getCurrentSession();
        final Query query = session.createQuery("from Building order by name");
        return query.list();
    }

...

}
Run Code Online (Sandbox Code Playgroud)

Smarty是一个Spring托管Bean,并在一个@Configuration注释类中进行初始化,该类正在进行根上下文的初始化.

Smarty直接依赖于buildingService,如下所示:

@Resource(name = "buildingService")
private BuildingService     buildingService;
Run Code Online (Sandbox Code Playgroud)

我尝试过注释Smarty.init(),@PostConstruct但这并没有改变任何东西.

请注意,首先要做的Smarty.init()是调用buildingService.getAll();

Sot*_*lis 19

你对bean的生命周期感到困惑.Spring必须首先创建bean才能注入任何东西.在您的@Bean方法中,您已经创建了bean

Smarty bean = new Smarty(); 
Run Code Online (Sandbox Code Playgroud)

然后立即调用其中一种方法

bean.init();
Run Code Online (Sandbox Code Playgroud)

这似乎取决于注入的领域.

这两个电话之间没有任何内容.你怎么期望Spring做任何事情?

相反,您可以使用注释init()方法@PostConstruct.一旦Spring完成初始化你的bean,即.当你的@Bean方法返回并且Spring注入所有对象的注入目标时,它将自动调用该方法.

@DependsOn 这里没有必要.