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/>
私はそのような種類のスプリングのセットアップが機能しています
自動配線フィールドを持つ抽象クラス
public abstract class AbstractJobRoute extends RouteBuilder {
@Autowired
private GlobalSettingsService settingsService;
@Component
アノテーションで定義されたいくつかの子。
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)
}
私の意見では、一度注入してどこでも実行:)
私の場合、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" />
私は解決策を見つけるためにこれらの他の参考文献も試しました:
**@Configurable(dependencyCheck = true)**
を使用してこの投稿を更新してみてください。問題が発生した場合は、お気軽にお問い合わせください。