bean scope属性

singleton单例

singleton是容器默认的scope,所以写和不写没有区别。scope为singleton的时候,在Spring的IoC容器中只存在一个实例,所有对该对象的引用将共享这个实例。该实例从容器启动,并因为第一次被请求而初始化后,将一直存活到容器退出,也就是说,它与IoC容器“几乎”拥有相同的寿命

  • 对象实例数量:singleton类型的bean定义,在一个容器中只存在一个共享实例,所有对该类型bean的依赖都引用这一单一实例
  • 对象存活时间:singleton类型bean定义,从容器启动,到它第一次被请求而实例化开始,只要容器不销毁或退出,该类型的单一实例就会一直存活

优点:

在单例模式下,可以减少每次创建对象的内存空间,减少CPU的计算资源。

全局只有一个对象,当多次调用该对象时,会不会出现堵塞现象?

singleton在容器是单例多线程执行,不会造成堵塞

缺点:

存在线程安全风险。

演示:

当由两个任务需要调用a对象的num属性时,任务A在调用setNum(1),同时任务B调用setNum(2),再次之后任务A调用getNum()输出a的num时却不是1,而是2。

prototype多例

对于那些请求方不能共享的对象实例,应该将其bean定义的scope设置为prototype。这样,每个请求方可以得到自己对应的一个对象实例。通常,声明为prototype的scope的bean定义类型,都是一些有状态的,比如保存每个顾客信息的对象

缺点:

prototype在容器中多实例,占用更多资源。

优点:

不存在线程安全问题。

singleton与prototype对比

singleton prototype
对象数量 全局唯一 存在多个
实例化时机 IoC容器启动时 getBean()或对象注入时
线程安全问题 存在 不存在
执行效率

基于注解与java config配置IoC容器

基于注解的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/></beans>

组件类型注解

这四个注解,均使用在类上

@Component 组件注解,通过注解,被该注解描述的类将被IoC容器管理并实例化

@Controller 语义注解,说明当前类是MVC应用中的控制器类

@Service 语义注解,说明当前类是Service业务服务类

@Repository 语义注解,说明当前类用于业务持久层,通常描述对应Dao类

开启组件扫描

<!--XML配置开启组件扫描,才能使用注解-->
<context:component-scan base-package="package"><!--排除某些类--><context:exclude-filter type="regex" expression="Class"/>
</context:component-scan>

组件类型注解默认beanId为类名首字母小写;
使用注解的value属性修改beanId。

自动装配注解

按类型装配:

@AutoWired 按容器内对象类型动态注入属性,由Spring机构提供

@Inject 基于JSR-330标准,其他通@AutoWired,但不支持required属性

按名称装配:

@Named 与@Inject配合使用,JSR-330规范,按属性名自动装配属性

@Resource 基于JSR-250规范,优先按名称、再按类型智能匹配

@AutoWired

如果注解放在set方法上,则自动按类型/名称对set方法参数进行注入

如果注解放在属性上,spring IoC容器会自动通过反射技术将属性private修饰符自动改为public,直接进行赋值

@Resource

  1. @Resource设置name属性,则按name在IoC容器中将bean注入

  2. @Resource未设置name属性

    1. 以属性名作为bean name在IoC容器中匹配bean,如有匹配则注入
    2. 按属性名未匹配,则按类型进行匹配,同@AutoWired,需要加入@primary解决类型冲突

在使用@Resource对象时推荐设置name或保证属性名与bean名称一致

元数据注解

为spring IoC容器管理对象时提供一些辅助信息

@Primary 按类型装配时出现多个相同类型对象,拥有此注解对象被优先注入

@PostConstruct 描述方法,相当于XML中init-method配置的注解版本

@PreDestroy 描述方法,相当于XML中destroy-method配置的注解版本

@Scope 设置对象的scope属性

@Value 为属性注入静态数据

基于java Config配置IoC容器

优势

完全摆脱XML的束缚,使用独立java类管理对象与依赖

注解配置相对分散,利用java Config可对配置集中管理

可以在编译时进行依赖检查,不容易出错

java Config核心注解

@Configuration 描述类,说明当前类是Java Config配置类,完全替代XML文件

@Bean 描述方法,方法返回对象将被IoC容器管理,beanId默认为方法名

@ImportResource 描述类,加载静态文件,可使用@Value注解获取

@ComponentScan 描述类,同XML的 <context:compoment-scan> 标签

Spring-IoC-03相关推荐

  1. spring ioc di 原理解析

    spring ioc原理(看完后大家可以自己写一个spring) 控制反转/依赖注入 其实这个Spring架构核心的概念没有这么复杂,更不像有些书上描述的那样晦涩.Java程序员都知道:java程序中 ...

  2. Spring IOC 容器源码分析

    Spring IOC 容器源码分析 创建时间: 2017-11-15 00:00:00 [TOC] Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring ...

  3. 小马哥spring编程核心思想_求小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework教程...

    这次搜集了下小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework,最强Spring全面核心实战的视频教程,有需要的朋友可以自行下载学习. 课程简介: 小马哥出手的Sp ...

  4. spring IOC创建对象方式

    spring IOC创建对象方式 通过无参构造来创建 验证方法: 创建实体类: public class User {private String name;public User() {System ...

  5. spring ioc原理分析

    spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...

  6. Spring IoC是如何进行依赖注入的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 依赖注入(DI) DI(Dependency Injection) ...

  7. 面试被问烂的 Spring IOC(求求你别再问了)

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 作者:莫那·鲁道 链接:http://thinkinjava.cn 广义的 IOC IoC(Inv ...

  8. spring根据名称获取bean_带你从零开始手写 spring ioc 框架,深入学习 spring 源码

    IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...

  9. 还不懂spring IOC核心原理?200行代码带你手撸一个

    Spring做为Java企业级应用的开源开发框架,早已成为Java后端开发事实上的行业标准,无数的公司选择Spring作为基础的开发框架. 使用Spring框架的人一定都听过Spring的IoC(控制 ...

  10. 头条一面:Spring IOC容器中只存放单例Bean吗?

    最近,很多小伙伴出去面试,感觉自己面的不是很理想,回来后,不少小伙伴把面试题做了记录发给我,让我给大家解析下,然后发出来.当我看到这些面试题时,快速在脑海中构建起了整个知识体系,从基础到框架.从分布式 ...

最新文章

  1. 九爷带你了解 nginx 日志配置指令详解
  2. Git详解之五 分布式Git
  3. python 预测足球_利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!...
  4. express ajax分页实例,element+express+mongoose实现分页查询
  5. Vue+Openlayers实现绘制线段并测量距离显示
  6. checkbox全选 js
  7. 面试中 项目遇见的难点答案_2019 百度、头条、小米、360、网易、拼多多等公司 Android 社招面试心得...
  8. Windows核心编程_判断是否管理员权限运行
  9. matplotlib学习
  10. 云服务器ASF挂卡(1)——steamcommunity社区本地反代
  11. 拆解ONES,从ONES深挖项目研发管理机制
  12. VMWare虚拟机序列号大全
  13. bugku ctf 备份是个好习惯 (听说备份是个好习惯)
  14. Linux/docker下mysql创表自动大写
  15. mysql 99乘法表_MySQL 通过sql输出99乘法表
  16. windows10系统如何设置开机自启动
  17. 流行手机谜语大解密 (爱情诗)
  18. JZ4 重建二叉树--java实现
  19. 安徽省软考报名时间成绩查询安徽省教育考试院安徽省人事考试网报名入口
  20. 如何证明函数有界_科技界正在抓住机会来证明不平等

热门文章

  1. 怎么渗透验证 mysql_mysql-渗透测试
  2. 读书札记--《金庸评传》
  3. **图片元信息Exif**
  4. OnInit和OnLoad
  5. 新手操作更换固态和重装系统竟然这么麻烦?!
  6. 【speach】语音信号基础
  7. 自动控制原理笔记-线性系统的稳态误差
  8. vscode调试js
  9. 小红旗图标在excel如何输入_Excel用条件格式给数据插上小红旗
  10. MATLAB中的eig函数