Spring(二)——IoC
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标签:例如:
private String usercode ;
private String userpswd ;
setter方法: 是配置文件中property标签的name属性值的set方法
- <bean id="loginAction" class="com.bjpowernode.struts2.action.LoginAction" >
- <property name="usercode" value="admin"></property>
- <property name="userpswd" value="admin"></property>
- </bean>
2,属性值为引用类型时,通过property中的ref属性来关联对象:
private UserService userService;
setter方法
- <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
- <property name="userService" ref="userService"></property>
- </bean>
- <bean id="userService" class="com.ljh.struts2.service.UserService"></bean>
- </span>
3,属性为数组类型时,需要在设置属性值时,将多个元素通过逗号隔开,或者利用list标签:
private String[] names ;
setter方法
- <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
- <property name="names" value="zhang,san,lisi,wangwu"></property>
- </bean>
如果赋值操作中,需要将逗号作为一个整体,那么需要通过特殊的标签进行赋值
- <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
- <property name="userService" ref="userService"></property>
- <property name="names">
- <list>
- <value>zhang,san</value>
- <value>lisi</value>
- <value>wangwu</value>
- </list>
- </property>
- </bean>
4,属性为list集合时,也是使用list标签:
集合如果使用泛型,只能存储相同类型的元素,不使用泛型,可以存储不同类型的元素:
private List<String> nameList ;
setter方法
- <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
- <property name="nameList">
- <list>
- <value>zhang,san</value>
- <value>lisi</value>
- <value>wangwu</value>
- </list>
- </property>
- </bean>
5,当属性为map集合时,需要使用map标签:
Private Map map ;
setter方法
- <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
- <property name="map">
- <map>
- <entry key="hello" value="world"></entry>
- <entry key-ref="userService" value-ref="userService"></entry>
- </map>
- </property>
- </bean>
- <bean id="userService" class="com.ljh.struts2.service.UserService"></bean></span>
6,属性为Properties集合类型时,需要在设置属性值时,增加props标签
private Properties props ; //继承了Hashtable,是线程安全的
setter方法
- <bean id="loginAction" class="com.bjpowernode.struts2.action.LoginAction" >
- <property name="props">
- <props>
- <prop key="url">jdbc:oracle:thin:@192.168.1.27:1521:ljh</prop>
- <prop key="driverName">oracle.jdbc.driver.OracleDriver</prop>
- <prop key="username">scott</prop>
- <prop key="password">tiger</prop>
- </props>
- </property>
- </bean>
总结:以上为几种常用属性类型的set注入的写法,set方法注入,框架是先通过默认的无参构造方法进行创建对象,然后进行set注入的。当然如果我们重写了构造方法,没有了无参构造呢?这就需要下边的构造方法注入了。
二,Constructor Injection
1,例如我们声明了有参构造方法,就需要通过次构造方法进行创建对象和关联对象了,利用constructor-arg标签:
- //无参构造方法
- public LoginAction(String usercode) {
- super();
- this.usercode = usercode;
- }
- <!-- 通过value属性指定其值-->
- <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
- <constructor-arg value="admin"></constructor-arg>
- </bean>
2,如果我们有多个无参构造方法,里边参数可能不同,顺序可能不同等!怎么办呢?其中框架会根据制定的参数个数,type制定的类型,index制定的先后顺序来查找我们想要的构造方法,来进行初始化和对象关联。
- <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
- <constructor-arg value="admin" index="0"></constructor-arg>
- <constructor-arg value="22" type="int" index="1"></constructor-arg>
- </bean>
3,构造方法和set方法同时使用也是可以的,它们两者的标签没有先后顺序问题,框架会先调用带参数的构造方法创建对象,然后构造注入数据,再调用set方法进行属性注入。但是自我感觉这种方法尽量少用。
- <bean id="loginAction" class="com.bjpowernode.struts2.action.LoginAction" >
- <constructor-arg value="admin" index="0"></constructor-arg>
- <constructor-arg value="23" type="int" index="1"></constructor-arg>
- <property name="userpswd" value="admin"></property>
- </bean>
三,自动装配功能,就是框架会自动为我们匹配,利用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对对象的管理,对彼此之间的解耦起到了非常大的作用,使其优秀的重要条件之一。
Spring(二)——IoC的更多相关文章
- Spring(二)--IoC&AOP
IOC 一.IOC概述: 一般指控制反转(inversion of Control),把创建对象的权利交给框架,Ioc容器控制对象,是框架的重要特征,并非是面向对象编程的专用术语.它包括依赖注入(DI ...
- spring容器IOC创建对象<二>
问题?spring是如何创建对象的?什么时候创建对象?有几种创建方式?测试对象是单例的还是多例的 ?对象的初始化和销毁? 下面的四大模块IOC的内容了!需要深刻理解 SpringIOC定义:把对象的创 ...
- 十二、Spring之IOC容器初始化
Spring之IOC容器初始化 前言 在前面我们分析了最底层的IOC容器BeanFactory,接着简单分析了高级形态的容器ApplicationContext,在ApplicationContext ...
- 二 Spring的IOC入门,环境搭建,Spring测试类
IOC:inversion of Control 控制反转,Spring框架的核心.削减计算机程序的耦合问题,把对象(例如JDBC)的创建权交给Spring. IOC的两种类型: 依赖注入: 依赖查 ...
- Spring的IOC和AOP之深剖
今天,既然讲到了Spring 的IOC和AOP,我们就必须要知道 Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例 ...
- Spring框架IOC容器和AOP解析
主要分析点: 一.Spring开源框架的简介 二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置 一.S ...
- Spring总结—— IOC 和 Bean 的总结
一.Spring 官方文档中给出的 Spring 的整体结构. 二.我自己所理解的 Spring 整体结构图. 三.本次总结 Spring 核心部分 1.从上面图中可以看出,Beans 和 Conte ...
- Spring(二)Bean入门
一.BeanFactory介绍 1.1.Bean: 在Spring技术中是基于组件的 最基本了是最常用的单元 其实实例保存在Spring的容器当中 Bean通常被定义在配置文件当中,Bean实例化由S ...
- Spring中IOC和AOP的详细解释
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC就是典型的工厂模式,通过s ...
随机推荐
- pyqt 同时勾选多个items(网友提供学习)
框选多个item之后,用空格键可以勾选/去选多个item,效果如下图所示: http://oglop.gitbooks.io/pyqt-pyside-cookbook/list/img/checkbo ...
- pyqt说明
我是个PHP程序员,不过有时候觉得需要写些小软件,对于我这种不太熟悉桌面软件开发的人来说,界面问题最让我头痛.听说Qt很强大,而且是跨平台,所以决定学习它用来弥补我写桌面软件的不足. Qt一般是通过C ...
- java保留有效数字
DecimalFormat df=DecimalFormat("######0.0") double d = df.format(xx): 保留一位就是"######0. ...
- python学习之路-10 网络编程之进阶
本篇介绍内容 作用域 python类的多继承 IO多路复用 socketserver之源码剖析 多线程和多进程 作用域 if 1 == 1: name = "xxx" print( ...
- 移动支付之智能IC卡与Android手机进行NFC通信
本文来自http://blog.csdn.net/hellogv/ .引用必须注明出处. 眼下常见的智能IC卡执行着JavaCard虚拟机.智能IC卡上能够执行由精简后的Java语言编写 ...
- Git服务器 gitweb与gitLab的区别
昨天我们已经把Git服务器搭建完成了,工程的上传与下载都可以了,不过有些人不喜欢使用git命令进行操作.所以我们就搭建一个可视化操作的环境!配置gitweb和gitlab两种访问方式! 一,配置git ...
- Oracle安装基本步骤
安装数据库 .建立用户组及用户 groupadd oinstall groupadd dba groupadd oper useradd -g oinstall -G dba oracle passw ...
- HTTP协议3之压缩--转
HTTP内容编码和HTTP压缩的区别 HTTP压缩,在HTTP协议中,其实是内容编码的一种. 在http协议中,可以对内容(也就是body部分)进行编码, 可以采用gzip这样的编码. 从而达到压缩的 ...
- Javascript进阶篇——浏览器对象—JavaScript计时器
---恢复内容开始--- JavaScript 计时器在JavaScript中,我们可以在设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行.计时器类型:一次性计时器:仅在指定的延迟时间之后触 ...
- 提示框的优化之自定义Toast组件之(三)Toast组件优化
开发步骤: 在toast_customer.xml文件中添加一个图片组件对象显示提示图片 <?xml version="1.0" encoding="utf-8&q ...