0

JavaFX 2 を使用するアプリケーションがあり、インターフェイスのすべてのメソッドで特定のコードが呼び出されるようにしたい:

public interface IControladorDialogoPrincipal extends IControladorDialogo{
    @FXML
    void abrirCaixa(ActionEvent e);

    @FXML
    void fecharCaixa(ActionEvent e);

    @FXML
    void novaPreVenda(ActionEvent evento);

    @FXML
    void mesclarPreVenda(ActionEvent evento);
}

これは、上記のインターフェースを実装するクラスの一部です。

public class ControladorDialogoPrincipal extends ControladorDialogoSubmeter implements IProcessamentoListener, IControladorDialogoPrincipal {

    @FXML
    private StackPane painelPrincipal;
    @FXML
    private BorderPane painelConteudo;
    @FXML
    private BorderPane painelProgresso;
    @Autowired
    private ControladorExecucaoTarefa controladorExecucaoTarefa;
    @Autowired
    private ControladorDialogoMensagem dialogoMensagem;
    @Autowired
    private RecuperadorBeanSpring recuperadorBean;

    @Override
    protected void configurarElementos() {
        stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            public void handle(WindowEvent e) {
                System.exit(0);
            }
        });
        stage.setWidth(800);
        stage.setHeight(600);
        painelProgresso.toBack();
        painelProgresso.setVisible(false);
    }
    .
    .
    .
}

すべての ControladorDialogo* の基本クラスは、次の抽象クラスです。

public abstract class ControladorDialogo implements IControladorDialogo {

    private URL modelo;
    protected Stage stage;
    protected String titulo = "";
    protected List<String> estilos = new ArrayList<String>();
    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public final void init() {
        try {
            stage = new Stage();
            definirTitulo(titulo);
            stage.setScene(carregarCena());
            stage.initModality(Modality.WINDOW_MODAL);
            configurarElementos();
        } catch (IOException e) {
            logger.error("Erro ao tentar carregar arquivo FXML: ", e);
        }
    }

    protected final Scene carregarCena() throws IOException {
        Parent root = (Parent) SpringFXMLLoader.load(modelo.openStream(), this);
        Scene cena = new Scene(root);
        cena.getStylesheets().addAll(estilos);
        return cena;
    }

    protected void configurarElementos() {
    }

    protected void definirTitulo(String titulo) {
        if (stage != null) {
            this.titulo = titulo;
            stage.setTitle(titulo);
        }
    }

    @Override
    public void abrir() {
        stage.show();
    }

    @Override
    public void fechar() {
        stage.close();
    }

    @Override
    public void setModelo(URL modelo) {
        this.modelo = modelo;
    }

    @Override
    public void setEstilos(List<String> estilos) {
        this.estilos = estilos;
    }
} 

aop の Spring の構成と ControladorDialogoPrincipal Bean のインスタンス化は次のとおりです。

<bean id="controladorDialogoPrincipal" class="com.hrgi.pdv.controladores.gui.dialogos.ControladorDialogoPrincipal"
      init-method="init">
    <property name="modelo" value="classpath:gui/dialogoPrincipal.fxml"/>
    <property name="estilos" ref="estilos"/>
</bean>

<util:list id="estilos" list-class="java.util.ArrayList">
    <value>/css/preVenda.css</value>
</util:list>

<aop:config>
    <aop:aspect ref="dataSource">
        <aop:pointcut id="todosOsMetodosIControladorDialogoPrincipal" expression="execution(* com.hrgi.pdv.controladores.gui.dialogos.IControladorDialogoPrincipal.*(..))"/>
        <aop:before method="travarConexao" pointcut-ref="todosOsMetodosIControladorDialogoPrincipal"/>
    </aop:aspect>
</aop:config>

このクラスのメソッド「travarConexao」を呼び出したい:

public class RoutingDataSource extends AbstractRoutingDataSource implements Runnable {
    .
    .
    .
    private void definirConexaoAtual() {
        if (conexaoTravada && conexaoAtual.equalsIgnoreCase("secundario"))
            return;
        DataSource principal = (DataSource) fontesDeDados.get("principal");
        if (verificarConexao(principal)) {
            synchronized (conexaoAtual) {
                conexaoAtual = "principal";
            }
        } else {
            synchronized (conexaoAtual) {
                conexaoAtual = "secundario";
            }
        }
    }

    private boolean verificarConexao(DataSource principal) {
        try {
            Connection conexao = principal.getConnection();
            Statement statement = conexao.createStatement();
            return statement.executeQuery("SELECT 1") != null;
        } catch (Exception e) {
            return false;
        }
    }

    public void travarConexao() {
        System.out.println("\n\ncalled!!\n\n");
        definirTravaDeConexao(true);
    }

    private void definirTravaDeConexao(Boolean trava) {
        synchronized (conexaoTravada) {
            conexaoTravada = trava;
        }
        definirConexaoAtual();
    }
    .
    .
    .
}

このメソッドが呼び出されない理由を誰かに説明してもらえますか?

4

2 に答える 2

1

問題は構成の悪さでした。私が試したポイントカットのどれも機能しなかったことに気付いた後 (最も単純なものでもありません)、純粋な Spring AOP から Spring を使用した AspectJ に変更しました。

<aop:aspectj-autoproxy/>
<context:spring-configured/>

<bean class="com.hrgi.pdv.InterceptadorTravamentoConexao" scope="prototype">
    <property name="routingDataSource" ref="dataSource"/>
</bean>

ポイントカットは、特定の新しいクラスの注釈に移動されました:

@Aspect
@Configurable
public class InterceptadorTravamentoConexao {

    private RoutingDataSource routingDataSource;

    @Before("execution(* com.hrgi.pdv.controladores.gui.dialogos.IControladorDialogoPrincipal.*(..))")
    public void travarConexao(){
        routingDataSource.travarConexao();
    }

    public void setRoutingDataSource(RoutingDataSource routingDataSource) {
        this.routingDataSource = routingDataSource;
    }
} 

maven で、aspectj-compiler の構成を追加しました。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.4</version>
    <configuration>
        <showWeaveInfo>true</showWeaveInfo>
        <source>1.7</source>
        <target>1.7</target>
        <Xlint>ignore</Xlint>
        <complianceLevel>1.7</complianceLevel>
        <encoding>UTF-8</encoding>
        <verbose>true</verbose>
        <aspectLibraries>
            <aspectLibrary>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
            </aspectLibrary>
        </aspectLibraries>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>test-compile</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjtools</artifactId>
            <version>1.7.3</version>
        </dependency>
    </dependencies>
</plugin>

今、それは働いています。

于 2013-11-14T21:49:26.937 に答える