<aop:scoped-proxy/>介绍:

  Spring的Bean是有scope属性的,表示bean的生存周期。scope的值有prototype、singleton、session、request。那么就有个问题了,如果一个singleton的bean中引用了一个prototype的bean,结果会怎样呢?在默认情况下,单例会永远持有一开始构造所赋给它的值。

所以,为了让我们在每次调用这个Bean的时候都能够得到具体scope中的值,比如prototype,那么我们希望每次在单例中调用这个Bean的时候,得到的都是一个新的prototype,Spring中AOP名字空间中引入了这个标签。 <aop:scoped-proxy/>。下面具体看一个例子:

步骤一:创建两个bean。一个将来的生存周期是singleton,一个将来的生存周期是prototype

package org.burning.sport.model.proxy;

import java.util.Date;

public class PrototypeBean {
private Long timeMilis; public PrototypeBean() {
this.timeMilis = new Date().getTime();
} public void printTime() {
System.out.println("timeMils:" + timeMilis);
}
}
package org.burning.sport.model.proxy;

public class SingletonBean {
private PrototypeBean prototypeBean; public void setPrototypeBean(PrototypeBean prototypeBean) {
this.prototypeBean = prototypeBean;
} public void printTime() {
prototypeBean.printTime();
} }

步骤二:新建一个xml文件scopedProxyBean.xml。用来创建bean并且添加相互的依赖关系

<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/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
default-autowire="byName" default-lazy-init="false">
<bean id="prototypeBean" class="org.burning.sport.model.proxy.PrototypeBean" scope="prototype">
<aop:scoped-proxy/>
</bean>
<bean id="singletonBean" class="org.burning.sport.model.proxy.SingletonBean">
<property name="prototypeBean">
<ref bean="prototypeBean"/>
</property>
</bean>
</beans>

步骤三:写一个单元测试,观察效果

package bean;

import org.burning.sport.model.proxy.SingletonBean;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:scopedProxyBean.xml"})
public class ScopedProxyTest {
@Autowired
private SingletonBean singletonBean;
@Test
public void proxyTest() {
singletonBean.printTime();
System.out.println("===============");
singletonBean.printTime();
}
}

结果:

timeMils:1512617912901
===============

timeMils:1512617913009

总结:我们看到同一个singletonbean打印出来的时间是不一样的,得知prototypeBean是维持了自己的"prototype"生存周期


步骤四:把scopedProxyBean.xml中的<aop:scoped-proxy/>注释掉再运行单元测试看输出结果

结果:

timeMils:1512618144214
===============
timeMils:1512618144214

结论:输出的结果是一致的,得知prototypeBean的生存周期被改变为跟singletonbean一样的“singleton”

参考:

[1]博客,http://blog.csdn.net/Mr_SeaTurtle_/article/details/52992207

Spring-AOP标签scoped-proxy的更多相关文章

  1. Spring AOP 之编译期织入、装载期织入、运行时织入(转)

    https://blog.csdn.net/wenbingoon/article/details/22888619 一   前言 AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP ...

  2. 代理模式及Spring AOP (二)

    一.Spring AOP   1.1 Spring AOP 底层还是用的动态代理.如果目标对象所对应的类有接口,spring就用jdk生成代理对象: 如果目标对象所对应的类没有接口,spring就用C ...

  3. Spring AOP 问与答

    AOP的实现有哪些 AOP常见的实现有: Spring AOP Aspectj Guice AOP Jboss AOP 等 AOP Alliance 是什么, 为什么Spring AOP, G UIC ...

  4. spring aop配置及用例说明(2)

    欢迎交流转载:http://www.cnblogs.com/shizhongtao/p/3473362.html 这里先介绍下几个annotation的含义, @Before:表示在切入点之前执行. ...

  5. spring Aop设计原理

    转载至:https://blog.csdn.net/luanlouis/article/details/51095702 0.前言 Spring 提供了AOP(Aspect Oriented Prog ...

  6. Spring aop报错:com.sun.proxy.$Proxyxxx cannot be cast to yyy

    在使用Spring AOP时,遇到如下的错误: Exception in thread "main" java.lang.ClassCastException: com.sun.p ...

  7. Spring Aop(八)——advisor标签

    转发地址:https://www.iteye.com/blog/elim-2396274 8 advisor标签 advisor标签是需要定义在aspect标签里面的,其作用与aspect类似,可以简 ...

  8. 阿里四面:你知道Spring AOP创建Proxy的过程吗?

    Spring在程序运行期,就能帮助我们把切面中的代码织入Bean的方法内,让开发者能无感知地在容器对象方法前后随心添加相应处理逻辑,所以AOP其实就是个代理模式. 但凡是代理,由于代码不可直接阅读,也 ...

  9. Spring AOP源码分析(二)动态A0P自定义标签

    摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 之前讲过Spring中的自定义注解,如果声明了自定义的注解,那么就一定 ...

  10. spring aop(四)

    直接找到解析aop标签的方法: protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate deleg ...

随机推荐

  1. 常用Linux命令笔记

    任何脱离业务的架构都是耍流氓 只记录实际常用的Linux命令 常用Linux命令 查找安装路径: whereis nginx 查询nginx进程: ps aux|grep nginx 查看 CentO ...

  2. MariaDB日志审计 帮你揪出内个干坏事儿的小子

    Part1:谁干的? 做DBA的经常会遇到,一些表被误操作了,被truncate.被delete.甚至被drop.引起这方面的原因大多数都是因为人为+权限问题导致的.一些公共账户,例如ceshi账户, ...

  3. SQLite事务与自增深度分析

    SQLite什么都好,就怕“database is locked”这些年来想尽办法去规避它. 测试代码: static void Test2() { XCode.Setting.Current.Tra ...

  4. 从Unity中的Attribute到AOP(五)

    今天主要来讲一下Unity中带Menu的Attribute. 首先是AddComponentMenu.这是UnityEngine命名空间下的一个Attribute. 按照官方文档的说法,会在Compo ...

  5. CountDownLatch源码解析

    一.CountDownLatch介绍 CountDownLatch是在jdk1.5被引入的,它主要是通过一个计数器来实现的,当在初始化该类的构造函数时,会事先传入一个状态值,之后在执行await方法后 ...

  6. Codeforces 777A Shell Game

    A. Shell Game time limit per test:0.5 seconds memory limit per test:256 megabytes input:standard inp ...

  7. ZOJ 1403&&HDU 1015 Safecracker【暴力】

    Safecracker Time Limit: 2 Seconds      Memory Limit: 65536 KB === Op tech briefing, 2002/11/02 06:42 ...

  8. UVA 11292 Dragon of Loowater(简单贪心)

    Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...

  9. 【Java学习笔记之十】Java中循环语句foreach使用总结及foreach写法失效的问题

    foreach语句使用总结 增强for(part1:part2){part3}; part2中是一个数组对象,或者是带有泛性的集合. part1定义了一个局部变量,这个局部变量的类型与part2中的对 ...

  10. HDU 1711 Number Sequence(KMP裸题,板子题,有坑点)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...