在Spring javaconfig中,如何初始化@Bean这取决于@Service

2022-09-03 06:07:47

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

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

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

问题是,在 中,访问了服务,但失败,并显示 .bean.init()NullPointerException

我添加了,但它没有帮助。buildingService@DependsOn

可能 -annoted 类是在 !?@Service@Bean

我可以预先自己初始化带注释的类吗?@Service

编辑 1

感谢到目前为止的所有反馈!

我需要添加一些细节:

buildingService 不是 a ,它是,嗯,a,看起来像这样:@Bean@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();
    }

...

}

Smarty 是一个 Spring 托管的 Bean,在一个 -annotated 类中初始化,该类正在执行根上下文的初始化。@Configuration

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

@Resource(name = "buildingService")
private BuildingService     buildingService;

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

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


答案 1

你对豆子的生命周期感到困惑。春天必须首先制造豆子,然后才能注入任何东西。在您的方法中,您已经创建了您的Bean@Bean

Smarty bean = new Smarty(); 

然后立即调用其方法之一

bean.init();

这似乎取决于正在注入的字段。

这两个调用之间没有任何内容。你期望春天如何做任何事情?

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

@DependsOn这里没有必要。


答案 2

@Sevice带注释的Bean通过组件扫描自动发现和初始化,以便在Spring配置上启用此用途。@ComponentScan

@ComponentScan

配置用于类的组件扫描指令。@Configuration

@Bean用于手动创建 Bean,无需使用特殊注释(如或组件扫描)。@Service

@Bean

指示方法生成由 Spring 容器管理的 Bean。(...)通常,@Bean方法在@Configuration类中声明。在这种情况下,Bean 方法可以通过直接调用同一类中的其他@Bean方法来引用它们。


上下文配置

@Autowired
EntityManager entityManager; //needs to access Hibernate

@Bean
Smarty smarty() {
   return = new Smarty(entityManager);
}

和你的豆子Smarty

public Smarty {

   final EntityManager entityManager;

   public Smarty(EntityManager entityManager){
      this.entityManager = entityManager;
   }
}

推荐