5

SpringJava構成に次のBeanがあります。

@Bean
@Scope( proxyMode=ScopedProxyMode.TARGET_CLASS, value=SpringScopes.DESKTOP )
public BirtSession birtSession() {
    return new BirtSession();
}

テストには、スコープのないモックが必要です(テストには「デスクトップ」スコープはありません)。しかし、上記の構成をインポートし、以下を含むテスト用の構成を作成すると、次のようになります。

@Bean
public BirtSession birtSession() {
    return new MockSession();
}

「デスクトップ」スコープのモックビーンを取得します:-(

@ScopeSpringにアノテーションを「忘れる」にはどうすればよいですか?

PS:@Importコピー&ペーストを使用しない場合は機能しますが、使用したくありません。

4

2 に答える 2

1

問題は、静的メソッドを使用してスコープ Bean 定義を作成することにConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod()あるScopedProxyCreator.createScopedProxy()ようです。

// replace the original bean definition with the target one, if necessary
        BeanDefinition beanDefToRegister = beanDef;
        if (proxyMode != ScopedProxyMode.NO) {
            BeanDefinitionHolder proxyDef = ScopedProxyCreator.createScopedProxy(
                    new BeanDefinitionHolder(beanDef, beanName), this.registry, proxyMode == ScopedProxyMode.TARGET_CLASS);
            beanDefToRegister = proxyDef.getBeanDefinition();
    }

は、スコープ指定されたプロキシ Bean 定義の代わりにBeanDefinitionHoldera を返すため(つまり、 )、別の Java 構成クラスによってオーバーライドすることはできません。RootBeanDefinitionConfiguratioClassBeanDenitionScopedProxyFactoryBean

回避策として、xml 構成ファイルでオーバーライドするスコープ Bean を宣言し、それをインポートすることが考えられます。@ImportResource.

于 2013-02-05T17:10:56.043 に答える
0

問題は、Spring がアノテーションを保持することではありません。問題は、Spring が最初に「生産的な」構成を解析しようとし、そのためにスコープが使用可能かどうかを確認することです。Spring は熱心にスコープをチェックします。したがって、2番目/オーバーライドするBean定義には到達しません。

ダミー スコープを作成します。

import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.ObjectFactory;

public class MockSpringScope implements org.springframework.beans.factory.config.Scope {

    private Map<String, Object> objects = new HashMap<String, Object>();

    @Override
    public Object get( String name, ObjectFactory<?> objectFactory ) {
        Object result = objects.get( name );
        if( null == result ) {
            result = objectFactory.getObject();
            objects.put( name, result );
        }
        return result;
    }

    @Override
    public Object remove( String name ) {
        return objects.remove( name );
    }

    @Override
    public void registerDestructionCallback( String name, Runnable callback ) {
        // NOP
    }

    @Override
    public Object resolveContextualObject( String key ) {
        // NOP
        return null;
    }

    @Override
    public String getConversationId() {
        // NOP
        return null;
    }

}

それを「デスクトップ」スコープとして登録します。これにより、Spring は本番構成を正常に解析できるようになります。

于 2013-02-05T08:27:53.510 に答える