[1] SpringIOC创建对象的单例和多例模式

问题:

Spring容器对象根据配置文件创建对象的时机默认发生在Spring容器对象在被创建的时候,也就是说,我们一旦获取到Spring容器对象,意味着可以直接获取Spring容器中的对象使用了.那么,如果我对同一个bean对象,连续获取N次,获取到的是不是同一个对象呢?因为spring容器对象底层使用的是map集合存储的bean对象,对map集合按照同一个键名获取数据,获取的是同一个,也就说按照同一个键名从Spring容器中获取的都是同一个对象,那么如果我们希望相同的键名获取的对象每次都不一样,怎么实现?

解决:

不要在Spring容器对象创建的时候,就完成对象的初始化创建,而是变为,从Spring容器中获取的时候才创建,每次获取都重新创建.

实现:

Spring容器的单例和多例模式创建对象. 单例模式(默认):
设置了单例模式的bean,会在Spring容器对象被创建的时候 就完成初始化创建,无论获取多少次都是同一个对象. 多例模式:
设置了多例模式的bean,在Spring容器对象被创建的时候不会被初 始化创建,每次获取的时候都会重新创建,每次获取的对象都不相同.

使用:

applicationcontext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--SpringIOC设置对象的单例模式和多例模式创建对象单例模式:默认模式,在bean标签上使用scope属性,默认值为singleton多例模式:在bean标签上使用scope属性设置,值为prototype--><bean id="stu" class="com.java.pojo.Student" scope="singleton"></bean><bean id="tea" class="com.java.pojo.Teacher" scope="prototype"></bean>
</beans>TestIocModel
package com.java.controller;
import com.java.pojo.User;
import com.java.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.async.WebAsyncUtils;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.rmi.CORBA.StubDelegate;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet(value = "/user", loadOnStartup = 1)
public class UserServlet extends HttpServlet {public static void main(String[] args) {//获取Spring容器对象ApplicationContext ac = new ClassPathXmlApplicationContext("applicationcontext.xml");Student stu =(Student) ac.getBean("stu");Student stu2 =(Student) ac.getBean("stu");Teacher teacher = (Teacher) ac.getBean("stu");Teacher teacher2 = (Teacher) ac.getBean("stu");System.out.println("学生:"+(stu==stu2));System.out.println("教室:"+(teacher==teacher2));}
}

[2] SpringIOC的自动注入

问题:

在学习了SpringIOC的DI依赖注入后,我们可以根据对象之间的依赖关系的 责任链,让Spring容器对象帮我们创建有一个组装好的对象,比如A中有B,B 中有C,C中有D.将A,B
,C,D都创建为Bean对象,然后使用ref属性告诉Spring 对象之间的依赖关系的组装规则,假如依赖责任链特别长,使用ref注入就会很 麻烦.怎么办?

解决:

不要声明ref属性来指明依赖关系的注入,只需要告诉Spring容器对象依赖关 系的注入规则,Spring容器对象自动根据规则完成依赖关系的注入.

实现:

①根据bean的ID和属性名一致的规则
②根据bean的类型和属性的类型一致的规则
③根据构造器形参的类型和bean的类型一致的规则
④不能使用自动注入,只能手动声明
⑤使用默认规则

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"default-autowire="byName"><!--设置自动注入--><!--自动注入:在标签上使用autowire属性设置自动注入规则.该属性声明在要注入资源的bean标签上,比如:学生的beanautowire属性的值:byName:按照属性名和某个bean的id相同的规则自动注入byType:按照属性的类型和某个bean的类型相同的规则自动注入.注意:同类型的bean只能有一个,否则报错.constructor:必须声明对应的构造器,根据构造器形参的类型和某个bean的类型相同的规则自动注入.no:不使用自动注入,必须使用ref手动注入.default:使用默认注入规则.默认值.注意:可以在beans顶层元标记中使用属性default-autowire声明全局自动注入规则.--><bean id="stu" class="com.java.pojo.Student" autowire="byName"><!--用构造器的方法,此处要创建一个只有Teacher一个参数的构造器--><!--<constructor-arg index="0" type="com.Teacher"  ref="tea"></constructor-arg>--><property name="sid" value="1"></property><property name="sname" value="张三"></property></bean><bean id="teacher" class="com.bjsxt.pojo.Teacher"><property name="tname" value="liu"></property><property name="tid" value="1"></property></bean>
</beans>

SpringIOC的创建对象的单例多例模式和自动注入相关推荐

  1. Spring框架,IOC,DI,AOP,单例多例,懒加载

    文章目录 1.Spring 2.IOC 2.1 什么是IOC 2.2 xml配置文件管理对象 2.3 全注解的方式管理对象 3.Spring创建对象-工厂模式(必会内容) 4.单例与多例 4.1@Sc ...

  2. Redis 单例、主从模式、sentinel 以及集群的配置方式及优缺点对比(转)

    摘要: redis作为一种NoSql数据库,其提供了一种高效的缓存方案,本文则主要对其单例,主从模式,sentinel以及集群的配置方式进行说明,对比其优缺点,阐述redis作为一种缓存框架的高可用性 ...

  3. 自动注入、加载 properties 文件、scope 属性、单例设计模式

    一.自动注入 在 Spring 配置文件中对象名和 ref="id"id 名相同使用自动注入,可以不配置<property/> 两种配置办法 2.1 在<bean ...

  4. Redis 单例、主从模式、sentinel 以及集群的配置方式及优缺点对比

    点击关注公众号,利用碎片时间学习 来源:blog.csdn.net/xsxy0506/article/details/117321181 redis作为一种NoSql数据库,其提供了一种高效的缓存方案 ...

  5. python编程300例_经典编程100例——python版(例9例10)

    最近事情比较多,python还在学习之中,更新速度慢了一些.今天就2例. 例9:一个数如果恰好等于它的因子之和,这个数就称为"完数".如6=1+2+3.编程找出1000之内所有的完 ...

  6. python小游戏编程100例_经典编程100例——python版(例9例10)

    最近事情比较多,python还在学习之中,更新速度慢了一些.今天就2例. 例9:一个数如果恰好等于它的因子之和,这个数就称为"完数".如6=1+2+3.编程找出1000之内所有的完 ...

  7. 卡尔曼滤波器(8) -- 一维卡尔曼滤波器(例7例8)

    This blog is translated from https://www.kalmanfilter.net/default.aspx. It's an excellent tutorial a ...

  8. 卡尔曼滤波器(4) -- α−β−γ滤波器(例3例4总结)

    This blog is translated from https://www.kalmanfilter.net/default.aspx. It's an excellent tutorial a ...

  9. 柔性车间调度问题丨一种贪婪策略的应用:以算例MK02例

    车间调度系列文章: 1.车间调度的编码.解码,调度方案可视化的探讨 2.多目标优化:浅谈pareto寻优和非支配排序遗传算法-NSGAII的非支配排序及拥挤度 3.柔性车间调度问题:以算例MK01初探 ...

最新文章

  1. 什么是 “进程、线程、协程”?
  2. vue vuex vue-router后台项目——权限路由(超详细简单版)
  3. 图解kafka - 设计原理解析
  4. 多次执行sql 后卡住_解Bug之路记一次中间件导致的慢SQL排查过程
  5. linux怎么让cat运行,使用lolcat让你的Linux命令行出现七彩虹
  6. 【mybatis】一对一关联查询
  7. 88. [ExtJS2.1教程-5]ToolBar(工具栏)
  8. python qq邮箱发邮件_Python用QQ邮箱发邮件的实例教程
  9. 【渝粤教育】国家开放大学2018年春季 0692-21T化工设备机械基础 参考试题
  10. springmvc或者springboot 中实现跨域的5种方式
  11. (最新版2020)Java环境变量配置
  12. 用html5制作古诗,古诗词书签制作
  13. 上周四的复盘 | 市场回暖了?割肉吗?
  14. 我是猫,一只特立独行的猫
  15. 白嫖党最爱!撸了郭霖大神写的Framework源码笔记,最强技术实现
  16. c语言二级指针与二维数组
  17. 华为台式机擎云W515 PGUV-WBY0安装银河麒麟V10
  18. 修改手机开机Logo界面(Redmi Note 7)
  19. AndroidStudio 更换炫酷的主题
  20. ROS里程计的学习(odometry) (三)

热门文章

  1. Python--第2次平时作业
  2. 常见的NoSQL数据库
  3. Codeforces Round #712 (Div. 2) F. Flip the Cards 思维 + 贪心
  4. 2016中国大学生程序设计竞赛(长春)Sequence II HDU - 5919 主席树
  5. 【CF1311E】Construct the Binary Tree【增量构造】【复杂度证明】
  6. P6669 [清华集训2016] 组合数问题
  7. H - Checker FZU - 2041
  8. P4178 Tree
  9. 牛客题霸 [ 大数加法]C++题解/答案
  10. 牛客题霸 [ 求路径] C++题解/答案