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

本文通过一个实例展示了Spring中的原型(Prototype)作用域,每次注入或获取时都会创建新的Bean实例。通过测试验证了@Scope("prototype")注解的确在每次请求时产生不同的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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")。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值