web-dev-qa-db-ja.com

Springは抽象クラス内で自動配線できますか?

Springはオブジェクトの自動配線に失敗しますか?抽象クラス内でオブジェクトを自動配線することは可能ですか?すべてのスキーマがapplication-context.xmlで提供されると仮定します

質問:基本クラスおよび拡張クラス(存在する場合)@Service @Componentにはどのような注釈を付ける必要がありますか?

abstract class SuperMan {

    @Autowire
    private DatabaseService databaseService;

    abstract void Fly();

    protected void doSuperPowerAction(Thing thing) {

        //busy code

        databaseService.save(thing);

    }
}

拡張クラス

public class SuperGirl extends SuperMan {

    @Override
    public void Fly() {
        //busy code
    }

    public doSomethingSuperGirlDoes() {

        //busy code

        doSuperPowerAction(thing)

    }

application-context.xml

<context:component-scan base-package="com.baseLocation" />
<context:annotation-config/>
54
stackoverflow

通常、抽象クラスがコンポーネントスキャン用に提供されたベースパッケージにある限り、Springは自動配線を行う必要があります。

詳細については、 this および this を参照してください。

@Service@Componentはどちらも、Springコンテナ内に注釈付きのタイプのBeanを作成するステレオタイプです。 Spring Docsの状態として、

この注釈は、@ Componentの特殊化として機能し、クラスパススキャンを通じて実装クラスを自動検出できるようにします。

30
Andrei Nicusan

私はそのような種類のスプリングのセットアップが機能しています

自動配線フィールドを持つ抽象クラス

public abstract class AbstractJobRoute extends RouteBuilder {

    @Autowired
    private GlobalSettingsService settingsService;

@Componentアノテーションで定義されたいくつかの子。

36
Frederic Close

SuperGirlでデータベース操作が必要な場合は、SuperGirlに再度挿入します。

主なアイデアは、異なるクラスで同じオブジェクト参照を使用することだと思います。これはどうですか:

//There is no annotation about Spring in the abstract part.
abstract class SuperMan {


    private final DatabaseService databaseService;

    public SuperMan(DatabaseService databaseService) {
     this.databaseService = databaseService;
    }

    abstract void Fly();

    protected void doSuperPowerAction(Thing thing) {

        //busy code

        databaseService.save(thing);

    }
}

@Component
public class SuperGirl extends SuperMan {

private final DatabaseService databaseService;

@Autowired
public SuperGirl (DatabaseService databaseService) {
     super(databaseService);
     this.databaseService = databaseService;
    }

@Override
public void Fly() {
    //busy code
}

public doSomethingSuperGirlDoes() {

    //busy code

    doSuperPowerAction(thing)

}

私の意見では、一度注入してどこでも実行:)

0

私の場合、Spring4アプリケーション内では、古典的な抽象ファクトリーパターンを使用しなければなりませんでした(そのためのアイデアは- http://Java-design-patterns.com/patterns/abstract-factory/ )実行する操作があるたびにインスタンスを作成するため、私のコードは次のように設計されました:

public abstract class EO {
    @Autowired
    protected SmsNotificationService smsNotificationService;
    @Autowired
    protected SendEmailService sendEmailService;
    ...
    protected abstract void executeOperation(GenericMessage gMessage);
}

public final class OperationsExecutor {
    public enum OperationsType {
        ENROLL, CAMPAIGN
    }

    private OperationsExecutor() {
    }

    public static Object delegateOperation(OperationsType type, Object obj) 
    {
        switch(type) {
            case ENROLL:
                if (obj == null) {
                    return new EnrollOperation();
                }
                return EnrollOperation.validateRequestParams(obj);
            case CAMPAIGN:
                if (obj == null) {
                    return new CampaignOperation();
                }
                return CampaignOperation.validateRequestParams(obj);
            default:
                throw new IllegalArgumentException("OperationsType not supported.");
        }
    }
}

@Configurable(dependencyCheck = true)
public class CampaignOperation extends EO {
    @Override
    public void executeOperation(GenericMessage genericMessage) {
        LOGGER.info("This is CAMPAIGN Operation: " + genericMessage);
    }
}

最初に抽象クラスに依存関係を注入するために、@ Component、@ Serviceなどのすべてのステレオタイプアノテーションを試しましたが、Springコンテキストファイルにはパッケージ全体のComponentScanningがありましたが、CampaignOperationなどのサブクラスのインスタンスを作成している間、スーパー抽象クラスEOはSpringは依存関係を認識して注入することができないため、プロパティにnullがあります。多くの試行錯誤の後、私はこの**@Configurable(dependencyCheck = true)**アノテーションを使用し、最後にSpringは依存関係を注入でき、サブクラスでプロパティを使用できましたプロパティを多くしすぎないようにします。

<context:annotation-config />
<context:component-scan base-package="com.xyz" />

私は解決策を見つけるためにこれらの他の参考文献も試しました:

  1. http://www.captaindebug.com/2011/06/implementing-springs-factorybean.html#.WqF5pJPwaAN
  2. http://forum.spring.io/forum/spring-projects/container/46815-problem-with-autowired-in-abstract-class
  3. https://github.com/cavallefano/Abstract-Factory-Pattern-Spring-Annotation
  4. http://www.jcombat.com/spring/factory-implementation-using-servicelocatorfactorybean-in-spring
  5. https://www.madbit.org/blog/programming/1074/1074/#sthash.XEJXdIR5.dpbs
  6. Springフレームワークで抽象ファクトリーを使用
  7. Spring Autowiringは抽象クラスでは機能しません
  8. 抽象スーパークラスにスプリング依存関係を挿入
  9. 春と抽象クラス-抽象クラスにプロパティを注入する
    1. 抽象クラ​​スで定義された春の自動配線の依存関係

**@Configurable(dependencyCheck = true)**を使用してこの投稿を更新してみてください。問題が発生した場合は、お気軽にお問い合わせください。

0
user1295235