Spring控制反转容器的使用
主要介绍Spring如何管理bean和依赖关系。
通过构造器创建一个bean的实例
之前的方法中,可以通过调用ApolicationContext的getBean方法可以获取到一个bean的实例。下面的配置文件中定义了一个名为product的bean。
[html] view plain copy print? <span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <!-- demo2 --> <bean name="product" class="cn.redis.model.Product"></bean> </beans></span>
该bean的定义告诉Spring通过无参的构造来初始化product类。如果不存在该构造器(如果类作者重载了构造器,且没有显示声明默认构造器),则Spring将抛出一个异常。
ps:
应采用id或者name属性表示一个bean。为了让Spring创建一个Product实例,应将Bean定义的name值“product”(具体实践也可以是id值)和Product类型作为参数传递给ApplicationContext的getBean方法。
-
[java] view plain copy print? public void test1(){ ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"config1.xml"}); Product product = context.getBean("Product",Product.class); product.setName("www"); System.out.println("product:"+product.getName()); }
通过工厂方法创建一个bean实例
除了通过类的构造器方法Spring还同样支持通过调用一个工厂的方法来初始化类。下面的bean定义展示了通过工厂方法来实例化java.uti.Calendar
-
[html] view plain copy print? <bean name = "calendar" class="java.util.Calendar" factory-method="getInstance"/>
DestroyMethod的使用
有时,我们希望在一些类被销毁前能执行一些方法,Spring考虑到了这样的需求,可以在bean定义中配置destroy-method属性,来指定在销毁前要执行的方法。
下面的例子中,配置Spring通过java.util.concurrent.Executors的静态方法newCachedThreadPool来创建一个java.util.concurrent.ExecutorService实例,并指定了destroy-method属性为shutdown方法。这样,Spring会在销毁ExecutorService实例前调用shutdown方法。
-
[html] view plain copy print? <bean id="executors" class="java.util.concurrent.Executors" factory-method="newCachedThreadPool" destroy-method="newCachedThreadPool"/>
向构造器传递参数
spring 支持通过带参数的构造器来初始化类
proudct类
-
[java] view plain copy print? public class Product implements Serializable { private static final long serialVersionUID = 1L; private String name; private String description; private float price; public Product() { } public Product(String name,String description,float price) { <span style="white-space:pre"> </span>this.name=name; <span style="white-space:pre"> </span>this.description = description; <span style="white-space:pre"> </span>this.price=price; <span style="white-space:pre"> </span>} public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } } 如下定义展示了如何通过参数名传递参数 [html] view plain copy print? <bean name="featuredProduct" class="cn.redis.model.Product"> <constructor-arg name="name" value="Ultimate Olive Oil" /> <constructor-arg name="description" value="The purest olive oil on the market" /> <constructor-arg name="price" value="9.95" /> </bean> 这样在创建product实例时,Spring会调用如下构造器。 [java] view plain copy print? public Product(String name,String description,float price) { this.name=name; this.description = description; this.price=price; }
除了通过名称传递参数外,Spring还支持通过指数方式传递参数,具体如下:
[html] view plain copy print? <bean name="featuredProduct2" class="cn.redis.model.Product"> <constructor-arg index="0" value="Ultimate Olive Oil" /> <constructor-arg index="1" value="The purest olive oil on the market" /> <constructor-arg index="2" value="9.95" /> </bean>
Setter 方式依赖注入
下面以employee类和address类为例,说明setter方式依赖注入。