@Scope原型注解创建的Bean不同

来源:互联网 发布:mysql dns反向解析 编辑:程序博客网 时间:2024/06/01 22:13

Spring 定义了很多的作用域:

单例(Singleton):在整个应用中只创建一次。默认作用域。

原型(Prototype):  每次注入或者通过Spring应用上下文获取的时候,都会创建一个Bean的实例。

会话(session):    Web应用中,为每个会话创建一个实例

请求(request):    Web应用中,为每个请求创建一个实例。


---------------------------------------------------------------------单例-------------------------------------------------------------------------


下面通过一个简单的例子来说明,该例子集合了上次文章的JavaConfig的代码进行修改,懒得再重写了。

package JavaZhuangpeiBean;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import soudSystem.CDPlayer;
import soudSystem.CompactDisc;
import soudSystem.SgtPeppers;

@Configuration
public class CDPlayerConfig2 {
@Bean
@Scope("prototype")-------------------------------------------每次创建的SgtPeppers的对象不一样
public SgtPeppers sgtPeppers(){
return new SgtPeppers();
}

@Bean
public CDPlayer cdplayer(SgtPeppers compactDisc){           //通过构造器将SgtPeppers的对象
return new CDPlayer(compactDisc);
}
 
@Bean
public CDPlayer anothercdplayer(SgtPeppers compactDisc){
return new CDPlayer(compactDisc);
}
}


以下通过Junit测试,从Spring容器中取出来的SgtPeppers的对象是否是一样的,如果不一样,则说明@Scope(“Prototype”)注解在每次将一个Bean注入到Spring容器的时候都创建了一个新的实例。

JavaZhuangpeiBean;

import static org.junit.Assert.*;

import org.junit.After;
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;

import soudSystem.CDPlayer;
import soudSystem.CDPlayerConfig;
import soudSystem.CompactDisc;
import soudSystem.SgtPeppers;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig2.class) 
public class CDPlayerConfig2Test {

@Autowired
private SgtPeppers compactDisc;

@Autowired
private CDPlayer cdplayer;

@Test
public void testCdplayer() {
System.out.println(compactDisc);
}

@Test
public void testAnothercdplayer() {
System.out.println(compactDisc);
}

}

运行结果:

soudSystem.SgtPeppers@6dc17b83
soudSystem.SgtPeppers@8dbdac1


总结:由结果可知,从Spring容器中取出来的对象实际是不一样的,因为在创建该对象的实例时就使用了@Scope("prototype")。



原创粉丝点击