0. aop
AP (Aspect Oriented Programming)은 소프트웨어 개발에서 인기있는 주제이며 스프링 프레임 워크의 중요한 부분입니다. 비즈니스 로직의 여러 부분을 AOP를 사용하여 분리하여 비즈니스 논리의 다양한 부분 간의 커플 링을 줄이고 프로그램의 재사용 성을 향상 시키며 개발 효율성을 향상시킬 수 있습니다.
AOP는 OOP의 연속입니다.
주요 기능은 로깅, 성능 통계, 보안 제어, 거래 처리, 예외 처리 등입니다.
주요 의도는 로깅, 성능 통계, 보안 제어, 거래 처리, 예외 처리 등과 같은 코드를 비즈니스 로직 코드에서 나누는 것입니다. 이러한 동작을 분리함으로써 비즈니스 논리 방법으로 분리 한 다음 비즈니스 로직 코드에 영향을 미치지 않고 이러한 동작을 변경하기를 희망합니다.
소스 코드를 수정하지 않고 프로그램에 기능을 동적으로 추가하는 기술은 런타임 동안 사전 컴파일 방법과 동적 프록시를 통해 달성 할 수 있습니다. AOP는 실제로 GOF 디자인 모델의 연속입니다. 디자인 모델은 발신자와 칼리 사이의 분리를 추구하여 코드의 유연성과 확장 성을 향상시킵니다. AOP는이 목표의 구현이라고 할 수 있습니다.
봄에 Aspect-Oriented 프로그래밍을 풍부하게 지원하여 감사 및 거래 관리와 같은 시스템 수준 서비스에서 응용 프로그램의 비즈니스 논리를 분리하여 응집력있는 개발을 허용합니다. 응용 프로그램 객체는 자신이해야 할 일만 구현 - 완전한 비즈니스 로직 - 그게 다행입니다. 그들은 로깅 또는 거래 지원과 같은 다른 시스템 수준의 문제를 책임지지 않습니다.
1. PropertyPlaceHolderConfigurer를 통해 스프링에 다른 외부 구성 파일 또는 속성 파일을로드하십시오.
많은 Javaee 프로젝트에서 봄의 역할은 매우 중요합니다. 다른 모듈과 구성 요소를 관리하는 가벼운 컨테이너입니다. Spring은 종종 Struts, Ibatis, Hibernate 등을 관리해야합니다. 이러한 오픈 소스 프레임 워크의 구성 파일은 Spring의 Property PlaceholderConfigurer를 통해 관리를 통해로드됩니다. 또한 데이터베이스 연결 정보, JNDI 연결 정보 속성 파일 등을 관리를 위해 PropertyPlaceHolderConfigurer를 통해 스프링으로로드 할 수도 있습니다. 사용법은 다음과 같습니다.
(1). PropertyPlaceHolderConfigurer를 통해 다른 파일을 스프링으로로드합니다.
스프링 구성 파일에 다음 구성을 추가하십시오.
<bean class = "org.springframework.beans.factory.config.propertyplaceholderconfigurer"> <property name = "locations"> value "
(2). (1)의 구성을 통해로드 할 구성 또는 속성 파일은 스프링으로로드됩니다. 또한 데이터베이스 연결 정보 또는 JNDI 연결 정보 사용과 같은 런타임에로드 된 구성 또는 데이터 파일에 대한 정보를 사용해야하는 경우 EL 표현 유형의 구문을 사용하여 참조 할 수 있습니다.
<bean id =”dataSource”dataSource”destrow-method =”close”class =”org.apache.common.dbcp.basicdatasource”> <!-데이터베이스 연결 정보가 외부 속성 파일로 작성되었으며 Spring에 의해로드되었다고 가정합니다-> <property name =”driver className =”value =”$ {url}””$ 상. <property name = "username"value = "$ {username}"/> <property name = "password"vale = "$ {password}”/> </bean>
참고 : <Context : Property-PlaceHolderLocation = "ClassPath :로드 할 파일 이름"/>를 사용할 수도 있습니다.
2. Java의 동적 프록시 :
Spring의 기본 구현 원리는 동적 대리이므로 측면 지향 프로그래밍을 학습하기 전에 먼저 동적 프록시를 이해해야합니다.
동적 프록시는 Java에서 널리 사용되며 Dynamic Proxy는 23의 설계 패턴에서 매우 일반적으로 사용되는 고전적인 디자인 패턴 중 하나입니다. 동적 프록시의 원리는 대상 객체 또는 그 방법을 호출 할 때 시스템이 대상 객체를 직접 반환하지 않고이 프록시 대상의 대상 개체 또는 방법에 액세스하는 것이 아니라는 것입니다.
동적 프록시의 간단한 원리는 다음과 같습니다.
클라이언트 발신자 -> 프록시 개체 -> 대상 개체라고합니다.
클라이언트가 프록시 객체를 호출하면 프록시 객체는 대상 객체를 위임하여 비즈니스 방법을 호출합니다.
동적 프록시는 인터페이스의 동적 프록시와 일반 클래스의 동적 프록시의 두 가지 유형으로 나뉩니다. Java의 동적 프록시는 실제 인터페이스의 동적 프록시입니다. CGLIB는 일반 클래스의 역동적 인 프록시입니다. 대상 Javaee 의존성 패키지와 스프링 JAR 패키지에는 이미 CGLIB 관련 JAR 패키지가 포함되어 있으므로 프록시 또는 일반 클래스를 동적으로 프록시 할 수 있습니다.
(1) 인터페이스에 대한 자바의 동적 프록시 :
Java의 다이나믹 프록시는 인터페이스에 대해서만 동적으로 프록시 할 수 있습니다. 따라서 대상 객체는 인터페이스를 구현해야하며 프록시 객체는 대상 객체의 모든 인터페이스를 구현해야합니다. 워크 플로는 다음과 같습니다.
에이. 동적 프록시 클래스 쓰기 :
참고 : Dynamic Proxy는 Invocial Handler 인터페이스를 구현하고 다음 방법을 구현해야합니다.
코드 사본은 다음과 같습니다.
Object invoke (ObjectM Proxy 인스턴스, 메소드 프록시 인스턴스에서 호출 된 메소드 인스턴스, 대상 [] 프록시 인스턴스로 전달 된 매개 변수 값의 개체 배열);
JDK 설치 문서에 대해 설명합니다. 이 메소드는 프록시 인스턴스를 전달하고 메소드를 호출하는 java.lang.reflect.method 객체 및 매개 변수가 포함 된 객체 유형 배열을 식별하는 데 사용됩니다. 통화 핸들러는 인코딩 된 메소드 호출을 적절한 방식으로 처리하며 결과는 프록시 인스턴스에서 메소드 호출의 결과로 반환됩니다.
비. 프록시 개체 생성 :
proxy.newproxyInstance (클래스 로더, 클래스 <?> [] 인터페이스 어레이, 콜백 프록시 객체 (보통 this))
대상 객체 메소드가 호출되면 대상 객체의 프록시 객체가 메소드를 통해 생성됩니다. 프록시 오브젝트는 대상 개체를 호출하여 호출 결과를 반환하기 위해 자동으로 호출 메소드를 호출합니다.
(2) .CGLIB는 일반 Java 클래스의 동적 대리입니다.
CGLIB가 동적 프록시를 생성하면 대상 클래스가 인터페이스를 구현할 필요가 없습니다. 워크 플로우는 다음과 같습니다.
에이. 동적 프록시 클래스 쓰기 :
Enhancer Enhancer = New Enhancer (); // 대상 클래스의 부모 클래스를 자체 enhancer.setSuperClass (대상 클래스 개체.getClass ())로 설정합니다. // 콜백 객체를 동적 프록시 객체 자체로 설정했습니다.
비. Methodinterceptor 인터페이스 구현 :
다음 방법을 구현하십시오.
Object Intercept (ObjectM Proxy 인스턴스, 메소드 프록시 인스턴스에서 호출 된 메소드 인스턴스, 개체 [] 메소드 값의 객체 배열 프록시 인스턴스에서 전달 된 메소드 값, 메소드 프록시 메소드 프록시 인스턴스);
참고 : CGLIB는 클래스에 동적으로 프록시 할뿐만 아니라 방법을 동적으로 프록시 할 수 있습니다.
3. 지향적 프로그래밍의 기본 개념 (AOP) :
평범한 Java 방법을 예로 들어보십시오
공개 반환 유형 메소드 이름 (매개 변수 목록) {{-> 서라운드 알림 메소드 전처리 코드-> 사전 보조 시도 {메소드 구현 (메소드 본 바디) ... 메서드 후 처리 코드-> post-notification} catch (예외 입력} {예외 처리 ...-> 예외 알림} 마침내 {마지막 프로세싱 에이전트 ...-> 최종 없음}}.
에이. 교차 절단 문제 : 예를 들어, 위의 5 개의 알림 위치, Java 개체에서는 권한 검증, 사물 처리, 로깅 등과 같은 처리 로직에 추가 될 수있는 유사한 공통 처리 로직을 가진 이러한 객체를 교차 절단 문제라고합니다. OP (Object-Oriented Programming)의 초점은 실제 세계에서 프로그래밍 객체 모델로 수직으로 추상적 인 것들입니다. AP (Aspect-Oriented Programming)의 초점은 수평이며, 프로그래밍 객체 모델의 처리 로직과 유사한 장소를 탄젠트를 형성하는 반면 프로그래밍 객체의 처리 로직은 수평 접선 초점입니다.
비. 측면 : 교차 절단 문제를 추상화하는 것은 클래스와 유사한 섹션을 형성하는 것입니다. 두 사람은 다른 관심사를 가지고 있습니다. 클래스는 사물의 특성에 대한 추상화이며, 섹션은 상호 절단 문제의 추상화입니다.
기음. JoinPoint : 가로 채는 지점은 스프링에서 언급된다. 위의 예에 표시된 방법.
디. PointCut : 연결 지점을 가로 채는 정의, 즉 연결 포인트의 모음, 즉 일련의 가로 채는 방법의 모음을 나타냅니다.
이자형. 조언 : 연결 지점을 가로 채운 후, 즉 가로 채기 후 논리적 처리 후에해야 할 일을 나타냅니다. 일반적인 권한 검증, 사물 처리, 로깅 및 기타 작업은 알림에서 정의되고 완료됩니다.
에프. 대상 : 프록시의 대상 객체, 즉 인터셉트 된 객체입니다. 위의 예에서와 같이, 메소드가 위치한 객체.
g. 직조 : 대상 객체에 섹션을 적용하고 프록시 객체의 생성을 유발하는 과정을 나타냅니다.
시간. 소개 : 코드를 수정하지 않고 소개는 런타임 동안 클래스에 일부 메소드와 필드를 동적으로 추가 할 수 있습니다.
4. Spring은 지향적 프로그래밍 (AOP)을 지원하는 종속성을 지원합니다.
스프링 이후 디렉토리의 다음 3 개 패키지는 압축 압축됩니다.
lib/sagne/agagjweaver.jarlib/aggej/sagnerjrt.jarlib/cglib/cglib-nodep-2.1-3.jar
5. 스프링에 AP (Aspect-Oriented Programming)을 사용하는 경우 스프링 구성 파일에 AOP 네임 스페이스를 소개해야합니다. 즉, 다음 구성을 추가해야합니다.
xmlns : aop =”http://www.springframework.org/schema/aop”“http://www.springframework.org/schema/aop http://www.spramework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd”
참고 : Spring 2.5는 XML 구성 파일 및 Java 주석 메소드를 기반으로 두 가지 AOP 방법을 제공합니다.
주석 메소드 AOP를 사용하려면 스프링 구성 파일에 다음 객체 주석 메소드 AOP 지원을 추가해야합니다.
<aop : SAGON-AUTOPROXY/>
6. Javabean Packaging Class -Beanwrapper :
Spring은 Beanwrapper 클래스를 통해 Javabean의 동작을 캡슐화하고 다음과 같은 속성 값을 설정하고 얻을 수 있습니다.
beanwrapper 래퍼 클래스 객체 = beanWrapperImpl (new Wrapped class ()); 래퍼 클래스 객체 .setPropertyValue ( "속성 이름", "속성 값");
이 방법을 사용하면 래핑 클래스에 속성을 설정할 수 있습니다.
7. 주석을 기반으로 한 지향적 프로그래밍 (AOP) 개발 :
(1). 스프링 구성 파일에서 주석 방법에 대한 AOP 지원을 추가하십시오.
(2). 섹션 정의 :
일반 클래스를 만드는 것과 유사하게 클래스 전에 "@aspect"주석을 추가하면 클래스가 섹션임을 나타냅니다.
(3). 컷 표면에 진입 점을 추가하십시오.
포인트 절단 점은 가로 채는 객체 방법의 모음입니다. 일반적으로 점 절단 점은 섹션의 점 절단 점을 처리하는 방법으로 정의됩니다. "@pointcut"주석을 사용하면 구문은 다음과 같습니다.
@PointCut ( "execution (*com.test.service ..*.*(..))") public void AnyMethod () {// 메소드는 "Point-Cut"및 "Point-Cut"Processing}이라고합니다.
구문 매개 변수에 대한 자세한 설명 :
에이. 첫 번째 "*": 가로 채는 메소드가 임의의 반환 유형임을 의미합니다.
비. com.test.service : 여기에 인터셉트 할 패키지의 이름을 나타내는 간단한 예제, 즉 인터셉트 할 패킷이 있습니다.
기음. 가로 채기 된 패킷 이름 후에 : 가로 채기 된 패킷 아래의 서브 포켓이 재귀 적으로 가로 채기, 즉 인터셉트 된 서브 패킷도 가로 채 웁니다.
디. "*"After "..
이자형. 마지막 "*": 차단 된 클래스의 모든 메소드, 즉 인터셉트 된 방법을 나타냅니다.
에프. "(..)": 차단 된 메소드가 매개 변수, 즉 인터셉트 된 매개 변수를 수신 함을 의미합니다.
참고 : 포인트 컷 정의 구문은 와일드 카드 문자를 지원할 수 있지만 구문 규칙을 엄격히 따라야합니다. 좋다:
@PointCut ( "execution (*com.test.service ..*. Add*(..))")
com.test.service 패키지 및 하위 포장 아래의 모든 클래스에서 "추가"로 시작하는 방법을 가로 채는 것을 의미합니다.
(4). 섹션에 알림 추가 :
봄의 알림 위치는 3의 작은 예를 참조하십시오.
"@before"주석 : 사전 보도를 선언합니다.
"@afterrutruning"주석 : 사후 보도를 선언합니다.
"@After"주석 : 최종 통지를 선언하십시오.
"@AfterThrowing"주석 : 예외 알림을 선언합니다.
"@around"주석 : 주변 알림을 선언합니다.
알림 정의의 예는 다음과 같습니다.
@Before ( "AnyMethod () (슬릿면에서 선언 된 진입 점 이름)) public void doaccesscheck () {...}
참고 : 서라운드 알림은 다른 4 가지 유형의 알림과 약간 다릅니다. 서라운드 알림은 특별한 방식으로 정의됩니다. 서라운드 알림은 전체 메소드 호출 전후에 작동하므로 연결 지점 객체를 사용하여 연결 지점을 알려 주어야합니다. 그 정의는 다음과 같습니다.
@Around (포인트 이름으로 검색) 공용 개체 DOBASICPROFILING (ProcessInjoinPoint PJP) 던지기 가능 {... return pjp.proceed (); //이 문장은 연결 지점에 다른 작업을 계속 수행하도록 지시합니다}} 8. 주석에 기초한 AP (Aspect-Oriented Programming) 개발을위한 몇 가지 팁 :
(1). 입력 매개 변수 가져 오기 :
좋다:
@Before ( "DOT NAME && args (입력 매개 변수 이름)") public void dosomething (문자열 입력 매개 변수 이름) {...}
(2). 반품 결과를 얻으십시오.
좋다:
@AfTerReturning (pointCut =”Point Name 표시”, return =”return result name”) public void dosomething (문자열 결과 이름) {…}
9. XML을 기반으로 한 섹션 지향 프로그래밍 (AOP) 개발 :
(1). 패싯 클래스를 정의하고 패싯 클래스에 알림을 추가하십시오.
(2). 스프링 구성 파일에서 일반 Java 클래스와 같은 패싯 클래스를 구성하십시오.
(3). 스프링 구성 파일에서 다음과 같이 AOP 구성 추가 :
<aop : config> <!-구성 섹션-> <aop : spect id = "section id ="section id "ref ="스프링 구성 파일의 섹션 클래스의 ID "> <! <! <! <aop : pointcut id ="section id "expression ="execution (*com.test.service ..*(..)) ")") "). Method = "섹션 클래스의 책임 처리 방법"/> <aop :…/>… </aop : 측면> </aop : config>
10. Spring의 거래 처리 (Spring의 선언적 거래 처리) :
간단히 말해서, 트랜잭션은 데이터베이스에서 가장 기본적인 작업 중 하나를 나타냅니다. 거래에 대한 자세한 설명은 데이터베이스 관련 요약에 자세히 설명됩니다. Spring의 지향적 인 프로그래밍 (AOP)의 가장 중요한 응용 프로그램 중 하나는 트랜잭션 관리입니다. Spring 2.5 이상의 트랜잭션 관리는 두 가지 유형의 주석 기반 방법과 XML 파일 기반 방법을 지원합니다.
(1). 주석 방법을 기반으로 한 트랜잭션 관리 :
에이. 스프링 구성 파일에서 다음과 같이 트랜잭션 관리 네임 스페이스 추가 :
xmlns : ts = http : //www.springframework.org/schema/tx http://www.springframework.org/schema/tx http://www.springframework.org/schema/schema/spring-tx-2.xsd
비. Spring 구성 파일의 트랜잭션 관리자를 다음과 같이 구성하십시오.
<bean id = "txmanager"class = "org.springframework.jdbc.datasource.datasourcetransactionManager"> <property name = "dataSource"ref = "spring에서 구성된 데이터 소스 Bean의 ID"/>
기음. 스프링 구성 파일에서 주석 메소드를 지원하는 트랜잭션 구성 항목 추가는 다음과 같습니다.
<TX : 주석 -DriventRansaction-Manager-TX : Annotation-DriventRansaction-Manager =”TXManager (봄에 구성된 트랜잭션 관리자의 ID)/>
디. 주석 기반 트랜잭션 관리 사용 :
Spring이 관리하는 Javaee 프로젝트에서 거래의 비즈니스 논리는 "@transactional"주석과 함께 추가되어야합니다.
(2). XML 파일 방법을 기반으로 한 트랜잭션 관리 :
에이. Spring 구성 파일의 트랜잭션 관리자를 다음과 같이 구성하십시오.
<bean id = "txmanager"class = "org.springframework.jdbc.datasource.datasourcetransactionManager"> <property name = "dataSource"ref = "spring에서 구성된 데이터 소스 Bean의 ID"/>
비. 스프링 구성 파일에 다음 섹션을 추가하십시오.
<aop : config> <!-트랜잭션 진입 지점을 구성-> <aop : pointcut id = "transactionpointcut"expression = "실행 (*com.test.service ..기음. 스프링 구성 파일에서 트랜잭션 알림에 대한 다음 기능을 추가하십시오.
<TX : Adcide ID = "TXADVICE"TRANSSACTEMANAGER = "TXMANAGER"> <TX : attributes> <!-여기에서 읽기 전용으로 시작하는 쿼리 메소드를 설정하고 거래를 지원하지 않는 예제입니다.> <TX : "get*"read-ren = "true"propagation = "nont_supported": <tx ~ <t x 메소드에 설정되어 있습니다. 이름 =”*”/> </tx : attributes> </tx : 조언>