引言
在前两篇文章,Spring学习笔记 —— AOP(面向切面编程) 之AspectJ, Spring学习笔记 —— AOP(面向切面编程) 之使用ProxyFactoryBean实现AOP,我们介绍了AOP的概念,在Spring下两种实现AOP的方式。
但是,除了面向切面编程之外,AOP的名字空间中还包含了一些重要的标签,比如”scoped-proxy”。这篇文章就会详细介绍这个标签的作用,以及它的实现方式分析。
scoped-proxy 标签介绍
在 Spring学习笔记 —— 从IOC说起,我们介绍过,Spring中的Bean是有Scope属性的,代表着bean的生存周期。而Spring中默认的Scope分为”singleton”和”prototype”两种。
那么,问题就来了,如果在一个singleton的Bean中引用了一个prototype的Bean,结果会怎样呢?——在默认情况下,单例会永远持有一开始构造所赋给它的值。
所以,为了让我们在每次调用这个Bean的时候都能够得到具体scope中的值,比如prototype,那么我们希望每次在单例中调用这个Bean的时候,得到的都是一个新的prototype,Spring中AOP名字空间中引入了这个标签。
xml
<aop:scoped-proxy/>
示例
举个例子。
PrototypeBean.java
这个类在初始化的时候会得到当前时间的时间戳,它的scope为prototype(每次获取都会重新生成一个)。
public class PrototypeBean {
private Long timeMilis;
public PrototypeBean(){
timeMilis = (new Date()).getTime();
}
public void printTime() {
System.out.println(timeMilis+"");
}
}
SingletonBean.java
这个单例的Bean持有一个PrototypeBean,同时它的printTime()
方法输出PrototypeBean的时间戳。
public class SingletonBean {
private PrototypeBean prototype;
public void printTime() {
prototype.printTime();
}
public void setPrototype(PrototypeBean prototype) {
this.prototype = prototype;
}
}
scopedProxyBean.xml