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方法

[html] view plaincopyprint?

  1. <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>

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

private UserService userService;

setter方法

[html] view plaincopyprint?

  1. <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>
  5. </span>

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

  private String[] names ;

setter方法

[html] view plaincopyprint?

  1. <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
  2. <property name="names" value="zhang,san,lisi,wangwu"></property>
  3. </bean>

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

[html] view plaincopyprint?

  1. <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>

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

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

  private List<String> nameList ;

setter方法

[html] view plaincopyprint?

  1. <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>

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

  Private Map map ;

setter方法

[html] view plaincopyprint?

  1. <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标签

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

setter方法

[html] view plaincopyprint?

  1. <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>

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

二,Constructor Injection

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

[java] view plaincopyprint?

  1. //无参构造方法
  2. public LoginAction(String usercode) {
  3. super();
  4. this.usercode = usercode;
  5. }

[java] view plaincopyprint?

  1. <!--  通过value属性指定其值-->
  2. <bean id="loginAction" class="com.ljh.struts2.action.LoginAction" >
  3. <constructor-arg value="admin"></constructor-arg>
  4. </bean>

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

[java] view plaincopyprint?

  1. <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>

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

[html] view plaincopyprint?

  1. <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>

三,自动装配功能,就是框架会自动为我们匹配,利用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对对象的管理,对彼此之间的解耦起到了非常大的作用,使其优秀的重要条件之一。

时间: 2024-08-04 00:53:55

Spring(二)——IoC的相关文章

Spring的Ioc

引用:http://www.cnblogs.com/xdp-gacl/p/4249939.html 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框

Spring(二)Bean入门

一.BeanFactory介绍 1.1.Bean: 在Spring技术中是基于组件的 最基本了是最常用的单元 其实实例保存在Spring的容器当中 Bean通常被定义在配置文件当中,Bean实例化由Spring的Ioc容器进行管理,Bean的实例可以通过Beanfactory进行访问,实际上大部分J2EE应用,Bean是通过ApplicationContext来访问的,ApplicationContext是BeanFactory的子接口,功能要比BeanFactory强大许多 1.2.BeanF

【SSH进阶之路】Spring的IOC逐层深入——源码解析之IoC的根本BeanFactory(五)

我们前面的三篇博文,简单易懂的介绍了为什么要使用IOC[实例讲解](二).和Spring的IOC原理[通俗解释](三)以及依赖注入的两种常用实现类型(四),这些都是刚开始学习Spring IoC容器时的基础内容,当然只有有了这些基础,我们才能走到今天更加详细的解析Spring的源码,深入理解IOC. 这篇我先简单的复习一下IoC,然后根据实例介绍IoC最基本的原理.废话少说,下面我们开始这篇博文的话题: 什么是IoC IoC容器,最主要的就是完成对象的创建以及维护对象的依赖关系等. 所谓控制反转

Spring框架IOC容器和AOP解析

主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置  一.Spring开源框架的简介  Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开

Spring中IOC和AOP的详细解释

我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC就是典型的工厂模式,通过sessionfactory去注入实例. AOP就是典型的代理模式的体现. 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对

Spring的IOC理解(转载)

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinniansh

对Spring中IOC和AOP的理解

IOC:控制反转也叫依赖注入.利用了工厂模式. 为了方便理解,分解成每条以便记忆.  1.将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象.2.在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,3.在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面ne

spring(二、bean生命周期、用到的设计模式、常用注解)

Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring容器.这里,我们讲的也是 ApplicationContext中Bean的生命周期.而实际上BeanFactory也是差不多的,只不过处理器需要手动注册.  转载 http://www.cnblogs.com/zrtqsk/p/3735273.html 一.生命周期流程图: Spring Bean的

Spring中ioc的实现原理

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinniansh