2011-02-15 17 views
9

Depolarımı yöneten bir depo yöneticim var. Özelliklerimi özmek için @Autowired'im var, ancak her zaman boştur. Fasulye, xml'mde doğru şekilde yapılandırıldı. Herhangi bir sebep neden?Singleton ve @Outowired dönen NULL

public class RepositoryManager { 

     private static RepositoryManager instance; 

     private RepositoryManager() 
     { 
     } 

     public static RepositoryManager Instance() 
     { 
      if(instance == null) 
       instance = new RepositoryManager(); 

      return instance; 
     } 

     @Autowired 
     private IUserRepository userRepository; 

     @Autowired 
     private IRoleRepository roleRepository; 

     @Autowired 
     private IAssetRepository assetRepository; 

     public IUserRepository getUserRepository() { 
      return userRepository; 
     } 

     public void setUserRepository(IUserRepository userRepository) { 
      this.userRepository = userRepository; 
     } 

     public IRoleRepository getRoleReposttory() { 
      return roleRepository; 
     } 

     public void setRoleReposttory(IRoleRepository roleRepository) { 
      this.roleRepository = roleRepository; 
     } 

     public IAssetRepository getAssetRepository() { 
      return assetRepository; 
     } 

     public void setAssetRepository(IAssetRepository assetRepository) { 
      this.assetRepository = assetRepository; 
     } 
    } 

dao.xml

<!-- Scans within the base package of the application for @Components to configure as beans --> 
    <context:component-scan base-package="com.cisco.badges.data.*" /> 

    <context:property-placeholder location="classpath:jdbc.properties"/> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="${jdbc.driverClassName}"/> 
     <property name="url" value="${jdbc.url}"/> 
     <property name="username" value="${jdbc.username}"/> 
     <property name="password" value="${jdbc.password}"/> 
     </bean> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/> 
     <property name="annotatedClasses"> 
      <list> 
       <value>com.cisco.badges.data.domain.User</value> 
       <value>com.cisco.badges.data.domain.Role</value> 
       <value>com.cisco.badges.data.domain.Asset</value> 
       <value>com.cisco.badges.data.domain.UserRole</value> 
       <value>com.cisco.badges.data.domain.UserRole$UserRolePK</value> 
       <value>com.cisco.badges.data.domain.UserAsset</value> 
       <value>com.cisco.badges.data.domain.UserAsset$UserAssetPK</value> 
      </list> 
     </property> 
     <property name="configLocation"> 
      <value>classpath:hibernate.cfg.xml</value> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.format_sql">true</prop> 
      </props> 
     </property> 
    </bean> 

    <tx:annotation-driven/> 

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

</beans> 

userrepository.java

@Repository("userRepository") 
public class UserRepository extends 
     BaseRepository<User, Long> implements 
     IUserRepository { 

    @Autowired 
    public UserRepository(SessionFactory sessionFactory) { 
     super(sessionFactory); 
    } 
+0

Fasulye * doğru şekilde yapılandırılmışsa, alanlarınız boş olmaz. Bize yapılandırmayı göster. – skaffman

+0

xml ve örnek havuzunu ekledim. Aynı depo, bir denetleyicide bir özellik olarak el ile enjekte edilebilir, ancak bu statik yöntem içinde doldurulmuyor. –

+0

(a) Neden "RepositoryManager" kendi singletonunu yönetiyor? (b) İlkbaharda "RepositoryManager" tanımlandı? Hangi pakette? (c) Zaten bir bileşen taraması yaptığınızda açık depo çekirdekleri neden bildiriyorsunuz? – skaffman

cevap

5

sahip olduğundan emin olun sizin config aşağıdaki:

<context:annotation-config /> 

<context:component-scan base-package="name.of.your.package"></context:component-scan> 

bunu varsa sonra yapılandırmanızı gönderin xml

+0

Bilgi notu ekledim ve bileşen taraması –

+0

Sanırım 'a ihtiyacınız var. Lütfen bu örneğe bakın http://www.mkyong.com/spring/spring-auto-wiring- fason-with-autowired-annotation/ve ben de koduma bakıyorum ve orada görüyorum. –

+0

Aynı şey. Sanırım bunun tekil kısmı ile ilgisi var mı? –

21

Bu işe kendim girdim. Sorun Derece() içinde

new RepositoryManager(); 

yaptığınızda, RepositoryManager oluşturmak için Bahar kullanarak değildir ve dolayısıyla bağımlılık enjeksiyon örneğine (hayır Autowiring) için olmuyor olmasıdır.

Çözüm, Instance() singleton şablonunu ortadan kaldırmaktır. Eğer bir Singleton ısrar etmek istiyorsanız, o zaman depo yöneticisi ihtiyaç duyduğunuz her yerde, sadece bir referans autowire O zaman bu

@Component 
@Scope(value = "singleton") 
public class RepositoryManager { 
    ... 
} 

yapmak (çağırarak fasulye da Bahar tarafından yönetilen varsayarak!)

@Autowired 
private RepositoryManager repositoryManager = null; 
bu oluyor
+0

+1 Güzel vuruş. Teşekkürler. –

0

nedeni bahar bağlamı dışında POJO oluştururken statik yöntemle Instance()

taşımaktadır.

sen, yani pasta var ve onu yemek için çok şık bir şekilde yapılandırmanıza <context:spring-configured /> ekleyerek ve ardından aslında yoktur @Configurable

3

ile RepositoryManager açıklamalar ekleyerek bu, düzeltmek de Bahar olan bir JVM singleton olabilir -yönetilen. senin tekil Şimdi

<bean class="com.mypackage.MySingletonClass" factory-method="getInstance"/> 

: basitçe uygulama bağlamında aşağıdaki satırı ekleyerek

public final class MySingletonClass{ 
    private static MySingletonClass instance; 

    public static MySingletonClass getInstance(){ 
    if(instance==null){ 
     synchronized{ 
     if(instance==null){ 
      instance = new MySingletonClass(); 
     } 
     } 
    } 
    return instance; 
    } 

    @Autowired 
    private SomeSpringBean bean; 

    // other singleton methods omitted 
} 

Bu singleton yönetmek için Bahar zorlayabilirsiniz: Eğer böyle bir autowired fasulye ile saf java singleton olduğunu varsayalım otomatik olarak SomeSpringBean örneğine sahip olacaktır (bağlamda mevcutsa). Dahası, bu, Spring singleton çekirdekleri ile tipik JVM singletonları olmayan tipik problemler için bir 'düzeltme' dir, çünkü bunlar ilkbaharda örneklendikleri için. Yukarıdaki deseni kullanmak, JVM level singleton'u, yani, compiler zorlanmış singleton'u, kapsayıcı singleton ile birlikte zorlar.