有没有更好的方法使用 JavaConfig 配置拦截器?
Is there a better way to configure interceptors using JavaConfig?
我正在将 XML Spring 配置移植到 JavaConfig。
我的带有拦截器的 bean 定义如下:
@Autowired
private MyService myServiceImpl;
@Bean
MyService myService() {
final ProxyFactoryBean proxy = new ProxyFactoryBean();
final Class<?>[] proxyInterfaces = { MyService.class };
proxy.setProxyInterfaces(proxyInterfaces);
proxy.setTarget(this.myServiceImpl);
final String[] interceptorNames = { "myInterceptor" };
proxy.setInterceptorNames(interceptorNames);
return (MyService) proxy.getObject();
}
,其中 "myInterceptor" 名称在编译时未验证。
有没有更好的方法使用 JavaConfig 配置拦截器?
配置拦截器的更好方法:
@Configuration
public class MyServiceConfig {
@Autowired
private BeanFactory beanFactory;
@Autowired
private IMyService myService;
@Autowired
private MyInterceptor myInterceptor;
@Bean
public IMyService myServiceIntercepted() {
final Class<?>[] proxyInterfaces = { IMyService.class };
final Advice[] advices = { this.myInterceptor };
return createProxy(proxyInterfaces, this.myService, this.beanFactory,
advices);
}
<T> T createProxy(final Class<?>[] proxyInterfaces, final T target,
final BeanFactory beanFactory) {
final ProxyFactoryBean proxy =
createProxyReturnFactoryBean(proxyInterfaces, target, beanFactory);
return (T) proxy.getObject();
}
<T> ProxyFactoryBean createProxyReturnFactoryBean(
final Class<?>[] proxyInterfaces, final T target, final BeanFactory beanFactory) {
final ProxyFactoryBean proxy = new ProxyFactoryBean();
proxy.setBeanFactory(beanFactory);
if (proxyInterfaces != null) {
proxy.setProxyInterfaces(proxyInterfaces);
}
proxy.setTarget(target);
return proxy;
}
<T> T createProxy(final Class<?>[] proxyInterfaces, final T target,
final BeanFactory beanFactory, final Advice[] advices) {
final ProxyFactoryBean proxy =
createProxyReturnFactoryBean(proxyInterfaces, target, beanFactory);
for (final Advice advice : advices) {
proxy.addAdvice(advice);
}
return (T) proxy.getObject();
}
}
我正在将 XML Spring 配置移植到 JavaConfig。 我的带有拦截器的 bean 定义如下:
@Autowired
private MyService myServiceImpl;
@Bean
MyService myService() {
final ProxyFactoryBean proxy = new ProxyFactoryBean();
final Class<?>[] proxyInterfaces = { MyService.class };
proxy.setProxyInterfaces(proxyInterfaces);
proxy.setTarget(this.myServiceImpl);
final String[] interceptorNames = { "myInterceptor" };
proxy.setInterceptorNames(interceptorNames);
return (MyService) proxy.getObject();
}
,其中 "myInterceptor" 名称在编译时未验证。
有没有更好的方法使用 JavaConfig 配置拦截器?
配置拦截器的更好方法:
@Configuration
public class MyServiceConfig {
@Autowired
private BeanFactory beanFactory;
@Autowired
private IMyService myService;
@Autowired
private MyInterceptor myInterceptor;
@Bean
public IMyService myServiceIntercepted() {
final Class<?>[] proxyInterfaces = { IMyService.class };
final Advice[] advices = { this.myInterceptor };
return createProxy(proxyInterfaces, this.myService, this.beanFactory,
advices);
}
<T> T createProxy(final Class<?>[] proxyInterfaces, final T target,
final BeanFactory beanFactory) {
final ProxyFactoryBean proxy =
createProxyReturnFactoryBean(proxyInterfaces, target, beanFactory);
return (T) proxy.getObject();
}
<T> ProxyFactoryBean createProxyReturnFactoryBean(
final Class<?>[] proxyInterfaces, final T target, final BeanFactory beanFactory) {
final ProxyFactoryBean proxy = new ProxyFactoryBean();
proxy.setBeanFactory(beanFactory);
if (proxyInterfaces != null) {
proxy.setProxyInterfaces(proxyInterfaces);
}
proxy.setTarget(target);
return proxy;
}
<T> T createProxy(final Class<?>[] proxyInterfaces, final T target,
final BeanFactory beanFactory, final Advice[] advices) {
final ProxyFactoryBean proxy =
createProxyReturnFactoryBean(proxyInterfaces, target, beanFactory);
for (final Advice advice : advices) {
proxy.addAdvice(advice);
}
return (T) proxy.getObject();
}
}