zoukankan      html  css  js  c++  java
  • Spring-AOP标签scoped-proxy

    <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

  • 相关阅读:
    解决Too many connections问题
    TPCC-MySQL安装、使用及结果解读
    Spring事务配置
    【转】Spring事务介绍
    Spring AOP的实现原理
    Spring AOP的使用
    Spring整合Junit4进行单元测试
    Spring Bean定义的三种方式
    spring集成Redis(单机、集群)
    Redis搭建(五):Cluster集群搭建
  • 原文地址:https://www.cnblogs.com/happyflyingpig/p/7998392.html
Copyright © 2011-2022 走看看