Ioc实现对象实例化,不采用new  Class的方式,这就是控制反转:由容器(spring)完成对象的实例化过程。

在使用bean之前,要在beans.xml文件中配置好各个bean的属性,并建立bean与bean之间的关系;可以使用多个类似beans.xml的配置文件。

BeanFactory使得IOC管理不同类型的对象成为可能,ApplicationContext在BeanFactory的基础上提供实用功能,一般称BeanFactory为IoC,采用java的反射和代理机制。

IoC的初始化

BeanFactory的初始化类:XmlBeanFactory该类已过时

ApplicationContext的初始化类:1.优先使用  ClassPathXmlApplicationContext     (xml放在src目录下)

同时启动几个beans.xml文件:new ClassPathXmlApplicationContext(new String[]{"conf/beans1.xml","conf/beans2.xml"});

2.使用 FileSystemXmlApplicationContext   (支持相对路径和绝对路径)

3.WebApplicationContext(使用较少)

获取beans.xml文件后,使用getBean(”id“)就可以返回对象实例了,在这个获取文件份过程中,IOC会实例化所用单例id对象,所以在第一次读取beans.xml文件时会花费相对多点的时间,而后访问就不会花费额外的时间了。

ps:基于注解的配置方式:@Configuration

简单的实例:<bean id = "user" class ="org.nick.demo.User"/> 这是没有给对象属性赋值的简单实例化。

在beans.xml中id是唯一的,而使用name可以是多个,返回的实例是最后声明的那个bean,不建议使用name代替id;

可以为同一个对象配置几个name,如<bean name="name1,name2,name3" class="org.nick.demo.User"/>

如果是<bean class="org.nick.demo.User"/>这样没有指定id和name,则要使用getBean("org.nick.demo.User")全域来获取,这种属于匿名对象。

如果出现多个同类的匿名对象,使用getBean("org.nick.demo.User");getBean("org.nick.demo.User#1");getBean("org.nick.demo.User#2")来获取;

基于xml配置;

属性注入:

实例化对象过程中采用set方法和构造方法对属性进行赋值,ioc的配置方法也不一样:

setter: <propertyname="userName"value="张飞"></property>

constructor:<constructor-arg type="java.lang.String" value="张飞"></constructor-arg>

注意:参数的类型和位置,最好指明参数的位置:<constructor-arg type="java.lang.String"  index="0" value="张飞"></constructor-arg>

当两个对象的构造方法中互含对方作为参数(ref=""),就会造成ioc不能启动,就必须使用set方式注入;

属性注入详解

1、字面值

如  <value>张飞</value>

<value><![CDATA[张飞2*3=89]]>引入cdata是让xml解析器将【】内的字符串当做普通的字符串,以防止不能正常解析。

2、引用其他bean

如<ref bean="user"/> 可以引用本xml文件和父xml中的bean

<ref local="user"/>只可以引用本xml文件中的bean

<ref parent="user"/>只能引用父xml中的id="user"的bean

设定父xml:

ClassPathXmlApplicationContext  parentXml = new ClassPathXmlApplicationContext ("conf/beans1.xml");

ClassPathXmlApplicationContext  sonXml= new ClassPathXmlApplicationContext ("conf/beans2.xml",parentXml);

注意这是将一个对象放在构造器里的,而不是一个文件地址,与前面同时读取不同;

3、List集合,对String[],int[]数组同样适用

<property name="list">

<list>

<value>刘备</value>                                         &&   <ref bean=”user1“/>

<value>关羽</value>                                         &&   <ref bean=”user2“/>

<value>张飞</value>                                         &&   <ref bean=”user3“/>

</list>

</property>

4、Map集合

<property name="maps">

<map>

<entry>

<key><value>org1</value> </key>                                        &&   <key><ref bean="name"/></key>

<value>微软</value>                                                              &&   <ref bean=”org“/>

</entry>

<entry>

<key><value>org2</value> </key>

<value>google</value>

</entry>

</map>

</property>

5、Properties集合

Properties是Map的特例,key和value都必须为字符串;

Properties ps = new Properties();

<property name="ps">

<props>

<prop key="firstName">张飞</prop>

<prop key="secondName">张雨</prop>

</props>

</property>

注:没有value标签

配置集合bean,供其他bean调用:

beans.xml中添加

xmlns:util="http://www.springframework.org/schema/util"
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"

1、List

<util:list id="favoriteList1" list-class="java.util.LinkedList">
<value>看报</value>
<value>赛车</value>
<value>高尔夫</value>
</util:list>

2、Set

<util:set id="favoriteSet1"  >
<value>看报</value>
<value>赛车</value>
<value>高尔夫</value>
</util:set>

3、Map

<util:map id="emails1" >
<entry key="AM" value="会见客户" />
<entry key="PM" value="公司内部会议" />
</util:map>

以上都可以适用<ref bean   >标签

简化配置 就是将property简写为p

假如标签库:

xmlns:p="http://www.springframework.org/schema/p"

如:<bean id="user" class="org.nick.demo.User"    p:userName="skx" p:age="28" p:sex="male"/>

引用: p:organize_ref=”sx“

***基于注解配置,实际开发中常用,放在class的上一行

@Component       通用

@Repository        用于model

@Service             用于dao,用的较少

@Controller       用于springMVC

推荐使用特定用途的注解

使注解生效,添加context标签:

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-3.1.xsd

<context:component-scan base-package="org.nick.dao"/>   扫描包下的所有类,使得spring注解生效

1、只希望扫描特定的包:

<context:component-scan base-package="org.nick" resource-pattern="action/*.class"/ >

2、包含目标类和排除目标类,p56

<include-filter....

<exclude-filter...

&注解:自动装配

通过@Autowired注解实现bean的注入,在Bean的配置信息中匹配查找bean,仅但有一个bean匹配时,才将其注入到@Autowired标注的变量中。

这里的匹配不是按照id名匹对的,而是按照匿名类匹对的。

注:如果这个Bean配置信息中没用一个匹配的bean,Ioc容器会抛出一个NoSuchBeanDefinitionException,可以使用:

@AutoWired(required=false) 表示没有找到也不抛出异常的处理方式

注:如果IoC容器中有多个匹配的bean(有多个同类型的对象),就需要使用name名匹对:

如:@Autowired

@Qualifier("name")

自动装配不仅对变量进行标注也可对方法进行标注:

对方法进行标注 是将bean作为参数供方法使用:入参

如:@Autowired

public   calculate (User skx){}               //就会将User的匿名对象入参

也可使用Qualifier指定一个bean

如:@Autowired

@Qualifier("skx")

public   calculate (User skx){}               //就会将skx的bean入参

或者

@Autowired

public   calculate (@Qualifier("skx")User skx){}               //就会将skx的bean入参

注:在配置Bean配置信息时,大多时候类型是单实例的,所以一般不会使用@Repository、@Service、@Qualifier

前面讲了xml对beans的配置,也可以在一个java类中进行Bean配置:@Configuration(用的较少)

1、spring之Ioc 原理应用相关推荐

  1. Java:Spring的IOC原理(大白话解释)

    先行参考以下半成品文章和参考链接,待学完课程后续整理此文章 IOC和DI关系 IOC:Inversion of Control,控制反转 DI:Dependency Injection,依赖注入 关系 ...

  2. Spring的IOC原理[通俗解释一下]

    2019独角兽企业重金招聘Python工程师标准>>> 本文系转载,个人认为,这篇文章对IOC原理讲的比较清楚,通俗易懂,值得一看. 原文地址:http://blog.csdn.ne ...

  3. spring的IOC原理,容器管理的bean类型、bean的生命周期

    1.什么是IOC (1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理 (2)使用 IOC 目的:为了耦合度降低 为什么IOC可以极大的降低耦合度? (1)原始版:一般我们想使 ...

  4. Spring的IOC原理

    1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...

  5. Spring的IOC原理(通俗解释)

    1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...

  6. Spring的IOC原理以及思维导图

    Spring知识细节的思维导图 控制反转 spring ioc容器 在Spring框架中的核心组件只有三个:Core.Context和Bean.它们构建起了整个Spring的骨骼架构,没有它们就不可能 ...

  7. Spring的IOC原理(通俗易懂)

    1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由Ñ个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 如果我们打开机械式手表的后盖,就会看到与上 ...

  8. 通俗解释一下Spring的IOC原理

    1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...

  9. Spring分析之IOC原理

    序言 无论是工作还是面试,少不了Spring相关的知识,例如spring的IOC原理,我们在工作中利用spring提供的接口做一些事情,例如InitializingBean接口,通过实现该接口,在实例 ...

最新文章

  1. ue4android相机拍照插件,cordova-plugin-camera相機插件使用
  2. 判断TImage图片的类型
  3. Android NDK的生命周期JNI_OnLoad与JNI_OnUnload(转)
  4. 博后招募 | 西湖大学工学院蓝振忠深度学习实验室招募博士后
  5. Linux环形缓冲区原理
  6. 跟想这台计算机usb无法识别,无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WINDOWS无法识别...
  7. HTML-图像,音频,视频和路径
  8. mysql中delete,truncate,drop区别
  9. 计算机扫描的配置文件在哪里找,打印机扫描文件到电脑哪里找
  10. 802.11协议精读1:学习资料整理
  11. 按照计算机病毒存在,下列选项中,不属于按照计算机病毒存在的方式分类的是()。 - 问答库...
  12. Attention Mechanisms in Computer Vision: A Survey(四)
  13. 深度学习-43:长短时记忆神经网络(LSTM)
  14. es文件创建局域网服务器,大神来教你XBMC和ES文件浏览器局域网共享
  15. 【2021CCF基线系统】基于飞桨实现系统认证风险预测-异常检测
  16. U盘安装ubuntu(双系统共存)
  17. 计蒜客信息学入门赛 #17--B
  18. Python使用OpenCV处理图片通道数
  19. AltiumDesigner 18 3D模式操作
  20. Docker数据管理 Named volume

热门文章

  1. 就是把QQ拖到显示器顶端QQ就隐藏了,鼠标指上去就出现了。
  2. 普通Maven项目打包含依赖和不含依赖
  3. 详教腾讯云搭建Linux环境(点对点超详教程)
  4. Movavi HD Video Converter for Mac (优秀的视频格式转换工具) v22.1
  5. 一个不错的笑話哦⋯⋯很有意思的双关语
  6. 跨境电商ERP软件方案丨汇信软件
  7. c++:内联函数详解和普通函数的区别
  8. 从其他应用切换回Unity使用VS的devenv.com自动编译Assets外部的C#工程(需含有.sln)
  9. 17岁高中生制作世界上最大的新冠追踪网站之一,被CDC表扬
  10. python正余弦函数_Python绘制正余弦函数图像的方法