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

时间:2016-04-12 17:44:08

标签: java spring spring-mvc

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

有人能指出我正确的方向吗?谢谢!

这是我的配置类....

@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;
    }
}

1 个答案:

答案 0 :(得分:2)

实际上,Spring在布线bean时很聪明,只应调用myService()函数一次,然后将结果传递给其他myService()调用,结果只有< strong> MyService的一个 bean。

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

如果您真的看到多个构造函数日志语句,请确保您没有在其他MyService类中声明其他@Configuration bean,或者您没有在{{{{}}上使用任何组件批注1}}类(即不要使用MyService@Service@Component)。

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

此外,您不需要在此处使用这些@Bean注释,甚至不需要调用其他bean,因为以下内容也可以使用:

@Autowired

Spring将看到你需要一个@Configuration public class DbConfiguration { @Bean public MovieDao dao() { return new MovieDao(); } @Bean public MovieService service(MovieDao dao) { return new MovieService(dao); } } 来构建一个MovieDao,它将首先实例化dao并将其传递给服务bean。您甚至不需要在班级中添加MovieService或类似的注释!

这真的很好,希望这些提示有所帮助;)