1、Setter注入

        <bean id="helloWorld" class="com.jdw.spring.beans.HelloWorld">
<property name="name" value="Spring"></property>
</bean>

  从这个最简单的配置可以得出以下两个结论:一、class属性需要全类名进行配置,说了ioc容器是通过反射进行创建bean的;二、bean类必须有默认的构造函数;

  这种通过property子元素进行属性配置的方式是spring依赖注入的三大方式之一:setter注入。

2、构造器注入

         <bean id="car" class="com.jdw.spring.beans.Car">
<constructor-arg value="audi" type="java.lang.String"></constructor-arg>
<constructor-arg type="java.lang.String">
<!-- 对于包含特殊字符的属性值,可以在value子节点使用CDATA -->
<value><![CDATA[<shanghai>]]></value>
</constructor-arg>
<constructor-arg type="int">
<value>240</value>
</constructor-arg>
</bean>

  构造器注入,言外之意,需要在bean之中配置构造器,可以不需要默认构造方法,但是必须保证构造器参数与配置文件中的参数数量和类型一致。

	<bean id="car1" class="com.jdw.spring.beans.Car">
<constructor-arg value="audi" index="0" type="java.lang.String"></constructor-arg>
<constructor-arg value="shanghai" index="1" type="java.lang.String"></constructor-arg>
<constructor-arg value="200000" index="2" type="double"></constructor-arg>
</bean>

  对于有多个构造器的bean,可通过上述的index和type属性进行配置,以区别重载的构造器。

3、工厂方法注入

    工厂方法注入又分为静态工厂方法注入和实例工厂方法注入

(1)静态工厂方法注入

一个模拟的简单静态工厂如下,该静态工厂提供了一个静态方法getCar,调用该方法则返回一个Car实例,注意红色注释,如果配置文件中scope=singleton,采用静态工厂方法注入获得的bean是否为单例呢?

public class StaticCarFactory {

	public static Map<String,Car> cars=new HashMap<>();
static{
cars.put("audi", new Car("audi",300000));
cars.put("bmw", new Car("bmw",200000));
cars.put("hongqi", new Car("hongqi",600000));
}
public static Car getCar(String name){
//return new Car("audi",300000);//如果这么写,那么获得的car实例还是单例的么?
return cars.get(name);
}
}

  静态工厂注入配置:

        <bean id="car" class="com.jdw.spring.factory.StaticCarFactory"
factory-method="getCar">
<constructor-arg value="audi"></constructor-arg>
</bean>

说明:所谓静态工厂方法注入,不过是通过一个静态方法创建bean的实例,注意,在singelton情况下该静态方法只会在ioc容器初始化bean时调用一次,即不管getBean("car")多少次,都是返回的同一个Car对象。而在prototype情况下,getBean("car")调用一次就会对应的调用一次静态方法getCar。从这里可以更好的理解singleton和prototype的区别,前者会在ioc容器初始化时创建,后者则在用户调用时再创建。

(2)实例工厂方法注入

  实例工厂代码:

public class InstanceCarFactory {
private Map<String, Car> cars = null; public InstanceCarFactory() {
cars = new HashMap<>();
cars.put("audi", new Car("audi", 30000));
cars.put("BMW", new Car("audi", 20000));
cars.put("HQ", new Car("audi", 50000));
} public Car getCar(String brand) {
return cars.get(brand);
}
}

  实例工厂的getCar为非静态,这就导致,必须先实例化该工厂,即需要配置该工厂的bean。

        <!-- 配置实例工厂 -->
<bean id="carFactory" class="com.jdw.spring.factory.InstanceCarFactory"></bean> <!-- 通过实例工厂配置bean -->
<bean id="car1" factory-bean="carFactory" factory-method="getCar">
<constructor-arg name="brand" value="audi"></constructor-arg>
</bean>

  学而不思则罔,通过Setter注入和构造器注入可以很方便快捷的配置bean,静态工厂注入和实例工厂注入到底是为了那样?难道只是为了支持下工厂模式?spring你别逗好么,咱自己不就相当于一个超级bean工厂么!那干嘛还弄给工厂方法注入呢?一定有其原因。

有一家手机卖场,只卖A、B、C三种手机,假设顾客只关心价格price和参数信息info,那么问题来了,一个顾客进入卖场,说:我要买A手机。手机卖场(IOC)需要初始化一个A的Bean。又一个顾客进入卖场,说:我要B手机。手机卖场也得初始化一个B的bean。同样,也得初始化C的bean。三个手机还好些,IOC就建立三个bean,那么10种手机呢?每种手机的info需要特殊处理呢?比如手机参数信息要有一系列的运算统计信息呢?这样看来IOC貌似不适合把每个bean都放在配置文件里,也不适合建立多个bean。

  解决方案就是,建立一个手机bean,通过工厂注入(静态工厂、实例工厂都可以),传入手机类型名称,获得对应的手机,只是要把bean配置为prototype,这样运行时就可以获取各式各样的手机了!

那静态工厂和实例工厂两种注入方式,除了配置的不同,在应用上有什么区别么?

  

  

spring4之依赖注入的三种方式的更多相关文章

  1. ASP.NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...

  2. SSH深度历险记(八) 剖析SSH核心原则+Spring依赖注入的三种方式

           于java发育.一类程序猿必须依靠类的其他方法,它是通常new依赖类的方法,然后调用类的实例,这样的发展问题new良好的班统一管理的例子.spring提出了依赖注入的思想,即依赖类不由程 ...

  3. Spring注解依赖注入的三种方式的优缺点以及优先选择

    当我们在使用依赖注入的时候,通常有三种方式: 1.通过构造器来注入: 2.通过setter方法来注入: 3.通过filed变量来注入: 那么他们有什么区别吗?应该选择哪种方式更好? 三种方式的区别小结 ...

  4. SSH深度历险(八) 剖析SSH核心原理+Spring依赖注入的三种方式

           在java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依 ...

  5. Spring依赖注入的三种方式

    看过几篇关于Spring依赖注入的文章,自己简单总结了一下,大概有三种方式: 1.自动装配 通过配置applicationContext.xml中的标签的default-autowire属性,或者标签 ...

  6. 在ASP.NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC4中,为了在解开Controller和Model的耦合,我们通常需要在Controller激活系统中引入IoC,用于处理用户请求的 Controller,让Controller ...

  7. Spring基础05——Spring依赖注入的三种方式

    Spring支持3种依赖注入的方式:属性注入.构造器注入.工厂 1.属性注入 属性注入即通过setter方法注入Bean的属性或依赖的对象.使用<property>元素,使用name属性指 ...

  8. spring——依赖注入的三种方式

    1 构造器注入(与构造器有直接关系) 默认无参构造 3种构造方式:通过<contructor-arg>调用类中的构造器 下标 <bean id="userService&q ...

  9. sping_依赖注入的三种方式

    1.  set注入:通过setxxx()给属性赋值 <!--id是对象--> <!--class是类--> <bean id = "student" ...

随机推荐

  1. eclipse自动提示类型的作用

    eclipse的自动提示功能确实十分好用,但是只是笼统的都勾上了,所有会有好多重复项,看着很眼疼. 今天就稍微研究了下,略微知道了几个类型的作用: 序号 类型 大体的中文意思 作用 1 Java Ty ...

  2. Hadoop数据操作系统YARN全解析

    “ Hadoop 2.0引入YARN,大大提高了集群的资源利用率并降低了集群管理成本.其在异构集群中是怎样应用的?Hulu又有哪些成功实践可以分享? 为了能够对集群中的资源进行统一管理和调度,Hado ...

  3. setTimeout的若干坑

    第一坑:作用域 首先,有一个关于this的面试题,是这样的: var fullname = 'John Doe'; var obj = { fullname: 'Colin Ihrig', prop: ...

  4. php 查找数组中是否存在某项,并返回指定的字符串,可用于检查复选,单选等

    /** * 查找数组中是否存在某项,并返回指定的字符串,可用于检查复选,单选等 * @param $id * @param $ids * @param string $returnstr * @ret ...

  5. Oracle 11g R2安装手册(图文教程)For Windows

    1.Oracle 11g R2安装手册(图文教程)For Windows 1.下载Oracle 11g R2 for Windows版本,下载地址如下 官方网站: http://download.or ...

  6. POC- Proof of Cocept -- 概念验证

    POC,是Proof of Concept的缩写,意思是为观点提供证据,它是一套建议的电子模型,实例化代码,它可用于论证团队和客户的设计,允许评估和确认概念设计方案,POC的评价可能引起规格和设计的调 ...

  7. delphi 对TThread扩充TSimpleThread

    对线程的使用,是每个开发者都应该熟练掌握的,也是进阶的重要一环. 可以这样说,没有线程,连界面假死的问题都解决不了,就更别谈并行处理来提高效率了. 本例对线程进行改进,打造一个基础的线程,以后线程应用 ...

  8. Unity CCTween UGUI 动画插件

    在这简单的介绍一下 CCTween 动画插件的使用 因为GIF 制作软件不太好(网上随便下载的)所以导致效果不太好,有时间我重新制作一下 这是一下简单的效果 下面介绍怎么使用 首先 先下载 CCTwe ...

  9. SPOJ 1435 - Vertex Cover(树形DP,树的最小点覆盖)

    算是个经典题目了,很模板的树形DP题目 做这个题的时候一开始就想到树形DP了,可是由于各种原因没写出来,代码太糟烂了,赛后还是改了好久才过的 dp(u,0)=sum(dp(v,1)): dp(u,1) ...

  10. Ajax框架,DWR介绍,应用,样例

    使用Ajax框架 1. 简化JavaScript的开发难度 2. 解决浏览器的兼容性问题 3. 简化开发流程 经常使用Ajax框架 Prototype 一个纯粹的JavaScript函数库,对Ajax ...