0

私はSpringアプリケーションを持っており、Vaadinを使用してWebUIを作成しています。そのために、私はSpringVaadinIntegrationツールを使用しています。

そこで、Vaadinクラスを拡張して、それらをカスタマイズして使用します。たとえば、プロトタイプであるメインのUIクラスがあります。(ユーザーが開いたブラウザウィンドウごとに新しいものをインスタンス化する必要があります。)

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class MainUI extends UI {

@Autowired
private GameMapView gameMapView;

@Override
protected void init(VaadinRequest request) {

        final VerticalLayout layout = new VerticalLayout();
        layout.setMargin(true);
        setContent(layout);

        gameMapView.configureGameMapView();
        layout.addComponent(gameMapView);
   }
}

これにより、プロトタイプコンポーネントでもあるGameMapViewがインポートされ、VerticalLayoutが拡張されます。次に、GameMapプロトタイプコンポーネントがあり、GridLayoutが拡張されます。

ここで、GameMapクラスを使用する場合、ディメンションと中央のタイルの位置を使用して構成する必要があります。(したがって、サイズと表示するタイルを設定できます。)また、データベースから適切なタイルを取得して表示するには、私のサービスの1つを使用する必要があります。

私がやりたいのは、これらをコンストラクターに渡すことです。次のようになります。

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class GameMap extends GridLayout {

    @Autowired
    private LandTileService lts;

    public GameMap(int dimension, int xcoor, int ycoor) {
        super();
        this.setWidth(80, Unit.PERCENTAGE);
        this.setHeight(80, Unit.PERCENTAGE);

//START configuration

        this.setRows(dimension);
        this.setColumns(dimension);

        [use the land tile service and coordinates etc.]
   //END configuration
    }
}

ただし、問題は、SpringBeanのコンストラクター内で自動配線されたSpringBeanを使用できないことと、自動配線されたSpringBeanでオーバーロードされたコンストラクターを使用できないことです。

現在、Springプロトタイプクラスを使用する前に一度呼び出すだけの構成メソッドを作成することでこの問題を回避していますが、それは不十分な解決策のようです。それについて行くより良い方法はありますか?x、y、zパラメータをSpring Componentゲームマップに渡してから、使用を開始する必要があることを強制できるようにしたいと思います。

4

2 に答える 2

2

ただし、問題は、SpringBeanのコンストラクター内で自動配線されたSpringBeanを使用できないことと、自動配線されたSpringBeanでオーバーロードされたコンストラクターを使用できないことです。

デフォルトでは、フィールドの自動配線はBeanの構築後に行われるため、コンストラクターでは使用できません。

ただし、Bean構成ファイルでコンストラクターの自動配線を指定することにより、コンストラクターの自動配線を使用できます。

<beans:beans xmlns="..."  default-autowire="constructor">
</beans:beans>

次に、コンストラクターからBeanを注入できます

@Service
public class FooService {
}

 

@Service
public class CowService {

   FooService fooService;

   //FooService will be injected when CowService bean is constructed
   public(FooService fooService) {
     this.fooService = fooService;
   }
}

現在、Springプロトタイプクラスを使用する前に一度呼び出すだけの構成メソッドを作成することでこの問題を回避していますが、それは不十分な解決策のようです。それについて行くより良い方法はありますか?

あなたの場合、私がすることは、ファクトリシングルトンクラス「GameMapFactory」を作成することです。必要な場所に注入できるBeanとして配置します。このクラスには、「createGameMap(intdimension、int xcoord、intycoord)」というメソッドがあります。

于 2013-02-12T01:42:11.017 に答える
0

プロパティが設定された後(存在する場合)にメソッドが一度実行されるようにトリガーする、実装できるインターフェース(または必要に応じてアノテーション)があります。

プロパティを@Requiredとしてマークすることもできます。。。コンストラクターインジェクションに関しては、あなたが直面している問題が正確にはわかりません。。。(Springを使用してからしばらく経ちました)。

これがAPIドキュメントです

于 2013-02-12T00:36:25.853 に答える