首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring配置创建两个bean而不是一个

Spring配置创建两个bean而不是一个
EN

Stack Overflow用户
提问于 2016-04-12 17:44:08
回答 1查看 1.4K关注 0票数 1

我正在使用Spring编写一个RESTful web服务,使用。我的配置文件在下面。我的问题是--我发现正在创建两个"myService“bean实例,而不仅仅是一个实例。我不知道为什么?如何调整配置以只创建一个配置?

谁能给我指明正确的方向?谢谢!

这是我的配置课..。

代码语言:javascript
运行
复制
@Configuration
public class MyConfig {

    @Bean(name = "dataSource")
    public DriverManagerDataSource getDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        // datasource set up    
        return dataSource;
    }

    @Autowired
    @Bean(name = "sessionFactory")
    public SessionFactory getSessionFactory(DriverManagerDataSource dataSource) {
        LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
        sessionBuilder.scanPackages("com.mypackages");
        sessionBuilder.addProperties(getHibernateProperties());
        return sessionBuilder.buildSessionFactory();
    }

    private Properties getHibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.enable_lazy_load_no_trans", "true");
        properties.put("hibernate.id.new_generator_mappings", "true");
        return properties;
    }

    @Autowired
    @Bean(name = "transactionManager")
    public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory);    
        return transactionManager;
    }

    @Bean
    public MyMainBean MyMainBean() {
        MyMainBean bean = new MyMainBean();
        bean.setService(myService());
        bean.setValidator(myValidator());
        return bean;
    }

    @Bean(name = "myService")
    public MyService myService() {
        MyService s = new MyService();
        s.setDao1(myDao1());        
        s.setDao2(myDao2());
        s.setCopyUtil(copyUtil());
        return s;
    }

    @Bean
    public MyDao1 myDao1() {
        return new MyDao1();
    }

    @Bean
    public MyDao2 myDao2() {
        return new MyDao2();
    }

    @Bean
    public CopyUtil copyUtil() {
        return new CopyUtil();
    }

    @Bean
    public ReportValidator reportValidator() {
        ReportValidator validator = new ReportValidator();
        validator.setService(myService());      
        return validator;
    }

    @Bean 
    public XMLValidator xmlValidator() {
        XMLValidator validator = new XMLValidator();
        validator.setService(myService());
        return validator;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-12 18:43:26

实际上,Spring在连接bean时是明智的,应该只调用myService()函数一次,然后将结果传递给其他myService()调用,从而只生成MyService一个bean。

确保您确实获得了两个MyService实例,例如通过在MyService类的构造函数中添加一个日志。

如果确实看到多个构造函数日志语句,请确保没有在其他@Configuration类中声明其他@Configurationbean,或者没有在MyService类上使用任何组件注释(即不使用@Service@Component@Repository)。

如果使用@Service声明类,它将有效地实例化类并将其添加到上下文中。当您再次用@Bean 声明它时,您将得到2个实例(),所以不要混合它们。

此外,您不需要在这里使用这些@Autowired注释,甚至不需要调用其他bean,因为下面的内容也会起作用:

代码语言:javascript
运行
复制
@Configuration
public class DbConfiguration {

    @Bean
    public MovieDao dao() {
        return new MovieDao();
    }

    @Bean
    public MovieService service(MovieDao dao) {
        return new MovieService(dao);
    }

}

Spring将看到您需要一个MovieDao来构建一个MovieService,它将首先实例化dao并将其传递给service。您甚至不需要向类添加@Service或类似的注释!

真的很好,希望这些建议能有所帮助;)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36580479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档