Existem muitos iniciantes em Java que não sabem muito sobre o Inteceptor Mybatis Interceptor. Aqui vou organizar o próximo artigo para você explicar o Inteceptor Mybatis Interceptor em Java.
Este artigo analisa principalmente o mecanismo de plug-in da Mybatis, que é na verdade a implementação do modelo de modelo de responsabilidade do proxy dinâmico Java.
De acordo com a documentação oficial. Mybatis permite apenas interceptar os seguintes métodos, que determina os parâmetros de assinatura da anotação interceptora.
O código é o seguinte
Executor (atualização, consulta, flushstatements, commit, reversão, getTransaction, feche, isclose) parameterHandler (getParameterObject, setParameters) Resultados (HandleResultSets, manuseartutParameters) DeclarationHandler (preparar, parametrize, lotes, atualizar, consulta)
O código -fonte do processamento interceptador é o seguinte, onde interceptchain.pluginall (..) é uma tecelagem de interceptores personalizados:
O código é o seguinte
/ * Método em org.apache.ibatis.session.configuration class */public ParameterHandler NewParameterHandler (MappedStatement MappEdStatement, Object ParameterObject, BoundSql BoundSql) {ParameterHandler parametHandler = mappStatement.getLang (). /* Intercept ParameterHandler*/ parameterHandler = (parameterHandler) interceptorchain.pluginall (parameterHandler); return parameterHandler;}public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler, ResultHandler resultHandler, BoundSql boundSql) { ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, ResultHandler, Boundsql, Rowbounds); /* Intercept ResultsetHandler*/ Resultados e (Resultados e) interceptorchain.pluginall (Resultados e); Retorno Resultados dondler;} Public DeclarationHandler NewStatementHandler (Executor Executor, MappEdStatement MappEdStatement, Objeto ParameterObject, RowBounds RowBounds, ResultHandler ResutorTHandler, Boundsql Boundsql) {DeclarationHandHandler = RoutingStateMementMementMementMemEndler, MAPPEDSPEDSPEDSTSQL) {DeclarationHandler = RoutingStemementMement (Recorrer, MAPPEDSQL) { Boundsql); /* Intercept DeclarationHandler*/ DeclarationHandler = (DeclarationHandler) InterceptChain.pluginall (DeclarationHandler); Return DeclarationHandler;} Executor público NewExecutor (transação de transação, ExecutyType ExecutyType) {ExecutyType = ExecutyType == NULL? defaultExecutyType: ExecutOnType; executOrtype = ExecutOnType == NULL? Executortype.simple: ExecutOnType; Executor executor; if (ExecutOnType.Batch == ExecutyType) {Executor = new BatchExecutor (esta, transação); } else if (executOrtype.reuse == ExecutyType) {executor = new Reuseexecutor (esta, transação); } else {executor = new SimpleExector (esta, transação); } if (Cacheenabled) {executor = new CachingExecutor (executor); } /* Intercept Executor* / Executor = (Executor) InterceptChain.pluginall (Executor); Retornar executor;} Para implementar um interceptador personalizado, você só precisa implementar a interface interceptores. O código geral é o seguinte:
O código é o seguinte
/* O método e os parâmetros da anotação que indicam qual interface para interceptar*/ @intercepts ({@signature (type = declarationHandler.class, métodos = "preparar", args = {conexão.cllass})}) publicle a classe de interceptorning). / * NOTA: Aqui, o método Invocation.Proced () é realmente usado para concluir a chamada de travessia da cadeia interceptorchain (ou seja, para executar todos os métodos de interceptação registrados do interceptor) e para o método original chamado do objeto de proxy final */ retorno invocação.proeced (); } / * Gere um proxy para o destino de destino, e a anotação de @Intercepts é usada no plugin.wrap * / @Override Public Plugin de objeto (destino do objeto) { / * Quando a classe de destino é do tipo DeclarationHandler, a classe de destino é embrulhada e nenhum proxy sem sentido é usado * / return (instanceOf InstanceHandler)? } /* Usado para definir parâmetros de configuração de interceptor personalizado* / @Override public void setProperties (Propriedades Propriedades) {}} Entre eles, o código para interceptar chamadas está no plugin.wrap:
O código é o seguinte
/* org.apache.ibatis.plugin.plugin class*/public class Plugin implementa o InvocationHandler {/* omita o código ...*/Public Static Object Wrap (destino do objeto, interceptador interceptor) {/* aqui é obter a assinatura da anotação do interceptor*/map <?>, set <método >> Classe <?> Type = Target.getClass (); /* Obtenha a interface correspondente à classe de destino*/ classe <?> [] Interfaces = getAllInterfaces (tipo, signotemap); if (interfaces.length> 0) { /* use o proxy dinâmico JDK* / return proxy.newproxyInstance (type.getclassloader (), interfaces, novo plugin (destino, interceptor, signotemap)); } retornar o destino; } /* A execução de todos os métodos da classe de destino de interceptação será executada aqui* / @Override Public Object Invoke (Proxy de objeto, método do método, objeto [] args) lança arremesso {try {Set <odhod> methods = signatureMap.get (métod.getDecLaringClass ()); if (métodos! = null && methods.contains (método)) { /* execute o método interceptador* / retorna intercept.Intercept (nova invocação (destino, método, args)); } retornar métod.invoke (Target, args); } catch (Exceção e) {tiro excepcionutil.unwraphrowable (e); }} / * Omitir o código ... * /}Você pode ver que o código principal do design do interceptador Mybatis é relativamente simples, mas é flexível o suficiente. Ao usá -lo na prática, tenha cuidado para não ter um proxy sem sentido (plugin.wrap).