我正在使用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;
}
}
答案 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
或类似的注释!
这真的很好,希望这些提示有所帮助;)