6.8 "자동 프록시" 기능 사용 by sh

6.8. "자동 프록시" 기능 사용

지금까지 우리는 ProxyFactoryBean이나 비슷한 factory bean을 사용하여 AOP 프록시를 명시적으로 생성하는 것을 고려했습니다.

Spring은 또한 자동으로 선택된 bean 정의를 프록시 할 수있는 "auto-proxy"bean 정의를 사용할 수있게 해줍니다. 이것은 Spring의 "bean post processor"기반 구조를 기반으로하며, 컨테이너가 로드 될 때 모든 bean 정의를 수정할 수 있습니다.

이 모델에서는 XML bean 정의 파일에 몇 가지 특수 bean 정의를 설정하여 자동 프록시 인프라를 구성합니다. 이를 통해 자동 프록시에 적합한 대상을 선언 할 수 있습니다. ProxyFactoryBean을 사용할 필요가 없습니다.

이 작업에는 두 가지 방법이 있습니다.

  • 현재 컨텍스트의 특정 Bean을 참조하는 자동 프록시 작성자 사용.

  • 개별적으로 고려해야 만하는 자동 프록시 생성의 특별한 경우 : 소스 레벨 메타 데이터 속성에 의해 구동되는 자동 프록시 생성.

6.8.1. 자동 프록시 Bean 정의

이 섹션에서는 org.springframework.aop.framework.autoproxy패키지가 제공하는 자동 프록시 생성자에 대해 설명합니다.

BeanNameAutoProxyCreator

BeanNameAutoProxyCreator클래스는 리터럴 값 또는 와일드 카드와 일치하는 이름을 가진 Bean에 대한 AOP 프록시를 자동으로 만드는 BeanPostProcessor입니다. 다음 예제에서는 BeanNameAutoProxyCreatorbean을 작성하는 방법을 보여줍니다.

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames" value="jdk*,onlyJdk"/>
    <property name="interceptorNames">
        <list>
            <value>myInterceptor</value>
        </list>
    </property>
</bean>

ProxyFactoryBean과 마찬가지로 프로토 타입 advisor에 올바른 동작을 허용하기 위해 인터셉터 목록이 아닌 interceptorNames속성이 있습니다. 명명 된 "인터셉터"는 advisor 또는 advice 유형이 될 수 있습니다.

일반적으로 자동 프록시와 마찬가지로 BeanNameAutoProxyCreator를 사용하는 주된 요점은 최소한의 설정으로 여러 객체에 하나의 설정을 일관성있게 적용하는 것입니다. 선언적 트랜잭션을 여러 객체에 적용하는 데 널리 사용됩니다.

앞의 예에서 jdkMyBeanonlyJdk와 같이 이름이 일치하는 Bean 정의는 대상 클래스가 있는 일반 오래된 bean 정의입니다. AOP 프록시는 BeanNameAutoProxyCreator에 의해 자동으로 생성됩니다. 동일한 advice가 모든 일치하는 bean에 적용됩니다. 앞의 예에서 인터셉터 대신 advisor가 사용되는 경우, pointcut은 다른 bean에 다르게 적용될 수 있습니다.

DefaultAdvisorAutoProxyCreator

보다 일반적이고 매우 강력한 자동 프록시 작성자는 DefaultAdvisorAutoProxyCreator입니다. 이는 자동 프록시 advisor의 bean 정의에 특정 bean 이름을 포함시킬 필요없이 현재 컨텍스트에서 적합한 advisor를 자동으로 적용합니다. BeanNameAutoProxyCreator와 동일한 구성 및 중복 방지와 동일한 장점을 제공합니다.

이 메커니즘을 사용하려면 다음이 필요합니다.

  • DefaultAdvisorAutoProxyCreatorbean 정의 지정하기.

  • 동일한 또는 관련된 컨텍스트에서 임의의 수의 advisor를 지정합니다. 이들은 advisor나 인터셉터나 다른 advice가 아니어야합니다. 이것은 후보 빈 정의에 대한 각 조언의 적격성을 검사하기 위해 평가할 포인트 컷이 있어야하기 때문에 필요합니다.

DefaultAdvisorAutoProxyCreator는 각 advisor에 포함 된 포인트 컷을 자동으로 평가하여 각 비즈니스 객체 (예 : businessObject1businessObject2)에 적용해야하는 advice(있는 경우)를 확인합니다.

즉, 다수의 advisor를 각 Business Object에 자동으로 적용 할 수 있습니다. advisor 중 하나에 있는 pointcut이 비즈니스 오브젝트의 메소드와 일치하하는 것이 없다면, 객체는 프록시되지 않습니다. bean 정의가 새 비즈니스 객체에 추가 될 때 필요에 따라 bean 정의가 자동으로 프록시됩니다.

자동 프록시는 일반적으로 호출자 나 종속성이 알려지지 않은 객체를 얻을 수 없게 만드는 이점이 있습니다. 이 ApplicationContext에서 getBean("businessObject1")을 호출하면 대상 비즈니스 객체가 아닌 AOP 프록시가 리턴됩니다. (앞에서 설명한 "내부 bean"관용구도이 이점을 제공합니다.)

다음 예제는 DefaultAdvisorAutoProxyCreator빈과 이 절에서 설명하는 다른 요소를 생성합니다.

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
    <property name="transactionInterceptor" ref="transactionInterceptor"/>
</bean>

<bean id="customAdvisor" class="com.mycompany.MyAdvisor"/>

<bean id="businessObject1" class="com.mycompany.BusinessObject1">
    <!-- Properties omitted -->
</bean>

<bean id="businessObject2" class="com.mycompany.BusinessObject2"/>

DefaultAdvisorAutoProxyCreator는 동일한 advice를 여러 비즈니스 객체에 일관되게 적용하려는 경우 매우 유용합니다. 인프라 정의가 완료되면 특정 프록시 구성을 포함하지 않고 새 비즈니스 개체를 추가 할 수 있습니다. 또한 구성 변경을 최소화하면서 추가 측면 (예 : 추적 또는 성능 모니터링 측면)을 쉽게 삭제할 수 있습니다.

DefaultAdvisorAutoProxyCreator는 필터링과 정렬을 지원합니다. (동일한 권고 자만 평가되도록 명명 규칙을 사용하여 다르게 구성되는 AdvisorAutoProxyCreators를 동일한 공장에서 사용할 수 있음) advisor는 org.springframework.core.Ordered인터페이스를 구현하여 문제가있는 경우 올바른 순서를 지정할 수 있습니다. 앞의 예제에서 사용한 TransactionAttributeSourceAdvisor는 구성 가능한 order 값을 가집니다. 기본 설정은 순서가 없습니다.

Last updated