No blog anterior, introduzimos o uso da tentativa da primavera. Este artigo demonstra o princípio da implementação da tentativa da primavera por meio de um exemplo simples. As anotações definidas no exemplo contêm apenas o número de atributos de repetição. De fato, as anotações na repetição da primavera podem definir mais atributos. Para explicar o princípio, é mais simples. Para a repetição da primavera, você pode verificar documentos e blogs relevantes.
Definição de anotação
Réstio de pacotes.annotation; importar java.lang.annotation.*;/*** Criado por Jack.wu em 2016/9/30. */@Target (ElementType.method) @retention (retentionPolicy.Runtime) @DocumentEdPublic @Interface
Implementação do agente
Usando o CGLIB como uma ferramenta de proxy, primeiro escreva uma implementação de retorno de chamada, que também é a lógica principal da implementação da tentativa.
RETY.INTERCETOR DE PACOTO; importação net.sf.cglib.proxy.methodinterceptor; importação net.sf.cglib.proxy.methodProxy; importar a tentativa.annotation.retryable; importar java.lang.reflect.method;/** ** ** criado por jack.wu em 2016/9/930. */public class AnoTationAWARERETRAPRATIONSINTECTORTE IPLEMENTES METHODINTERCECTOR {// Registre o número de tentativas privadas int times = 0; @Override Public Object Intercept (Object OBJ, método do método, objeto [] args, MethodProxy Proxy) lança arremesso {// Obtenha anotação de repetível no método interceptado if (repetível == null) {return proxy.invokesuper (obj, args); } else {// com anotação de repetível, adicione a exceção de repetição de repetição int maxattemps = repetível.maxattemps (); tente {return proxy.invokesuper (obj, args); } catch (throwable e) {if (times ++ == maxattemps) {system.out.println ("máximo de tentativas foram alcançadas:" + maxattemps + ", não há mais tentativa!"); } else {System.out.println ("Call" + Method.getName () + "Exceção do método, Start" + Times + "Remover ..."); // Observe que este não é o método Invokesuper, o Invokesuper sairá do atual Proxy de processamento interceptador.invoke (obj, args); }}} retornar nulo; }}Em seguida, escreva uma aula de proxy e use AnnoTationAWARERETRIATRAPATIONSINTECTORDO como um interceptador
Réstio de pacote.core; importação net.sf.cglib.proxy.enhancer; importar a tentativa.interceptor.annotationAWARERETRYOPERATIONSInterceptor;/*** Criado por Jack.wu em 2016/9/30. */public class springretRetReproxy {public object newproxyInstance (objeto destino) {intensificador intensificador = new aprimor (); intensancer.SetSuperclass (Target.getClass ()); intensancer.setCallback (novo anotaçãowarretionoperationsIntercept ()); return aprimor.create (); }}teste
Teste o código acima através de um método de negócios relacionado ao usuário
Definição da interface:
Facade de pacote;/*** Criado por Jack.wu em 2016/9/26. */interface pública userfacade {void add () lança exceção; Void query () lança exceção;}Implementação da interface: pacote fachada.impl;
importar fachade.userfacade; importar tentativa.annotation.retryable;/*** Criado por Jack.wu em 2016/9/26. */public class UserfacadeImpl implementa o userfacade {@Override public void add () lança a exceção {System.out.println ("Add User ..."); lançar novo RuntimeTeException (); } @Override @retryable (maxattemps = 3) public void query () {System.out.println ("Usuário da Query ..."); lançar novo RuntimeTeException (); }}teste:
classe pública Main {public static void main (string [] args) lança exceção {userfacadeImpl user = new userfacadeImpl (); // Teste de proxy de primavera Springrety primavera springproxy springretryproxy = new springretryproxy (); Userfacade u = (userfacade) springretryproxy.newproxyInstance (usuário); //u.add(); O método ADD não adiciona anotações de repetição, o programa termina de forma anormal, o método de consulta adiciona anotações de repetição, define novamente 3 vezes e o efeito de corrida é o seguinte
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.