2016-04-12 26 views
1

Java Configuration kullanarak Spring MVC kullanarak bir RESTful web hizmeti yazıyorum. Yapılandırma dosyam aşağıda. Sorunum şu: Tek bir örnek yerine 2 "myService" fasulyesinin oluşturulduğunu keşfettim. Emin değilim neden? Yapılandırmayı yalnızca bir tane oluşturmak için nasıl ayarlayabilirim?Yay Yapılandırma, bir tane yerine iki çekirdek oluşturuyor

Beni doğru yöne yönlendiren var mı? Teşekkürler! fasulye kablolama ve tek sonuçlanan kez myService() fonksiyonunu diyoruz, sonra da diğer myService() aramalar sonucu geçmesi gerekirken

İşte benim yapılandırma sınıfı var .... Aslında

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

cevap

2

, Bahar akıllı sadece 'da birMyService numaralı fasulye.

2 örnek MyService, örn. MyService sınıfının yapıcısına bir günlük ekleyerek.

gerçekten Birden fazla kurucu günlüğü deyimi görürseniz, diğer @Configuration sınıflarda diğer MyService fasulye belirtmediğinizi veya yani @Service kullanmayın (MyService sınıfın herhangi bileşen ek açıklama kullanmıyorsanız emin olun , @Component, @Repository).

Sınıfı @Service ile bildirirseniz, sınıfı etkili bir şekilde başlatır ve bunu içeriğe ekler. @Beanile tekrar bildirdiğinizde, 2 örnek ile sona erer, bu nedenle bunları karıştırmayın. Ayrıca


, buradan bu @Autowired ek açıklamaları kullanmak gerekmez veya aşağıdakiler de çalışacaktır, çünkü bile, diğer fasulye çağrıları:

@Configuration 
public class DbConfiguration { 

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

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

} 

Bahar bir MovieDao ihtiyaç olduğunu göreceksiniz Bir MovieService oluşturmak ve ilk olarak dao'yu başlatacak ve servis çekirdeğine iletecektir. Sınıflarınıza @Service veya benzeri ek açıklamaları eklemenize bile gerek yoktur! sadece tercih meselesidir, hizmet` ek açıklamalar ve ayrıca Yapılandırma sınıfları @ `kullanmak için ok)

+0

@Chris;

Gerçekten, bu ipuçları yardımcı iyi umut olmasıdır. Tüm '@ Servis' sınıfları ve' @ Beans'ler içeriğe eklenecektir, sadece ** aynı sınıf için bunları karıştırmayın! ** - Genellikle fasulyeyi nasıl bağladığımı görmek isterseniz, bir örnek ekledim Bu cevabın sonunda kod. Sınıflarımın olabildiğince temiz olmasını ve Yapılandırma sınıflarındaki kablolamayı yapmak için genellikle 'Servis' ek açıklamalarından kaçınıyorum. – ESala

+1

Bileşen taraması temel olarak tüm paketlerimi tarar, şirketimle birlikte - com.mycompany.services taranır. Aynı şekilde Daos'um için. – Chris

+1

başka bir soru - Aslında 2 servisim var, ancak sadece iki tane oluşturuluyor. Kurulum, Yapılandırma dosyasında aynı olmasına ve @ Servis ile açıklamalı olmasına rağmen. 2. hizmetin neden çoğaltılmadığı hakkında bir fikrin var mı? – Chris

İlgili konular