码迷,mamicode.com
首页 > 编程语言 > 详细

Spring的三种注入方式

时间:2015-07-06 17:30:53      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

  据说不懂spring的程序员就相当于不会Java,于是最近一段时间并行学习下spring框架。先学习总结下spring的IoC的五种注入方式。

  这里我想象的场景是这样的:士兵和他的武器的故事。这个是我目前的结构图:

  技术分享

  Human和Weapon是两个接口,Gun和Solder分别是实现了上面两个接口的类,其中,由于Solder需要Gun而形成了对Gun类的依赖

  上面的代码分别为:

  Weapon接口

技术分享
public interface Weapon {
    public void function();
}
View Code

  Human接口

技术分享
public interface Human {
    String name="";
    public void action();
    public String getName();
    public void setName(String name);
}
View Code

  Gun类

技术分享
public class Gun implements Weapon{
    public void function() {
        System.out.println("I have a gun, I can shoot!");
    }
}
View Code

  1.首先来看第一种set注入:

Soldier类

技术分享
public class Soldier implements Human{

    private Weapon weapon;
    private String name;
    
    public void action() {
        weapon.function();
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name=name;
    }
    
    
        //注意这里一定要有,否则set注入不成功
    public void setWeapon(Weapon weapon){
        this.weapon=weapon;
    }
    
}    
View Code

  在Soldier中一定要设置所依赖的类的set方法,否则set注入会失败!将所要依赖的类以property的形式配置到bean中,并将ref指向相应的bean的name值。相应的xml文件中的配置如下:

    <bean name="soldier" class="roomy.impl.Soldier">
        <property name="weapon" ref="weapon"></property>
    </bean>
    <bean name="weapon" class="roomy.impl.Gun"></bean>

  则在Test类的Main函数中运行:

  Test类

技术分享
public class Test {
    private static ApplicationContext ctx;
    public static void main(String[] args) {
        ctx = new ClassPathXmlApplicationContext("beans.xml");
        Human human = (Human) ctx.getBean("soldier");
        human.action();
    }
}
View Code

  运行得到:

I have a gun, I can shoot!

   2.然后我们看构造器注入法,只需要修改Soldier类,添加构造函数,并在构造函数中传入即可,如下:

技术分享
public class Soldier implements Human{

    private Weapon weapon;
    private String name;
    
    public Soldier(Weapon weapon){
        this.weapon=weapon;
    }
    
    public void action() {
        weapon.function();
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name=name;
    }

}
View Code

  同时,修改xml文件中相应bean元素的中的子元素为:

    <bean name="soldier" class="roomy.impl.Soldier">
    <constructor-arg ref="weapon"></constructor-arg>
    </bean>
    <bean name="weapon" class="roomy.impl.Gun"></bean>

  同样得到上面的结果

  3.接下来是通过注解法,使用注解法的时候需要在xml文件中添加这句话:

<context:annotation-config/>

  此外,整个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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    <!-- the xmlns with context is associated with annotation -->
    <!-- and the next line is for annotation -->
    <context:annotation-config/>

</beans>

  基于注解简直不要太方便,直接在所依赖的对象的前面加上一句@Resource即可,这个注解是Java自带的,直接修改Soldier类如下:

技术分享
public class Soldier implements Human{

    @Resource
    private Weapon weapon;
    private String name;
    
    
    public void action() {
        weapon.function();
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name=name;
    }
    
}
View Code

  也可以是用Spring的注解,也就是在所依赖对象前面加上:

@Autowired
//@Qualifier("name")如果有N个依赖对象,可以用这个标签具体制定匹配哪一个bean

  

Spring的三种注入方式

标签:

原文地址:http://www.cnblogs.com/zhangxd-stn/p/roomy_spring0.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!