3

スタンドアロンのSpring3.1アプリケーションでは、ビジネスロジックをMonitoringSwingViewから厳密に分割しました。ビューは、インターフェースを実装することによってその情報を取得しEventListenerます。

UIを無効にするには、UI Beanのすべてを「削除」して、@ServicesこのEventListnerを実装するUIクラスがビジネスロジックによって挿入されないようにするだけで十分です。

しかし、これを行う方法は?

この例は、クラスの小さなOerviewを示しています。

@Service
public class UI extends JFrame implements EventListener {
    @PostConstruct
    public void setup() {
        // Do all the Swing stuff
        setVisible(true);
    }

    @Override
    public void onBusinessLogicUpdate(final State state) {
        // Show the state on the ui
    }
}

@Service
public class Businesslogic {
    @Autowired
    public List<EventListener>  eventListeners;

    public void startCalculation() {

        do {
            // calculate ...
            for (final EventListener listener : this.eventListeners) {
                eventlistener.onBusinessLogicUpdate(currentState);
            }
        }
        while(/* do some times */);
    }
}

public class Starter {
    public static void main(final String[] args) {
        final ApplicationContext context = // ...;

        if(uiShouldBedisabled(args)) {
            // remove the UI Service Bean
        }

        context.getBean(Businesslogic.class).startCalculation();
    }
}
4

1 に答える 1

6

説明に基づいて、任意の時点ではなく、起動時にこれらのBeanを無効にします。これははるかに困難です。

@Profile

最も簡単なアプローチは、Spring@Profile(3.1以降で使用可能)を使用して、Beanを選択的に有効または無効にすることです

@Service
@Profile("gui")
public class UI extends JFrame implements EventListener

次に、使用するプロファイルをアプリケーションコンテキストに指示する必要があります。guiプロファイルがアクティブ化されている場合、 UIBeanが含まれます。そうでない場合-Springはそのクラスをスキップします。プロファイル名を変更するには、さまざまな方法があります。例:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
if(!uiShouldBedisabled(args)) {
    ctx.getEnvironment().setActiveProfiles("gui");
}
ctx.scan("com.example");
ctx.refresh();

別のJAR

アプリケーションを2つのJAR(ビジネスロジックとGUI)に分割します。GUIを起動したくない場合はgui.jar、CLASSPATHから削除するだけです(はい、これは実行時では不可能ですが、ビルド/デプロイ時に可能です)。

2つのapplicationContext.xmlファイル

アプリケーションがXMLで始まる場合は、とを作成applicationContext.xmlapplicationContext-gui.xmlます。明らかに、すべてのGUIBeanは後者に含まれています。それらを手動で指定する必要はありません。GUIBeanを別のパッケージに入れて、賢いものを追加するだけ<context:component-scan/>です。

于 2012-08-17T16:13:23.923 に答える