还是和上节一样,首先来看下配置类:MainConfig2

@Configuration

public class MainConfig2 { @Scope("singleton") // 默认就是单实例的
@Bean("person")
public Person person(){
System.out.println("给容器中添加Person....");
return new Person("张三", 25);
}
}

再看下person室实体类:

public class Person {

	private String name;
private Integer age;
private String nickName;
// 省略...
}

我们知道,在spring中bean默认是单实例的,所以@Scope("singleton")都一样,我们写个测试类测试一下

	@Test
public void test02(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
String[] definitionNames = applicationContext.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
} // System.out.println("ioc容器创建完成....");
// Object bean = applicationContext.getBean("person");
// Object bean2 = applicationContext.getBean("person");
// System.out.println(bean == bean2);
}

打印一下:

给容器中添加Person.... // 容器在一启动的时候便创建好了bean
mainConfig2 // 配置类本身也是bean
person

以上结果可以看出:

容器在一启动的时候便创建好了bean

我们再将注释放开

	@Test
public void test02(){
System.out.println("ioc容器创建完成....");
Object bean = applicationContext.getBean("person");
Object bean2 = applicationContext.getBean("person");
System.out.println(bean == bean2);
}

打印一下:

给容器中添加Person....
ioc容器创建完成....
true

可以得出,结果为true,说明两次获取的bean是一样的,证明了默认是单实例的,


其他保持不变,将@Scope("singleton")替换成@Scope("prototype")

执行下第一个测试方法:

mainConfig2
person

发现容器并没有创建,说明prototype作用域下,spring的bean不是随容器启动而创建的

再次执行两个两个测试方法:

	@Test
public void test02(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
String[] definitionNames = applicationContext.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
} System.out.println("ioc容器创建完成....");
Object bean = applicationContext.getBean("person");
Object bean2 = applicationContext.getBean("person");
System.out.println(bean == bean2);
}

打印结果:

mainConfig2
person
ioc容器创建完成....
给容器中添加Person....
给容器中添加Person....
false

观察结果说明:获取bean的时候,才动态的创建了bean,并且两个bean不相等,也说明了此时bean是多实例的,自然不相等。


另外其实spring中bean的作用域不止这两种,

spring官方文档描述如下:前两种比较常用,后面的几种几乎用不上

@Scope:调整作用域
prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。
每次获取的时候才会调用方法创建对象;
singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。
以后每次获取就是直接从容器(map.get())中拿,
request:同一次请求创建一个实例
session:同一个session创建一个实例

另外还有需要一提的是,,如果想要单实例,在ioc容器创建的时候不加载,而是在第一次使用bean的时候才加载,可以使用@Lazy注解,加在配置类中创建bean的方法上,加了这个注解后,对于单实例,只会在第一次使用bean的时候加载bean

加油,晚安!

三、Spring的@Scope设置组件作用域的更多相关文章

  1. (三)Spring 高级装配 bean的作用域@Scope

    1.默认情况下,spring通过@Autowared注入的bean是单例的bean,但有些情况是不满足的,例如:购物车,每个会话,或每个用户登录使用的购物车都是独立的 spring的定义的作用域: a ...

  2. Spring注解开发系列Ⅰ--- 组件注册(上)

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...

  3. 【Spring注解驱动开发】使用@Scope注解设置组件的作用域

    写在前面 Spring容器中的组件默认是单例的,在Spring启动时就会实例化并初始化这些对象,将其放到Spring容器中,之后,每次获取对象时,直接从Spring容器中获取,而不再创建对象.如果每次 ...

  4. spring中scope作用域(转)

    今天研究了一下scope的作用域.默认是单例模式,即scope="singleton".另外scope还有prototype.request.session.global sess ...

  5. Spring揭秘 读书笔记 三 bean的scope与FactoryBean

    本书可作为王富强所著<<Spring揭秘>>一书的读书笔记  第四章 BeanFactory的xml之旅 bean的scope scope有时被翻译为"作用域&quo ...

  6. spring之scope作用域

    spring中,bean的作用域有五种类型:默认是单例模式,         singleton         prototype         request         session   ...

  7. Spring Bean Scope (作用域)

    singleton: 单例模式,针对每个spring容器,只有一个该类的实例被管理,每次调用此实例都是同一个对象被返回,所以适用于无状态bean.默认情况下,singleton作为spring容器中b ...

  8. spring中@Scope控制作用域

    注解形势:通过@Scope注解控制作用域,默认使用单实例模式,可修改为多实例模式 /** * Specifies the name of the scope to use for the annota ...

  9. spring中scope(作用越)理解

    今天总结了一下spring中作用域scope的用法.在spring中作用域通过配置文件形式的用法如下. <bean id="role" class="spring. ...

随机推荐

  1. volatile原理

    内存可见性 内存可见性相关概念:线程对共享变量修改的可见性.当一个线程修改了共享变量的值,其他线程能够立刻得知这个修改. 后面会继续总结一篇<Java内存模型(JMM)总结>以详细描述内存 ...

  2. Spring boot jpa 设定MySQL数据库的自增ID主键值

    内容简介 本文主要介绍在使用jpa向数据库添加数据时,如果表中主键为自增ID,对应实体类的设定方法. 实现步骤 只需要在自增主键上添加@GeneratedValue注解就可以实现自增,如下图: 关键代 ...

  3. 决策树——C4.5

    -- coding: utf-8 -- """ Created on Thu Aug 2 17:09:34 2018 决策树ID3,C4.5的实现 @author: we ...

  4. LeetCode 785. Is Graph Bipartite?

    原题链接在这里:https://leetcode.com/problems/is-graph-bipartite/ 题目: Given an undirected graph, return true ...

  5. 用TortoiseSVN从github下载单个文件

    问题描述: github是一个很好的共享代码管理仓库,我们可以从github上直接以压缩包的形式直接download整个项目,也可以通过git,用git clone + URL 命令下载整个目录. 但 ...

  6. Greenplum 6 新功能 在线扩容工具GPExpand (转载)

    Gpexpand是Greenplum数据库的扩容工具,可以为集群增加新节点从而可以存储更多的数据,提供更高的计算能力.Greenplum 5及之前,集群扩容需要停机增加新节点,然后对表数据做重分布.因 ...

  7. Pivotal Greenplum 6.0 新特性介绍

    Pivotal Greenplum 6.0 新特性介绍   在1月12日举办的Greenplum开源有道智数未来技术研讨会上,Pivotal中国研发中心Greenplum 产品经理李阳向大家介绍了Pi ...

  8. BZOJ 5287: [Hnoi2018]毒瘤 动态dp(LCT+矩阵乘法)

    自己 yy 了一个动态 dp 做法,应该是全网唯一用 LCT 写的. code: #include <bits/stdc++.h> #define ll long long #define ...

  9. telegraf 学习三 telegra inputs.net_response + smtp2http+ grafana 进行tcp服务状态监控

    以下演示一个简单的使用telegra inputs.net_response 进行tcp 服务状态的监控,统计集成grafana 的alert 为了方便使用了一个smtp2http 的服务,对于htt ...

  10. 搭建的一套vue打包方案,方便记录一下

    package.json 配置如下: { "name": "rise-vue", "version": "1.0.0", ...