我有USSE的JavaFX 2应用程序,我想确保一个特定的代码被称为一个接口的每一个方法:无法拦截切入点Spring AOP实现
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;
}
}
实现上述接口的类10
下面是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();
}
.
.
.
}
有人能解释我为什么这个方法永远不会被调用?
你可以在你的应用程序上下文或者spring配置文件中发布更多的信息以获得完整的感觉吗? –
Hi @DiegoJimeno,我在问题中添加了更多信息 – brevleq