Pontos -chave desta seção:
Java estático proxy
JDK agente dinâmico
1 Problemas encontrados em idéias de design orientadas a objetos
Na programação tradicional de OOP, os objetos são núcleo e uma função de software completa é formada através da colaboração entre objetos. Como os objetos podem ser herdados, podemos abstrair atributos com as mesmas funções ou as mesmas características em um sistema de estrutura de classe claramente hierárquico. Com a expansão contínua das especificações de software, a divisão mais profissional do trabalho está se tornando cada vez mais séries, e o número crescente de práticas de aplicação de OOP também expôs alguns problemas que o OOP não pode resolver bem.
Agora, suponha que haja três peças de código completamente semelhantes no sistema, que geralmente são concluídas por "copiar" e "colar". O software desenvolvido dessa maneira é mostrado na figura:
Os leitores podem ter descoberto as deficiências dessa abordagem. Se um dia o código com um fundo azul precisar ser modificado, devemos modificar três lugares ao mesmo tempo? Se não apenas esses três lugares contêm esse código, mas 100, ou mesmo 1.000 lugares, quais serão as consequências?
O registro está em toda parte no código - primeiro veja um exemplo:
Para rastrear a operação de um aplicativo, muitos métodos exigem informações de registro. Normalmente escrevemos isso:
// Consulte o artigo "LOG4J INTRODUÇÃO" PARA LOG4J IMPRESSÃO ORG.APACHE.LOG4J.LOGGER; Public Class Person {private logger Logger = Logger.getLogger (Person.class); public void Sleep () {Logger.info ("Start Execution time:" New Date ()); DATE ());} public void coming () {Logger.info ("Iniciar o tempo de execução:" + new Date ()); DATE () "); System.out.println (" incubação "); Logger.info (" "Execução Termal Hora:" + new Date () ");}}Pergunta: Quais são as desvantagens?
l confunde as responsabilidades do próprio método de negócios
A carga de trabalho de manutenção é enorme
2 Solução 1
Proxy estático:
1. Você precisa saber qual classe a classe principal (classe proxy) é e quais métodos estão lá.
2. O código não essencial precisa ser repetido várias vezes, o que faz com que a estrutura do código pareça estar inchada e cria redundância de código.
3 Classes não-core (classes de proxy) precisam implementar interfaces implementadas pelas classes principais (classes proxy), ou seja, elas precisam implementar interfaces comuns, mas as interfaces implementadas pelas classes principais (classes proxy) devem prevalecer.
O objetivo de L é separar completamente o código comercial do código de log e obter um acoplamento solto.
O objeto proxy e o objeto proxy devem implementar a mesma interface, implementar serviços relacionados para registrar o objeto Proxy e chamar o objeto Proxy quando necessário, enquanto o objeto Proxy mantém apenas o código comercial.
Implementação de proxy estático
1) Defina a interface:
interface pública iPerson {public abstract void Sleep (); public abstrate void alear ();}2) Classe de proxy
public class Pessoa implementa IPerson {public void sleep () {System.out.println ("Sleeping");} public void alear () {System.out.println ("Comer");}}3) Classe de agente
importar org.apache.log4j.logger; classe pública PersonProxy implementa iperson {private iPerson; Date () "); pessoa.4) Classe de teste
pacote com.aptech.aop2; classe pública PersonTest {public static void main (string [] args) {iPerson proxy = new PersonProxy (new Person ()); proxy.eating (); proxy.sleep ();}}Desvantagens do proxy estático:
Uma interface proxy pode servir apenas um tipo de objeto. É simplesmente incompetente para projetos um pouco maiores.
3 Solução agente 2-dinâmico
InvocationHandler: Cada classe dinâmica de proxy deve implementar a interface InvocationHandler, e cada instância da classe proxy está associada a um manipulador. Quando chamamos um método através do objeto Proxy, a chamada deste método será encaminhada para o método Invocar a interface InvocationHandler para chamada.
Após o JDK1.3, foi adicionada uma função dinâmica de proxy que pode ajudar no desenvolvimento. Não há necessidade de escrever objetos de proxy específicos para objetos e métodos específicos. O uso de proxy dinâmico pode fazer com que um manipulador sirva cada objeto.
O design de classe de um processador deve implementar a interface java.lang.reflect.invocationhandler.
Proxy dinâmico implementado através da interface InvocationHandler pode proxy apenas a classe de implementação da interface.
Implementação dinâmica de proxy
1) Manipulador
public class DynaProxyHandler implementa a InvocationHandler {private logger logger = Logger.getLogger (dynaProxyHandler.class); destino de objeto privado; // proxy objeto public void Settarget (objeto alvo) {this.target = Target; Date ()); objeto resultado = method.invoke (Target, args); logger.info ("Execução Hora final:" + new Date ()); resultado de retorno; // Resultado da execução do método de retorno}}2) Fábrica para agente de produção
importar java.lang.reflect.proxy; public class dynaProxyFactory {// obj é o objeto proxy public static objeto getProxy (object obj) {dynaproxyhandler manipulador = new dynaProxyHandler (); handler.setTarget (objget); obj.getclass (). getInterfaces (), manipulador);}}3) Classe de teste
public class Pessotest {public static void main (string [] args) {iPerson Person = (iPerson) dynaProxyFactory.getProxy (new Person ()); // retorna a classe Proxy, a classe proxy é criada dinamicamente pela JVM na memória. Esta classe implementa todas as interfaces (todos os métodos) da entrada de interface.Resumir
O exposto acima é toda a explicação detalhada do proxy estático da primavera e do código dinâmico de proxy neste artigo. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a este site:
Configuração e análise de configuração comum Descrição da mola
Springmvc Interceptor implementa um único sinal
Implementação de programação Java de Springmvc Simple Login Exemplo
Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!