이 섹션의 핵심 사항 :
자바 정적 프록시
JDK 동적 에이전트
1 객체 지향 디자인 아이디어에서 발생하는 1 가지 문제
전통적인 OOP 프로그래밍에서 객체는 핵심이며 객체 간의 협업을 통해 완전한 소프트웨어 기능이 형성됩니다. 객체를 상속받을 수 있으므로 동일한 함수 또는 동일한 특성을 가진 속성을 명확하게 계층 적 클래스 구조 시스템으로 추상화 할 수 있습니다. 소프트웨어 사양의 지속적인 확장으로 인해 더 전문적인 노동 부서가 점점 더 많은 시리즈가되고 있으며 OOP 응용 사례의 수가 증가함에 따라 OOP가 잘 해결할 수없는 몇 가지 문제가 노출되었습니다.
이제 시스템에는 완전히 유사한 세 가지 코드가 있다고 가정합니다.이 코드는 일반적으로 "복사"및 "페이스트"에 의해 완료됩니다. 이러한 방식으로 개발 된 소프트웨어는 그림에 나와 있습니다.
독자들은이 접근법의 결점을 발견했을 것입니다. 언젠가 파란색 배경이있는 코드를 수정 해야하는 경우 동시에 세 곳을 수정해야합니까? 이 세 곳뿐만 아니라이 코드뿐만 아니라 100 개 또는 1,000 장소가 포함되어 있다면 결과는 무엇입니까?
로깅은 코드의 모든 곳에 있습니다. 먼저 예를 살펴보십시오.
응용 프로그램의 작동을 추적하려면 많은 방법이 로깅 정보가 필요합니다. 우리는 보통 이것을 씁니다.
// log4J import org.apache.log4j.logger; public class person {private logger = logger.getLogger (person.class); public void sleep () {logger.info ( " + new date ()); System.out.println ("stewfer ");" + new ehlate.println ( "wepting"); date ());} public void eating () {logger.info ( "실행 시간 시작 :" + new date ()); 날짜 () "); System.out.println ("인큐베이션 "); logger.info (" "실행 종료 시간 :" + new date () ";}}질문 : 단점은 무엇입니까?
l 비즈니스 방법 자체의 책임을 혼란스럽게합니다
유지 보수 워크로드는 엄청납니다
2 해결책 1
정적 프록시 :
1. 핵심 클래스 (프록시 클래스)의 클래스와 어떤 방법이 있는지 알아야합니다.
2. 비 코어 코드를 여러 번 반복해야하므로 코드 구조가 부풀어 오르고 코드 중복성을 생성합니다.
3. 비 코어 클래스 (프록시 클래스) 핵심 클래스 (프록시 클래스)에서 구현 한 인터페이스를 구현해야합니다. 즉, 공통 인터페이스를 구현해야하지만 핵심 클래스 (프록시 클래스)에서 구현 한 인터페이스가 우선합니다.
L의 목적은 비즈니스 코드를 로그 코드와 완전히 분리하고 느슨한 커플 링을 달성하는 것입니다.
l 프록시 오브젝트와 프록시 객체는 동일한 인터페이스를 구현하고 프록시 오브젝트에 로그를 맞추기위한 관련 서비스를 구현하고 필요할 때 프록시 오브젝트를 호출해야하지만 프록시 객체는 비즈니스 코드 만 유지해야합니다.
정적 프록시 구현
1) 인터페이스 정의 :
Public Interface iPerson {public Abstract void sleep (); Public Abstract void eating ();}2) 프록시 클래스
공개 계급 사람이 Iperson을 구현 {public void sleep () {System.out.println ( "sleeping");} public void eating () {System.out.println ( "식사");}}3) 에이전트 클래스
import org.apache.log4j.logger; 공개 클래스 인 Personproxy는 iPerson {private iperson person; private iperson person; private logger = logger.getLogger (personProxy.class); public personproxy (iPerson person) {person;} public void eating () {logger.info ( " + new + new date () "); person.eating (); logger.info (" "실행 종료 시간 :" + new date () ";} public void sleep () {logger.info ("시작 실행 시간 : " + new date ()"; person.sleep (); logger.info ( " + new date ()";}}4) 테스트 클래스
package com.aptech.aop2; public class persontest {public static void main (String [] args) {iPerson proxy = new PersonProxy (new person ()); proxy.eating (); proxy.sleep ();}}정적 프록시의 단점 :
프록시 인터페이스는 한 유형의 객체 만 제공 할 수 있습니다. 약간 더 큰 프로젝트에 적합하지 않습니다.
3 솔루션 2- 동적 제제
InvocationHandler : 각 동적 프록시 클래스는 invocialhandler 인터페이스를 구현해야하며 프록시 클래스의 각 인스턴스는 핸들러와 관련됩니다. 프록시 오브젝트를 통해 메소드를 호출하면이 메소드의 호출이 호출을 위해 InvocationHandler 인터페이스의 호출 메소드로 전달됩니다.
JDK1.3 후, 개발을 지원할 수있는 동적 프록시 함수가 추가되었습니다. 특정 객체 및 방법에 대해 특정 프록시 객체를 작성할 필요가 없습니다. 동적 프록시를 사용하면 핸들러가 각 객체를 제공 할 수 있습니다.
프로세서의 클래스 디자인은 java.lang.reflect.invocationHandler 인터페이스를 구현해야합니다.
InvocationHandler 인터페이스를 통해 구현 된 동적 프록시는 인터페이스의 구현 클래스 만 프록시 할 수 있습니다.
동적 프록시 구현
1) 핸들러
공개 클래스 DynaproxyHandler는 invocationHandler {private logger = logger = logger.getLogger (DynapRoxyHandler.class); 개인 객체 대상; // 프록시 객체 public void settarget (객체 대상) {this.target = target;} public object invoke (객체 프록시, 메소드, 오브젝트 [] arggs) { "wrows.info.info.info. date ()); 객체 결과 = method.invoke (target, args); logger.info ( "실행 종료 시간 :" + new date ()); return result; // return method execution result}}2) 생산 에이전트 공장
import java.lang.reflect.proxy; public class dynaproxyfactory {// obj는 프록시 객체 Public Static Object getProxy (Object obj) {dynaproxyhandler handler = new DynaproxyHandler (); handler.settarget (obj); return proxy.newproxyinstance (obj.getclass) obj.getClass (). getInterfaces (), handler);}}3) 테스트 클래스
Public Class PersonTest {public static void main (String [] args) {iPerson person = (iPerson) DynapRoxyFactory.getProxy (new Person ()); // 프록시 클래스를 반환하면 프록시 클래스는 JVM에 의해 동적으로 생성됩니다. 이 클래스는 들어오는 인터페이스 array.person.eating (); person.sleep ();}}의 모든 인터페이스 (모든 방법)를 구현합니다.요약
위는이 기사에서 스프링 정적 프록시 및 동적 프록시 코드에 대한 자세한 설명입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구들은이 사이트를 계속 참조 할 수 있습니다.
스프링의 일반적인 구성 및 분석 클래스 설명
SpringMVC 인터셉터는 단일 사인온을 구현합니다
SpringMVC 간단한 로그인 예제의 Java 프로그래밍 구현
단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!