3.2 依赖注入容器

【2018.6,结构和例子都有变化。】

单就学习设计模式而言,工具类God已经足够。Spring Framework包含很多东西,这里仅介绍作为注入器或依赖注入容器/框架的Spring。<2.1.3注入器Spring>

1.下载Spring Framework

http://maven.springframework.org/release/org/springframework/spring/4.2.1.RELEASE/ 下载spring-framework-4.2.1.RELEASE-dist.zip 。在我们的例子中,只需要一部分包:

³       spring-beans-4.2.1.RELEASE.jar

³       spring-context-4.2.1.RELEASE.jar

³       spring-context-support-4.2.1.RELEASE.jar

³       spring-core-4.2.1.RELEASE.jar

³       spring-expression-4.2.1.RELEASE.jar

此外,还要下载 commons-logging-1.2.jar

解压后,将它们放入BlueJ\lib\userlib文件夹中。(参考page206).

2.Spring当作tool.God

将Spring当作tool.God一样的工具而非容器使用,即作为一个利用反射+配置文件来创建对象的工具类。

(1)有类层次IServer和Server1。

package creational.di.springDemo;
public class IServer{
    public void  say(){
        System.out.println("IServer:Hello Spring");
    }
}
package creational.di.springDemo;
public class Server1 extends IServer{
    @Override public void  say(){
        System.out.println("Server1: Hello Spring");
    }
}
(2)SpringTest将利用Spring创建对象IServer和Server1。在默认包下创建 spring1.xml配置文件。

<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<bean id="hi" class="creational.di.springDemo.Server1" />

</beans>

另外,tool.God的配置文件中有:

1-7-Hello =creational.di.springDemo.IServer

(3)测试代码

package creational.di.springDemo;
import java.io.IOException;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.beans.factory.BeanFactory;
public class SpringTest {
    public static void test() throws IOException {
        BeanFactory bf = new FileSystemXmlApplicationContext("spring1.xml");
        IServer h = (IServer)bf.getBean("hi");
        h.say();
        //比较
        h = (IServer)tool.God.create("1-7-Hello");
        h.say();
    }
}  
输出:

Server1: Hello Spring
IServer:Hello Spring

大材小用时,大材会显得过于繁琐。从学习设计模式的角度看,tool.God小巧适用,完成依赖注入已经足够;而且你可以将tool.God视为一个幼苗或小细胞,它可以生长或分裂出一大堆的Context、BeanFactory……从而成为功能强大的框架。

3.按照XML配置文件自动装配

老板/Boss有成员变量车/Car和办公室/Office。Spring可以按照XML配置文件(或在源代码中使用Annotation(标注)特性)对Boss“自动”进行依赖注入

package creational.di.springDemo;
public class Boss { 
    private Car car; 
    private Office office; 
    public void setCar(Car car){        this.car =car;    }
    public void setOffice(Office office){  this.office =office;    }
    public Car getCar(){        return this.car;    }
    public Office getOffice(){        return this.office;    }
    @Override public String toString() { 
        return "car:" + car + "\n" + "office:" + office; 
    } 
}//<span style="font-family: Arial, Helvetica, sans-serif;">Car、Office略</span>


package creational.di.springDemo;
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Test { 
    public static void main(String[] args)throws java.io.IOException{ 
        ApplicationContext ctx = new FileSystemXmlApplicationContext("beans.xml");
        Boss boss = (Boss)ctx.getBean("boss"); 
        System.out.println(boss); 
    } 
}
注意,Test的 源代码中并 没有创建Car和Office对象,也 没有显式地调用boss.setCar()等方法,这些工作由Spring按照配置文件beans.xml完成。
<?xml version="1.0" encoding="UTF-8" ?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 
    <bean id="boss" class="creational.di.springDemo.Boss"> 
        <property name="car" ref="car"/> 
        <property name="office" ref="office" /> 
    </bean> 
    <bean id="office" class="creational.di.springDemo.Office"> 
        <property name="officeNo" value="002"/> 
    </bean> 
    <bean id="car" class="creational.di.springDemo.Car" scope="singleton"> 
        <property name="brand" value=" 红旗 CA72"/> 
        <property name="price" value="2000"/> 
    </bean> 
</beans> 

4. Spring按照Annotation自动装配

Spring 2.5 引入的 @Autowired 注释,它可以对源代码中类成员变量、方法及构造函数进行标注,以指导Spring完成自动装配的工作。

package di.springDemo;
import org.springframework.beans.factory.annotation.Autowired;
public class Boss2 { 
    @Autowired private Car car; 
    @Autowired private Office office; 
    //同Boss 略
}

package di.springDemo;
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.FileSystemXmlApplicationContext;
c class Test { 
    public static void main(String[] args)throws java.io.IOException{ 
        FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext("beans2.xml");
        Boss boss = (Boss)ctx.getBean("boss"); 
        System.out.println(boss); 
        ctx.destroy();// 关闭 Spring 容器,以触发 Bean 销毁方法的执行
    } 
}
注入工作由Spring按照配置文件beans2.xml指导完成。

<?xml version="1.0" encoding="UTF-8" ?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 
    <!-- 该 BeanPostProcessor 将自动起作用,对标注 @Autowired 的 Bean 进行自动注入 --> 
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> 

    <!-- 比较beans1,删除了 boss Bean 的属性注入配置的信息 --> 
    <bean id="boss" class="creational.di.springDemo.Boss2"/> 

    <bean id="office" class="creational.di.springDemo.Office"> 
        <property name="officeNo" value="002"/> 
    </bean> 
    <bean id="car" class="creational.di.springDemo.Car" scope="singleton"> 
        <property name="brand" value=" 红旗 CA72"/> 
        <property name="price" value="2000"/> 
    </bean> 
</beans>


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值