2024. 11. 17. 13:07ㆍSpring Framework/Spring AOP APIs
Using the "auto-proxy" facility
지금까지 우리는 ProxyFactoryBean 또는 유사한 팩토리 빈을 사용하여 명시적으로 AOP 프록시를 생성하는 방법을 살펴보았습니다.
Spring에서는 선택된 빈 정의를 자동으로 프록시할 수 있는 "auto-proxy" 빈 정의를 사용할 수도 있습니다. 이는 컨테이너가 로드될 때 모든 빈 정의를 수정할 수 있는 Spring의 "bean post processor" 인프라에 기반합니다.
이 모델에서는 XML 빈 정의 파일에서 몇 가지 특별한 빈 정의를 설정하여 auto-proxy 인프라를 구성합니다. 이를 통해 자동 프록시 대상 자격이 있는 객체를 선언할 수 있으며, ProxyFactoryBean을 사용할 필요가 없습니다.
이를 수행하는 두 가지 방법이 있습니다:
- 현재 컨텍스트에 있는 특정 빈을 참조하는 auto-proxy 생성기를 사용하는 방법.
- 소스 레벨 메타데이터 속성에 의해 구동되는 auto-proxy 생성의 특별한 경우.
Auto-proxy 빈 정의
이 섹션에서는 org.springframework.aop.framework.autoproxy 패키지에서 제공하는 auto-proxy 생성기에 대해 설명합니다.
BeanNameAutoProxyCreator
BeanNameAutoProxyCreator 클래스는 빈 이름이 리터럴 값이나 와일드카드와 일치하는 빈에 대해 자동으로 AOP 프록시를 생성하는 BeanPostProcessor입니다. 다음 예제는 BeanNameAutoProxyCreator 빈을 생성하는 방법을 보여줍니다:
XML 기반 구성:
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames" value="jdk*,onlyJdk"/>
<property name="interceptorNames">
<list>
<value>myInterceptor</value>
</list>
</property>
</bean>
자바 기반 구성:
@Configuration
public class AppConfig {
@Bean
public BeanNameAutoProxyCreator beanNameAutoProxyCreator() {
BeanNameAutoProxyCreator creator = new BeanNameAutoProxyCreator();
creator.setBeanNames("jdk*", "onlyJdk");
creator.setInterceptorNames("myInterceptor");
return creator;
}
@Bean
public MyInterceptor myInterceptor() {
return new MyInterceptor();
}
}
위의 자바 기반 구성에서는 BeanNameAutoProxyCreator를 정의하고, 빈 이름 패턴에 맞는 빈들에 대해 자동으로 프록시를 생성합니다. interceptorNames 속성은 XML 기반 구성에서와 마찬가지로 설정됩니다.
DefaultAdvisorAutoProxyCreator
더 일반적이고 매우 강력한 auto-proxy 생성기는 DefaultAdvisorAutoProxyCreator입니다. 이는 현재 컨텍스트에서 적격한 어드바이저를 자동으로 적용하며, auto-proxy 어드바이저의 빈 정의에 특정 빈 이름을 포함할 필요가 없습니다. 이는 BeanNameAutoProxyCreator와 마찬가지로 일관된 구성을 제공하며 중복을 피할 수 있는 장점이 있습니다.
XML 기반 구성:
<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"/>
자바 기반 구성:
@Configuration
public class AppConfig {
@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
return new DefaultAdvisorAutoProxyCreator();
}
@Bean
public TransactionAttributeSourceAdvisor transactionAdvisor(TransactionInterceptor transactionInterceptor) {
TransactionAttributeSourceAdvisor advisor = new TransactionAttributeSourceAdvisor();
advisor.setTransactionInterceptor(transactionInterceptor);
return advisor;
}
@Bean
public MyAdvisor customAdvisor() {
return new MyAdvisor();
}
@Bean
public BusinessObject1 businessObject1() {
return new BusinessObject1();
}
@Bean
public BusinessObject2 businessObject2() {
return new BusinessObject2();
}
@Bean
public TransactionInterceptor transactionInterceptor() {
// TransactionInterceptor 설정 로직
return new TransactionInterceptor();
}
}
위의 자바 기반 설정에서는 DefaultAdvisorAutoProxyCreator를 빈으로 등록하여 모든 적격 어드바이저가 자동으로 프록시를 적용할 수 있도록 합니다. 트랜잭션 어드바이저 및 커스텀 어드바이저도 별도로 설정하며, 비즈니스 객체는 필요에 따라 프록시가 생성됩니다.
이 자바 기반 설정은 XML 구성에서 설정했던 것과 동일한 기능을 제공합니다. 이를 통해 Spring IoC 컨텍스트에서 빈들이 자동으로 프록시되며, 이와 관련된 구성을 깔끔하게 유지할 수 있습니다.
'Spring Framework > Spring AOP APIs' 카테고리의 다른 글
Spring AOP APIs (0) | 2024.12.02 |
---|---|
Manipulating Advised Objects (0) | 2024.11.17 |
Creating AOP Proxies Programmatically with the ProxyFactory (0) | 2024.11.17 |
The Advisor API in Spring (0) | 2024.11.17 |
Advice API in Spring (0) | 2024.11.17 |