Spring的依赖注入

依赖注入:Dependency Injection
控制反转:Inversion of Control

一、设值注入
public interface Person
{
    
public void useAxe();
}

public interface Axe
{
    
public void chop();
}

Person的实现类代码如下:
public class Chinese implements Person
{
    
//面向Axe接口编程,而不是具体的实现类
    private Axe axe;
    
//默认的构造器
    public Chinese() {}
    
//设值注入所需的setter方法
    public void setAxe(Axe axe) {
        
this.axe = axe;
    }

    
//实现Person接口的useAxe方法
    public void useAxe() {
        System.out.println(axe.chop());
    }

}

Axe的第一个实现类代码如下:
public class StoneAxe implements Axe
{
    
public StoneAxe() {}
    
//实现Axe接口的chop方法
    public String chop() {
        
return "石斧砍柴好慢";
    }

}

下面采用Spring的配置文件将Person实例和Axe实例组织在一起。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    
<bean id="chinese" class="prolove.Chinese">
        
<!--property元素用来指定需要容器注入的属性,axe属性需要容器
            注入。此处是设值注入,因此Chinese类必须拥有setAxe方法
-->
        
<property name="axe">
            
<!--此处将另一个bean的引用注入给chinese bean-->
            
<ref local="stoneAxe"/>
        
</property>
    
</bean>
    
<bean id="stoneAxe" class="prolove.StoneAxe"/>
</beans>
下面是主程序部分:
public class BeanTest
{
    
public static void main(String[] args) throws Exception{
        
//因为是独立的应用程序,显式实例化Spring的上下文
        ApplicationContext ctx =
            
new FileSystemXmlApplicationContext("bean.xml");
        
//通过Person bean的id来获取bean实例,面向接口编程,因此
        
//此处强制类型转换为接口类型
        Person p = (Person)ctx.getBean("chinese");
        
//直接执行Person的useAxe()方法
        p.useAxe();
    }

}

下面也给出了使用Ant编译和运行该应用的简单脚本:
<?xml version="1.0"?>
<project name="spring" basedir="." default="">
    
<path id="classpath">
        
<fileset dir="....lib">
            
<include name="*.jar"/>
        
</fileset>
        
<pathelement path="."/>
    
</path>

    
<target name="compile" description="Compile all source code">
        
<javac destdir="." debug="true"
            deprecation
="false" optimize="false" failonerror="true">
            
<src path="."/>
            
<classpath refid="classpath"/>
        
</javac>
    
</target>

    
<target name="run" description="run the main class" depends="compile">
        
<java classname="prolove.BeanTest" fork="yes" failonerror="true">
            
<classpath refid="classpath"/>
        
</java>
    
</target>
</project>
Axe的另一个实现类如下:
public class SteelAxe implements Axe
{
    
public SteelAxe() {}
    
public String chop() {
        
return "钢斧砍柴真快";
    }

}

Spring配置:
<bean id="steelAxe" class="prolove.SteelAxe"/>
<ref local="steelAxe"/>

二、构造注入
public class Chinese implements Person
{
    
//面向Axe接口编程,而不是具体的实现类
    private Axe axe;
    
//默认的构造器
    public Chinese() {}

    
//构造注入所需的带参数的构造器
    public Chinese(Axe axe) {
        
this.axe = axe;
    }


    
//实现Person接口的useAxe方法
    public void useAxe() {
        System.out.println(axe.chop());
    }

}

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    
<bean id="chinese" class="prolove.Chinese">

        
<constructor-arg><ref bean="stoneAxe"/></constructor-arg>
    
</bean>

    
<bean id="stoneAxe" class="prolove.StoneAxe"/>
</beans>

三、两种注入方式的对比
    建议采用以设值注入为主,构造注入为辅的注入策略。对于依赖关系无须
变化的注入,尽量采用构造注入;而其他的依赖关系的注入,则考虑采用设值注入。
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值