AOP에 관해서는이 일이 너무 강력하기 때문에 봄을 확실히 생각할 것입니다. 그러나 AOP는 프로그래밍 아이디어이며 Spring은 AOP의 구현 일뿐입니다.
첫째, 바이두 :
소프트웨어 산업에서 AOP는 측면 지향적 프로그래밍의 약어입니다. 즉, 런타임 동안 사전 컴파일 방법과 동적 에이전트를 통해 프로그램 기능의 통합 유지 보수를 구현하는 기술입니다. AOP는 OOP, 소프트웨어 개발의 뜨거운 주제, 스프링 프레임 워크의 중요한 부분 및 기능적 프로그래밍의 파생 패러다임의 연속입니다. 비즈니스 로직의 여러 부분을 AOP를 사용하여 분리하여 비즈니스 논리의 다양한 부분 간의 커플 링을 줄이고 프로그램의 재사용 성을 향상 시키며 개발 효율성을 향상시킬 수 있습니다.
오늘날 Java Native Proxy를 사용하여 간단한 AOP 기능을 구현합시다.
먼저 기본 반사 지식을 알아야합니다. 그렇지 않으면 혼란 스러울 수 있습니다.
더 이상 단어가없고 타이핑을 시작하십시오
먼저 간단한 인터페이스를 작성해 봅시다. 이름은 AnimalInterface이며 동물을 조절하는 몇 가지 기본 방법을 선언하는 데 사용됩니다.
이러한 방법에는 이름 설정, 이름, 부름 및 속성이 포함됩니다 (실제로 교육받지 않은 것에 대해 용서하십시오. 실제로 지상 또는 수생인지 수륙 양용인지를 얻는 것입니다).
package proxy.imp; public interface AnimalInterface {// 이름을 setname (문자열 이름); // 이름을 얻습니다. String getName (); // 호출 void says (); // 영구적 인 무효를 가져옵니다 getProperty ();}그런 다음이 인터페이스를 구현하고 Xiao Hei라는 개를 만듭니다.
Package Proxy; import proxy.imp.AnimalInterface; public class dogimp implements AnimalInterface {private String name = "Xiaohei"; public dogimp () {} @override public void setname (문자열 이름) {this.name = name; } @override public String getName () {return this.name; } @override public void says () {system.out.println ( "강아지 : 울 울 울 ......"); } @override public void getProperty () {System.out.println ( "강아지는 육지 동물이지만 수영 할 수 있습니다"); }} AOP와 같은 기능을 실현하려면 모두가 참을성이 없어야합니다 ...
먼저 Aophandle이라는 클래스를 만들어 InvocationHandler 인터페이스를 구현하겠습니다. 프록시 객체의 인터페이스가 객체와 다르기 때문에 호출을 반사 매개 변수로 사용할 수 없을 때이 프록시 메커니즘은 클래스 지향적이지 않고 인터페이스 지향적입니다. 프록시를 사용하면 무한 재귀가 발생합니다. 그런 다음 스택 오버플로가 있지만 여전히 한 번 성공적으로 반영 할 수 있습니다. 이것은 프록시 객체와 객체의 프록시가 다르다는 것을 보여줍니다. 그러나 프록시 매개 변수의 proxy.getClass ()를 통해 클래스 객체를 얻은 다음 프록시 클래스의 메소드와 매개 변수를 얻을 수 있습니다. 또한 주석 주입, 특정 방법 주입 및 속성 주입을위한 구현 방법을 제공합니다. 나중에 이것에 대해 이야기합시다.
패키지 프록시; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; public class aophandle 구현 invocationHandler {// 개인 개체 저장 o; public aophandle (object o) {this.o = o; } /***이 메소드는 자동으로 호출되며, Java Dynamic Proxy Mechanism*은 다음 매개 변수* @param 객체 프록시 대상 객체의 인터페이스에 전달됩니다.* @param 메소드 메소드* @param 객체 [] args 메소드 매개 변수*를 사용할 수 없을 때, 대상의 대상이 다릅니다. 이 프록시 메커니즘은 클래스 지향적이지 않은 인터페이스 지향 **/@override public object invoke (개체 프록시, 메소드 메소드, Object [] args) 던질 가능 {// 메소드 리턴 값 ret = null; // 인쇄 방법 이름 system.err.println ( "실행 메소드 :"+method.getName ()+"n 매개 변수 유형은 :"); // (클래스 유형 : method.getParameterTypes ()) system.err.println (type.getName ()); // 인쇄 반환 유형 system.err.println ( "반환 데이터 유형 :"+method.getReturnType (). getName ()); // 반사 통화 메소드 ret = method.invoke (o, args); // end system.err.println ( "메소드 실행 종료")을 선언합니다. // 반사 통화 메소드의 반환 값을 반환합니다. }}동적 프록시가 완성되었습니다 ... 그리고 우리의 동물은 ... 그리고 계속하자
패키지 프록시; import java.lang.reflect.proxy; public class AnimalFactory { /**** get object method* @param obj* @return* /private static 객체 getanimalbase (object obj) {// 프록시 객체 return prox.newproxyInstance (obj.getclass (), getclass (), getclass (). Aophandle (OBJ)); } / **** 객체 메소드 가져 오기* @param obj* @return* / @suppresswarnings ( "확인되지 않은") public static t getanimal (object obj) {return (t) getanimalbase (obj); } / **** 객체 메소드 가져 오기* @param classname* @return* / @suppresswarnings ( "확인되지 않은") public static t getanimal (String classname) {object obj = null; try {obj = getanimalbase (class.forname (className) .newinstance ()); } catch (예외 e) {e.printstacktrace (); } return (t) obj; } / **** 객체 메소드 가져 오기* @param clz* @return* / @suppresswarnings ( "확인되지 않은") public static t getanimal (class clz) {object obj = null; try {obj = getanimalbase (clz.newinstance ()); } catch (예외 e) {e.printstacktrace (); } return (t) obj; }} 마침내 끝입니다 ... 무엇이 빠졌습니까? 효과를보기 위해 여기로 오세요 ...
하하 ... 웨이터, 나는 봉사 할게 ... 오 ~ 아니, 그것은 테스트 범주 ... 하하 ///
패키지 프록시; import org.junit.test; import org.junit.runwith; import org.junit.runners.blockjunit4classrunner; import proxy.animalfactory; import proxy.imp.animalinterface; @runitface (blockjunit4classrunner.class) {@test aptest {@test aptest {@test publass apublass). {AnimalInterface dog = AnimalFactory.getanimal (dogimp.class); dog.say (); System.out.println ( "내 이름은"+dog.getName ()); dog.setName ( "ergouzi"); System.out.println ( "내 이름은"+dog.getName ()); }} 무엇? 결국 이것은 유용한 점이 무엇입니까? 이것이 트릭이 아닌가? 이 일을 포착, 사용은 무엇입니까 ...
어떤 종류의 AOP, 왜 AOP를 보지 않습니까? 어떻게 사용자 정의 방법을 입력 할 수 있습니까? 단지 syso 입력을하고 관객을 바보로 바보?….
좋아, 그럼, 주입 된 사용자 정의 방법을 구현하는 방법을 살펴 보겠습니다 ...
먼저 인터페이스를 추가하고 AOP 주입 인터페이스라고 부릅니다. 이름을 AopMethod로 지정하십시오
메소드 후 및 이전 메소드 생성, 객체 프록시, 메소드 메소드, Object [] args 매개 변수를받습니다.
예를 들어, 메소드를 실행하기 전에 클래스 상태를 기록하고 로그를 작성하십시오. XX 변수를 모니터링하십시오.
뇌를여십시오.
패키지 proxy.imp; import java.lang.reflect.method; public interface aopMethod {// 인스턴스 메소드가 실행되기 전에 실행 된 메소드 (오브젝트 프록시, 메소드 메소드, 오브젝트 [] args); // 인스턴스 메소드가 실행 된 후 실행 된 메소드는 이전에 void (오브젝트 프록시, 메소드 메소드, Object [] args);} 그런 다음 Aophandle 클래스를 수정하고 AopMethod 속성을 추가하십시오.
클래스 초기화시 AopMethod 인스턴스를 얻기 위해 생성자 방법을 수정하십시오.
마지막으로 호출 메소드를 수정 .... 직접 코드로 이동하십시오.
패키지 프록시; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; import proxy.imp.aopMethod; public class aophandle 구현 invocationHandler {// 개인 AOPMETHOD 메소드 저장; 개인 대상 O; public aophandle (object o, aopmethod 메서드) {this.o = o; this.method = 메소드; } /***이 메소드는 자동으로 호출됩니다, Java Dynamic Proxy Mechanism* 다음 매개 변수는* @param 객체 프록시로 전달됩니다. 프록시 객체의 인터페이스는 객체와 다릅니다* @param 메소드 메소드* @param 객체 [] args 메소드 매개 변수*는 대상과 다를 때 호출 할 수 없을 때 args 메소드 매개 변수*를 사용 할 수 없을 때 Args 메소드 매개 변수*를 사용 할 수 없기 때문입니다. 인터페이스 지향적이며, 클래스 지향적이지 않은 경우 **/ @override public Object invoke (개체 프록시, 메소드 메소드, 개체 [] args) 던지기 가능 {object ret = null; // 수정 장소는 여기에 있습니다 .method.before (프록시, 메소드, args); ret = method.invoke (o, args); // 수정 장소는 여기에 있습니다 .method.after (프록시, 메소드, args); 반품 반환; }} Huhu, 작업이 완료되었습니다. 모든 것이 문제가되는 것 같습니다. 귀엽습니다 ...
지금 테스트 클래스 업데이트 ...
패키지 프록시; import java.lang.reflect.method; import org.junit.runner.runwith; import org.junit.runners.blockjunit4classrunner; import proxy.imp.aopMethod; import proxy.imp.animalinterc void main (string [] args) {AnimalInterface dog = AnimalFactory.getAnimal (dogimp.class, new aopMethod () {// 여기에 메서드 실행 공개 공개 공개 void (객체 프록시, 메소드 메소드, 개체 [] args) {system.err.println ( " + method. 메서드 실행 후 절단 메소드 공개 void (오브젝트 프록시, 메소드 메소드, Object [] args) {System.err.println ( " + method.getName () +"메서드 실행 후 실행 "); dog.say (); String name1 = "내 이름은" + dog.getName (); System.out.println (name1); dog.setName ( "ergouzi"); String name2 = "내 이름은"+dog.getName (); System.out.println (name2); }} Huhu, 친애하는, 주사하고 싶습니까? 자신의 방법을 잘라낸 것 같은 느낌이 듭니까 ??? 하하…
모든 것이 완벽 해 보이지만 항상 뭔가 빠진 것 같아요? 그렇습니다. Spring과 같은 구성 파일이 부족합니다.
사실, 그것들은 이미 매우 간단합니다. 그들을 당신에게 맡기겠습니다. XML 형식을 디자인하고 기다리십시오. 뭐라고 하시나요? 사용자 정의 방법을 가로 채울 수 없습니까?
스프링과 같은 사용자 정의 방법을 가로 채울 수 없습니까? 오 ~ ~~ 아니요, 실제로 메소드와 메소드 이름을 사용하여 이전 (Object Proxy, Method Method, Object [] args)를 판단하여 메소드를 사용하고 메소드 이름을 제공 할 수 있습니다.
물론,이 예는 실질적인 의미가 없으며 다양한 완벽한 AOP 프레임 워크와 비교할 수 없습니다. 이 기사는 당신에게 사고 방식을 제공하지만, 당신은 물건이 아무리 굉장하더라도 조금씩 축적된다는 것을 기억해야합니다.
예제 다운로드 : http://xiazai.vevb.com/201701/yuanma/javaaop_jb51.rar
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.