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 这里没有必要.
| 归档时间: |
|
| 查看次数: |
47708 次 |
| 最近记录: |