IoC(Inversion of Control)称之为控制反转,指的是在Spring框架的配置文件中声明对象,由框架负责创建对象,这叫做控制反转。实现方式有两种:DI(Dependency Injection)依赖注入,这也是Spring框架的实现方式,主要学习的也是这个;SL(Service Locator)服务器定位器实现方式。

DI依赖注入,就是框架不仅创建了对象,而其还负责初始化相关联的对象的过程。从实现方式上也分为3种方式:

a,Interface Injection(接口注入):容器运行时,目标对象实现特定的接口,然后容器通过接口将关联对象注入到目标对象中。这种方式Spring框架不支持,所以了解。

b,Setter Injection(set方法注入):容器运行时,通过类属性的set方法将关联对象注入到目标对象中。Spring框架支持,而且是我们开发经常使用的,非常重要。

c,Constructor Injection(构造方法注入):容器运行时,通过类的构造方法将关联对象注入到对象中。Spring框架也支持,没有set用的普遍。

好,下边主要总结一下set方法注入和构造方法注入。

一,Setter Injection:

1,当属性为简单字符串时,可以直接增加property标签:例如:

privateString usercode ;

privateString userpswd ;

setter方法: 是配置文件中property标签的name属性值的set方法

[html] view plaincopy print?
  1. <span style="font-size:18px;">          <bean id="loginAction" class="com.bjpowernode.struts2.action.LoginAction" >
  2. <property name="usercode" value="admin"></property>
  3. <property name="userpswd" value="admin"></property>
  4. </bean>
  5. </span>

2,属性值为引用类型时,通过property中的ref属性来关联对象:

privateUserService userService;

setter方法

[html] view plaincopy print?
  1. <span style="font-size:18px;">  <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
  2. <property name="userService" ref="userService"></property>
  3. </bean>
  4. <bean id="userService" class="com.ljh.struts2.service.UserService"></bean>  </span>

3,属性为数组类型时,需要在设置属性值时,将多个元素通过逗号隔开,或者利用list标签:

privateString[] names ;

setter方法

[html] view plaincopy print?
  1. <span style="font-size:18px;">      <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
  2. <property name="names" value="zhang,san,lisi,wangwu"></property>
  3. </bean>
  4. </span>

如果赋值操作中,需要将逗号作为一个整体,那么需要通过特殊的标签进行赋值

[html] view plaincopy print?
  1. <span style="font-size:18px;">      <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
  2. <property name="userService" ref="userService"></property>
  3. <property name="names">
  4. <list>
  5. <value>zhang,san</value>
  6. <value>lisi</value>
  7. <value>wangwu</value>
  8. </list>
  9. </property>
  10. </bean></span>

4,属性为list集合时,也是使用list标签:

集合如果使用泛型,只能存储相同类型的元素,不使用泛型,可以存储不同类型的元素:

privateList<String> nameList ;

setter方法

[html] view plaincopy print?
  1. <span style="font-size:18px;">              <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
  2. <property name="nameList">
  3. <list>
  4. <value>zhang,san</value>
  5. <value>lisi</value>
  6. <value>wangwu</value>
  7. </list>
  8. </property>
  9. </bean>   </span>

5,当属性为map集合时,需要使用map标签:

Private Map map ;

setter方法

[html] view plaincopy print?
  1. <span style="font-size:18px;">      <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
  2. <property name="map">
  3. <map>
  4. <entry key="hello" value="world"></entry>
  5. <entry key-ref="userService" value-ref="userService"></entry>
  6. </map>
  7. </property>
  8. </bean>
  9. <bean id="userService" class="com.ljh.struts2.service.UserService"></bean></span>

6,属性为Properties集合类型时,需要在设置属性值时,增加props标签

privateProperties props ; //继承了Hashtable,是线程安全的

setter方法

[html] view plaincopy print?
  1. <span style="font-size:18px;">          <bean id="loginAction" class="com.bjpowernode.struts2.action.LoginAction" >
  2. <property name="props">
  3. <props>
  4. <prop key="url">jdbc:oracle:thin:@192.168.1.27:1521:ljh</prop>
  5. <prop key="driverName">oracle.jdbc.driver.OracleDriver</prop>
  6. <prop key="username">scott</prop>
  7. <prop key="password">tiger</prop>
  8. </props>
  9. </property>
  10. </bean></span>

总结:以上为几种常用属性类型的set注入的写法,set方法注入,框架是先通过默认的无参构造方法进行创建对象,然后进行set注入的。当然如果我们重写了构造方法,没有了无参构造呢?这就需要下边的构造方法注入了。

二,Constructor Injection

1,例如我们声明了有参构造方法,就需要通过次构造方法进行创建对象和关联对象了,利用constructor-arg标签:

[java] view plaincopy print?
  1. <span style="font-size:18px;">//无参构造方法      public LoginAction(String usercode) {
  2. super();
  3. this.usercode = usercode;
  4. }</span>
[java] view plaincopy print?
  1. <span style="font-size:18px;">      <!--  通过value属性指定其值-->
  2. <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
  3. <constructor-arg value="admin"></constructor-arg>
  4. </bean>
  5. </span>

2,如果我们有多个无参构造方法,里边参数可能不同,顺序可能不同等!怎么办呢?其中框架会根据制定的参数个数,type制定的类型,index制定的先后顺序来查找我们想要的构造方法,来进行初始化和对象关联。

[java] view plaincopy print?
  1. <span style="font-size:18px;">      <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
  2. <constructor-arg value="admin" index="0"></constructor-arg>
  3. <constructor-arg value="22" type="int" index="1"></constructor-arg>
  4. </bean></span>

3,构造方法和set方法同时使用也是可以的,它们两者的标签没有先后顺序问题,框架会先调用带参数的构造方法创建对象,然后构造注入数据,再调用set方法进行属性注入。但是自我感觉这种方法尽量少用。

[html] view plaincopy print?
  1. <span style="font-size:18px;">      <bean id="loginAction" class="com.bjpowernode.struts2.action.LoginAction" >
  2. <constructor-arg value="admin" index="0"></constructor-arg>
  3. <constructor-arg value="23" type="int" index="1"></constructor-arg>
  4. <property name="userpswd" value="admin"></property>
  5. </bean>   </span>

三,自动装配功能,就是框架会自动为我们匹配,利用autowire标签来实现,注意这种自动装配功能不支持简单类型(String,int,date等)他有6个值byName,byType,constructor,autodetect,no,default。从字面类型大概看个差不多吧。简单说一下。

1,byName(根据名称),从Spring环境中获取目标对象时,目标对象中的属性会根据名称在整个Spring环境中查找<bean>标签的id属性值:

<bean id="loginAction"class="com.ljh.struts2.action.LoginAction"autowire="byName" ></bean>

2.byType(根据类型),从Spring环境中获取目标对象时,目标对象中的属性会根据类型在整个spring环境中查找<bean>标签的class属性值:

<bean id="userService"class="com.ljh.struts2.service.UserService"autowire="byType" ></bean>

3, constructor:使用构造方法完成对象注入,其实也是根据构造方法的参数类型进行对象查找,相当于采用byType的方式。

4,autodetect(自动选择):如果对象没有无参数的构造方法,那么自动选择constructor的自动装配方式进行构造注入。      如果对象含有无参数的构造方法,那么自动选择byType的自动装配方式进行setter注入。

5,no:表示不支持自动装配功能;

6,default:表示默认采用上一级标签的自动装配的取值。<beans>标签中的default-autowire属性。如果存在多个配置文件的话,那么每一个配置文件的自动装配方式都是独立的。

分析总结,自动装配就是为了弥补手动装配,如果两者都使用,优先选择手动的。由于自动装配需要在Spring全局环境中搜索,所以性能上会低一些,而且可阅读性较差,所以还是推荐大家使用手动装配功能。

综上为Spring框架IOC的基础功能,这样Spring对对象的管理,对彼此之间的解耦起到了非常大的作用,使其优秀的重要条件之一。

from: http://blog.csdn.net/liujiahan629629/article/details/20736011

Spring(二)——IoC相关推荐

  1. 晋南讲堂之Spring—(二) IOC和DI

      IOC(Inversion of Control):其思想是反转资源的获取方向,传统的资源查找方式要求组件向容器发起请求查找资源,容器适时的返回资源.应用了IOC之后,容器主动将资源推送给其管理的 ...

  2. Spring IoC(二)IoC容器的初始化过程

    (一)IoC 容器初始化过程概述 1.1简要概述初始化过程 IoC 容器的初始化过程是通过refresh() 方法来启动的,这个方法标识着IoC 容器正式启动.具体来说,这个启动过程包括:BeanDe ...

  3. Spring入门 IOC

    JAVA就业套餐课:https://edu.csdn.net/combo/detail/1230 课程说明 一. 技术概览 轻量级的企业应用开发越来越受到广大Java应用开发者的追捧,而Spring框 ...

  4. idea中生成spring的 xml配置文件_【132期】面试再被问到Spring容器IOC初始化过程,就拿这篇文章砸他~...

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...

  5. 彻底学会Spring的IOC和AOP——理论+实操

    目录 1 IOC 1.1 概念 1.2 底层原理 1.3 IOC容器 1.4 Bean管理:基于xml配置文件实现 1.5 两种类型的Bean 1.6 Bean的作用域 1.7 Bean的生命周期 1 ...

  6. Spring 框架 IOC 与 DI 的总结

    一:Spring并天下 1:Spring帝国: ①:Spring崛起 什么是Spring:源于Rod Johnson在其著作<Expert one on one J2EE design and ...

  7. spring之IOC和DI关系

    spring之IOC和DI关系 IOC:控制反转:那么什么是控制反转呢? 对于程序开发人员来说,在没有使用spring之前,我们如果需要某一个对象,那么我们会直接去new这个对象,在程序员的世界里还有 ...

  8. Spring的IoC解析

    这是Spring中得有特点的一部份.IoC又被翻译成"控制反转",也不知道是谁翻译得这么别扭,感觉很深奥的词.其实,原理很简单,用一句通俗的话来说:就是用 XML来定义生成的 对象 ...

  9. Spring中IOC和AOP的详细解释(转)

    原文链接:Spring中IOC和AOP的详细解释 我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂 ...

最新文章

  1. DeepMind-深度学习: AI革命及其前沿进展 (54页ppt报告)
  2. AD5933阻抗转换器、网络分析仪初步实验
  3. Android 缓存池工具类
  4. Hibernate反向生成映射文件点击Hibernate reserve Engineering的时候没反应的解决方法
  5. memcached(九)--LRU
  6. PHP对Excel导入导出操作
  7. matlab设置非平坦结构元,详解MATLAB/Simulink通信系统建模与仿真图书信息
  8. 制作MACOSX10.10.3/10.9安装启动盘U盘的教程
  9. 桌面环境选择_Ubuntu 18.04 桌面环境初体验
  10. 如何填满word页面_Word应用分隔符的使用
  11. Oracle数据库学习思维导图
  12. 利用MentoHUST在路由器上使用锐捷认证来共享校园网
  13. Flash builder4 插件版破解
  14. 深度学习需要计算机配置,深度学习工作站配置推荐
  15. [洛谷P4118][Ynoi2016]炸脖龙I([洛谷P3934]Nephren Ruq Insania)
  16. 【02】一个实现h5的拖放的整个过程-魔芋
  17. 键盘属于计算机主机吗,这是键盘?不,这是一台电脑主机
  18. Spring-IoC概念
  19. 北上广深有哪些比较知名的芯片设计企业
  20. 卫星过顶计算matlab,基于SGP4模型的卫星轨道计算.docx

热门文章

  1. 大数据分析:Java 下降,华为平均月薪高达 35K,分析 89 万招聘数据有这些发现!
  2. 专访4秒源码商城CTO陈杰:扎根互联网的“不安的心”
  3. 马云缺席的一个半小时,李彦宏和马化腾都聊了什么
  4. 评价并不精辟,感觉没有什么深度
  5. 深入理解分布式技术 - 消息队列使用场景
  6. Spring5源码 - 05 invokeBeanFactoryPostProcessors 源码解读_3细说invokeBeanDefinitionRegistryPostProcessors
  7. 并发编程-10线程安全策略之不可变对象
  8. Spring-注入参数详解-[集合类型属性]
  9. Linux-awk及内置变量
  10. 爬虫学习笔记(八)—— Scrapy框架(三):CrawSpider模板