我有一个使用 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;
}
}
这是 Spring 的 aop 配置和 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();
}
.
.
.
}
有人可以解释一下为什么永远不会调用此方法吗?