Em alguns projetos Java, MapperScannerConfigurer é usado na integração de mybatis e spring. Esta classe gera automaticamente classes de proxy dinâmico baseadas em interface por meio de proxy reverso.
Diante disso, este artigo analisa brevemente o proxy dinâmico do Java.
Este artigo usa um proxy dinâmico para simular um interceptor que lida com transações.
interface:
interface pública UserService { public void addUser(); public void removeUser();}Classe de implementação:
public class UserServiceImpl implementa UserService { public void addUser() { System.out.println("adicionar usuário"); public void removeUser() { System.out.println("remove user" } public void searchUser() { System.out.println("pesquisar usuário");Existem duas maneiras de implementar o proxy dinâmico java
1. O proxy dinâmico que vem com o jdk
Para usar o proxy dinâmico que vem com o jdk, você precisa entender a interface InvocationHandler e a classe Proxy. Ambas estão no pacote java.lang.reflect.
Introdução ao InvocationHandler:
InvocationHandler é a interface implementada pelo manipulador de invocação da instância do proxy.
Cada instância de proxy possui um InvocationHandler associado. Ao chamar um método em uma instância de proxy, esse método chama o método de invocação do InvocationHandler.
Introdução ao proxy:
O proxy fornece métodos estáticos para criar classes e instâncias de proxy dinâmico.
Exemplo (simulando processamento de transação AOP):
public class TransactionInterceptor implements InvocationHandler { private Object target; public void setTarget(Object target) { this.target = target } @Override public Object activate(Object proxy, Method method, Object[] args) throwable { System.out.println ("iniciar transação"); método.invoke(target, args); System.out.println("finalizar transação");Código de teste:
classe pública TestDynamicProxy { @Test public void testJDK() { TransactionInterceptor transactionInterceptor = new TransactionInterceptor userService = new UserServiceImpl(); .getClassLoader(), userService.getClass().getInterfaces(), transactionInterceptor);Resultados do teste:
iniciar transação adicionar usuário finalizar transação
Obviamente, quando fazemos uma chamada de método através da classe proxy userServiceProxy, a transação será aberta e fechada antes e depois da chamada do método.
2. Biblioteca de terceiros cglib
CGLIB é uma biblioteca de geração de código poderosa, de alto desempenho e alta qualidade para estender classes Java e implementar interfaces Java em tempo de execução.
A maior diferença entre ele e o proxy dinâmico do JDK é:
O proxy dinâmico JDK é para interfaces, enquanto cglib implementa proxy para classes. O princípio do cglib é gerar uma subclasse para a classe de destino especificada e substituir os métodos para obter aprimoramento. procurador.
O código de exemplo é o seguinte:
classe pública UserServiceCallBack implementa MethodInterceptor { @Override public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throwable { System.out.println("iniciar transação por cglib"); ); System.out.println("finalizar transação por cglib");Código de teste:
public class TestDynamicProxy { @Test public void testCGLIB() { Enhancer Enhancer = new Enhancer.setSuperclass(UserServiceImpl.class)(new UserServiceImpl proxy = (UserServiceImpl)enhancer.create()); ;proxy.addUsuário();Resultados do teste:
iniciar transação por cglibadd userend transação por cglib
Os leitores interessados podem realmente testar os exemplos deste artigo, e acredito que eles ganharão muito.