10

リポジトリを管理するリポジトリ マネージャーがいます。プロパティをインスタンス化する @Autowired がありますが、それらは常に null です。Bean は xml で正しく構成されています。何か理由は?

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>

ユーザーリポジトリ.java

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

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

4 に答える 4

22

私はちょうどこれに遭遇しました。問題は、あなたがするときです

new RepositoryManager();

Instance() では、Spring を使用して RepositoryManager を作成していないため、インスタンスに対して依存関係の注入が行われていません (自動配線なし)。

解決策は、Instance() シングルトン パターンを廃止することです。シングルトンを主張したい場合は、これを行います

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

次に、リポジトリマネージャーが必要な場所で、それへの参照で自動配線するだけです (呼び出し元の Bean も Spring によって管理されていると仮定します!)

@Autowired
private RepositoryManager repositoryManager = null;
于 2011-09-29T21:00:13.827 に答える
5

実際には、ケーキを持って食べるための非常にエレガントな方法があります。つまり、Spring で管理される JVM シングルトンを使用することです。次のような自動配線された Bean を持つ純粋な Java シングルトンがあるとします。

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
}

アプリケーションコンテキストに次の行を追加するだけで、Spring にこのシングルトンを強制的に管理させることができます。

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

SomeSpringBeanこれで、シングルトンにautowiredのインスタンスが追加されます (コンテキストで利用可能な場合)。

さらに、これは、Spring によってインスタンス化されるため、真の JVM シングルトンではない Spring シングルトン Bean の典型的な問題の「修正」です。上記のパターンを使用すると、JVM レベルのシングルトン (つまり、コンパイラが強制するシングルトン) とコンテナーのシングルトンが強制されます。

于 2013-09-20T19:02:12.473 に答える
5

構成に次のものが含まれていることを確認してください。

<context:annotation-config />

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

持っている場合は、構成xmlを投稿してください

于 2011-02-15T22:32:57.013 に答える
0

これが起こっている理由は、静的メソッドのためですInstance()

春のコンテキストの外でPOJOを作成しています。

<context:spring-configured />構成に追加してから注釈RepositoryManagerを付けることで、これを修正できます@Configurable

于 2012-06-05T10:12:18.047 に答える