spring4之依赖注入的三种方式

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,这样运行时就可以获取各式各样的手机了!

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

  

  

时间: 2024-12-25 21:11:44

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

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

在java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是"控制反转",通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. Spring依赖注入(

【SSH三大框架】Spring基础第二篇:Spring依赖注入的三种方式

控制反转(Inversion of Control)和依赖注入(Dependency Injection): 应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它.也可以说,依赖被注入到对象中.所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转. 对于依赖注入,有三种方式: 1.使用属性的setter方法注入 2.使用构造器注入 3.使用注解注入 下面我们介绍下这三种方式: 一.使用属性的setter方法注入 首先,我们写一个

Spring依赖注入的三种方式

Spring依赖注入(DI)的三种方式,分别为: 1. 接口注入 2. Setter方法注入 3. 构造方法注入 下面介绍一下这三种依赖注入在Spring中是怎么样实现的. 首先我们需要以下几个类: 接口 Logic.java 接口实现类 LogicImpl.java 一个处理类 LoginAction.java 还有一个测试类 TestMain.java Logic.java如下: package com.spring.test.di; public interface Logic { pub

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

在ASP.NET MVC4中,为了在解开Controller和Model的耦合,我们通常需要在Controller激活系统中引入IoC,用于处理用户请求的 Controller,让Controller依赖于ModelRepository的抽象而不是它的实现. 我们可以在三个阶段使用IoC实现上面所说的解耦操作,首先需要简单介绍一下默认情况下Controller的激活过程: 1.用户发送请求黑ASP.NET,路由系统对请求进行解析,根据注册的路由规则对请求进行匹配,解析出Controller和Ac

(三)依赖注入的三种方式

---恢复内容开始--- 一.通过bean的property属性,必须要有set方法 二.通过构造器设置参数 一)PersonServiceImpl中写构造器 public class PersonServiceImpl implements PersonService { PersonDao personDao; private String name; @Override public void save() { // TODO Auto-generated method stub Syst

峰Spring4学习(2)依赖注入的几种方式

一.装配一个bean 二.依赖注入的几种方式 com.cy.entity   People.java: package com.cy.entity; public class People { private int id; private String name; private int age; public People() { super(); // TODO Auto-generated constructor stub } public People(int id, String n

Spring的依赖注入的2种方式(1天时间)

今天花了一天的时间才调试出来 private      接口   实现类的那个bean; 最后面的那个名字不能随便的写,必须是配置文件中,实现类的那个bean 就是后面的那个名字写错了,花了整整一天 必须有这句注解扫描才能扫描到注解 进行注解的配置,不需要get方法和set方法,小龙儿说xml文件配置才需要set方法 package com.baobaotao1; import org.springframework.context.ApplicationContext; import org.

依赖注入的两种方式并附上例子

1.依赖注入:就是指程序在运行过程中,如果需要另外一个对象协助完成时,无需在代码中创建被调用者,而是依赖外部的注入获取. 2.依赖注入的两种方式: 设置注入:设置注入是通过setter方法注入被调用者的实例. 构造注入:利用构造方法来设置依赖注入的方式称为构造注入. 3.接下来附上例子来说明设置注入 (1).首先,附上设置注入的例子,新建一个Java项目,配置好Spring后,即可,项目结构图如下图所示: (2).首先,新建2个接口,一个Animal接口,一个Person接口,其中Animal接

Spring学习(二)spring ioc注入的三种方式

一.spring ioc注入有哪三种方式: a setter 原理 : 在目标对象中,定义需要注入的依赖对象对应的属性和setter方法:"让ioc容器调用该setter方法",将ioc容器实例化的依赖对象通过setter注入给目标对象,封装在目标对象的属性中. b 构造器 原理 : 为目标对象提供一个构造方法,在构造方法中添加一个依赖对象对应的参数.ioc容器解析时,实例化目标对象时会自动调用构造方法,ioc只需要为构造器中的参数进行赋值:将ioc实例化的依赖对象作为构造器的参数传入