2016-04-12 15 views
1

Java Configurationを使用して、Spring MVCを使用してRESTful Webサービスを作成しています。私の設定ファイルは以下の通りです。私の問題はこれです - 私は、 "myService" Beanの2つのインスタンスが、ただ1つのインスタンスの代わりに作成されていることを発見しました。なぜわからないのですか? 1つだけを作成するように設定を調整するにはどうすればよいですか?Spring Configuration 1つではなく2つの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; 
    } 
} 

答えて

2

豆を配線する際に実際に、春はスマートであり、唯一の結果、一度myService()機能を呼び出し、その後、他のmyService()呼び出しに結果を渡す必要がありますMyServiceの中でのみ。

MyServiceという2つのインスタンスが実際に取得されていることを確認してください。 MyServiceクラスのコンストラクタにログを追加します。

あなたが本当に複数のコンストラクタログ文を参照してください場合は、あなたが他の@Configurationクラスで他のMyService豆を宣言されていないこと、またはあなたはすなわち@Serviceを使用していない(MyServiceクラス上の任意のコンポーネントのアノテーションを使用していないことを確認してください、@Component,@Repository)。

クラスを@Serviceで宣言すると、クラスをインスタンス化してコンテキストに追加します。 @Beanでもう一度宣言すると、2つのインスタンスで終わるので、それらを混用しないでください。


以下でも動作しますので、また、あなたはここで、これらの@Autowiredのアノテーションを使用する必要はありません、あるいは他のBeanへの呼び出し:

@Configuration 
public class DbConfiguration { 

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

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

} 

春は、あなたがMovieDaoが必要であることを確認できますMovieServiceを作成し、最初にdaoをインスタンス化してサービスBeanに渡します。あなたはクラスに@Serviceまたは類似のアノテーションを追加する必要はありません!それは好みの問題だけで、Service`注釈も設定クラス@ `を使用しても大丈夫です)

+0

@クリスを、

それは本当に、これらのヒントは助ける良い願っていることです。すべての '@Service'クラスと' @Bean'がコンテキストに追加されます**ただ同じクラスにそれらを混ぜないでください!** - 私が通常どのように豆を繋ぐのか見たい場合は、この回答の最後にコードの私は通常、クラスを可能な限りクリーンに保ち、Configurationクラスで配線を行うために '@ Service'アノテーションを避けます。 – ESala

+1

コンポーネントスキャンは、基本的にすべての私のパッケージcom.mycompanyをスキャンしているので、com.mycompany.servicesがスキャンされます。同じように私のDaos。 – Chris

+1

別の質問 - 実際には2つのサービスがありますが、1つは2回しか作成されません。設定は設定ファイルと同じで、@ Serviceで注釈が付けられています。 2番目のサービスが重複していない理由は何ですか? – Chris

関連する問題