Spring IOC(一)

一、容器概述

    ApplicationContext是Spring ioc容器实现的代表,它主要负责实例化、配置和组装Bean。容器通过读取配置元数据获取有关实例化、配置和组装哪些对象的说明。配置元数据可以使用XML、Java注解或Java代码来实现/它允许你处理应用程序的对象与其他对象之间的相互依赖关系。

  // 加载spring容器
//ApplicationContext spring的顶层核心接口
// ClassPathXmlApplicationContext 根据项目路径的xml配置来实例化spring容器
// FileSystemXmlApplicationContext 根据磁盘路径的xml配置来实例化spring容器/
/ AnnotationConfigApplicationContext 根据javaconfig 来配置实例化spring容器
// 在容器实例化的时候 就会加载所有的bean

//  创建Spring的上下文,加载所有的bean
ApplicationContext  ioc=new ClassPathXmlApplicationContext("spring-ioc.xml", "services.xml");

    容器的实例化:对象在Spring容器创建完成的时候就已经创建完成了,不是需要用的时候才创建的。

二、bean的概述

    2.1 获取bean:
        1.2.1  通过类来获取bean   eg.  User user = ioc.getBean(User.class);
        1.2.2  通过bean的名字或id来获取bean。eg. User user = (User)ioc.getBean("User");  【由于getBean里的参数是字符串形式的,Spring并不知道应该将结果转换成什么类型,所以这里需要进行一下强转】
        1.2.3 通过名字+类型获取bean。eg. User user = ioc.getBean("user", User.class);【这种方式与第一种还是有一定区别的如果当该类型不止配了一个bean,如果使用第一种方式的话,就会报错,因为他不知道找到的几个bean里要使用哪一个,这个时候就可以使用name+类型的形式了】
    2.2 bean的别名

// 给bean起别名有两种方式:
// 1、 使用name设置别名,该方式还可以设置多个别名,每个别名之间可以使用空格、分号、逗号中任意作为间隔
<bean class="com.engine.beans.User" id="user" name="user2 user3,user4;user5">   
    <description>用来描述一个Bean是干嘛的</description>
</bean>   

//2、一个设置bean别名的标签,alias有别名、化名的意思,name是bean的名字,alias是给这个bean取得别名。
<alias name="user" alias="engine"></alias>

三、依赖

    3.1 依赖注入
        基于setter方法的依赖注入

<!--   注: name属性对应的是set方法的名字 比如 setId -> name="id" setPassword -> name="password"    -->
<bean class="cn.engine.beans.User" id="user">
     <property name="id" value="1"></property>
     <property name="username" value="弼马温"></property>
     <property name="realname" value="孙悟空"></property>
</bean>

        基于构造方法的依赖注入
            1、基于name属性设置构造函数的参数
            2、可以只有value值,忽略name属性和其他属性。
                但是,如果省略name属性的话,一定要注意参数顺序,如果顺序与构造方法中的不一致,会造成赋值错误的情况。
                当然也是有解决办法的:
                    2.1 使用name属性
                    2.2 使用index属性,构造方法中的参数从0开始依次排序,在bean里按照这个顺序注入。
                    2.3 使用type属性,该类型只对错乱顺序的参数为类型不一致的情况有效,如果两个参数一致,则该属性解决不了。
            当然,我们最常用的还是name属性了,其他方式了解即可。

<bean class="cn.engine.beans.User" id="user">
     <constructor-arg name="id" value="1"></constructor-arg>
     <constructor-arg name="username" value="齐天大圣"></constructor-arg>
     <constructor-arg name="realname" value="孙悟空"></constructor-arg>
</bean>

    3.2 依赖和配置的细节

<!--复杂数据类型的依赖注入-->
<bean class="cn.engine.beans.Person" id="person">
     <property name="id" value="1"></property>
     <!--设置null-->
     <property name="name"> <null></null> </property>
     <property name="gender" value=""></property>
     <!--引用外部Bean-->
    <property name="wife" ref="wife"></property>
    <!--使用内部bean 依赖注入其他bean-->
     <property name="wife">
         <bean class="cn.engine.beans.Wife">
             <property name="age" value="18"></property>
             <property name="name" value="古力娜扎"></property>
         </bean>
     </property>
     <!--list 注入: 如果泛型是基本数据类型<value> 如果泛型是bean <bean>-->
     <property name="hobbies">
         <list>
             <value>唱歌</value>
             <value>跳舞</value>
         </list>
     </property>
     <!--map 注入 如果value是基本数据类型 <entry key="1" value="Java"></entry> ,如果value是bean value-ref-->
     <property name="course">
         <map>
             <entry key="1" value="Java"></entry>
             <entry key="2" value="数据库"></entry>
         </map>
     </property>
</bean>

    3.3 使用 depends-on 属性
        作用:控制加载顺序,当一个bean想让另一个bean在它之前加载的时候,可以设置depends-on,例如:

<bean class="cn.engine.beans.User" id="user" depends-on="book"></bean>
<bean class="cn.engine.beans.Wife" id="book"></bean>
//这样,book就是在user之前加载的

    3.4 懒加载bean
        作用:让当前的bean不再Spring容器加载的时候就加载,而是在使用的时候才去加载该bean。
            lazy-init="true",加上该属性即可。

<bean class="cn.engine.beans.Wife" id="wife" lazy-init="true"></bean>

4、bean的作用域

bean的作用域

    前两种是bean中比较常用的作用域,后四种需要结合web项目的时候才能使用。

作用域属性:scope
singleton 默认值 同一个id始终只会创建一次bean
prototype 多例(原型) 每一次使用都会创建一个bean
<bean class="cn.engine.beans.Person" id="book" scope="prototype" ></bean>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • 目录 1. Web MVC发展史历程2.Spring概要3.Spring-依赖注入概要(IOC)4.属性注入的三种...
    唯老阅读 808评论 0 2
  • 我们前面说过,Spring的IoC容器是一个IoC Service Provider,但是,这只是它被冠以IoC之...
    tracy_668阅读 634评论 0 0
  • Spring IOC 主要内容 Spring 框架 Spring 框架概念 ​ Spring 是众多开源java项...
    一纸油伞阅读 198评论 0 0
  • 1.1 spring IoC容器和beans的简介 Spring 框架的最核心基础的功能是IoC(控制反转)容器,...
    simoscode阅读 6,708评论 2 22
  • spring快速入门 本文参照狂神的视频编写https://www.bilibili.com/video/BV1W...
    Summer2077阅读 138评论 0 1