3.4.2 在 XML 中声明作用域代理

如果你需要使用 XML 来声明会话或请求作用域的 bean,那么就不能使用 @Scope 注解及其 proxyMode 属性了。元素的 scope 属性能够设置 bean 的作用域,但是该怎样指定代理模式呢?

要设置代理模式,我们需要使用 Spring aop 命名空间的一个新元素:

<bean id="cart" class="com.myapp.ShoppingCart" scope="session">
  <aop:scoped-proxy />
</bean>

<aop:scoped-proxy> 是与 @Scope 注解的 proxyMode 属性功能相同的 Spring XML 配置元素。它会告诉 Spring 为 bean 创建一个作用域代理。默认情况下,它会使用 CGLib 创建目标类的代理。但是我们也可以将 proxy-target-class 属性设置为 false,进而要求它生成基于接口的代理:

<bean id="cart" class="com.myapp.ShoppingCart" scope="session">
  <aop:scoped-proxy proxy-target-class="false" />
</bean>

为了使用 <aop:scoped-proxy> 元素,我们必须在 XML 配置中声明 Spring 的 aop 命名空间:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/beans/spring-aop.xsd
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd" >
    ...
</beans>

在第 4 章中,当我们使用 Spring 和面向切面编程的时候,会讨论 Spring aop 命名空间的更多知识。不过,在结束本章的内容之前,我们来看 一下 Spring 高级配置的另外一个可选方案:Spring 表达式语言(Spring Expression Language)。

Last updated