Spring的三种注入方式

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

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

  

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

  上面的代码分别为:

  Weapon接口

public interface Weapon {
    public void function();
}

  Human接口

public interface Human {
    String name="";
    public void action();
    public String getName();
    public void setName(String name);
}

  Gun类

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

  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;
    }

}    

  在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();
    }
}

  运行得到:

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;
    }

}

  同时,修改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;
    }

}

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

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

  

时间: 2024-10-12 20:50:04

Spring的三种注入方式的相关文章

spring ioc三种注入方式

spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容器控制程序之间的关系,而不是由代码直接控制 由于控制权由代码转向了容器,所以称为反转 接口注入 Setter 注入 构造器注入 三种依赖注入方式的比较 : 接口注入: 接口注入模式因为历史较为悠久,在很多容器中都已经得到应用.但由于其在灵活性.易用性上不如其他两种注入模式,因而在 IOC 的专题世界

Spring IOC的三种注入方式

Spring IOC三种注入方式: 1.    接口注入 2.    getter,setter方式注入 3.    构造器注入 对象与对象之间的关系可以简单的理解为对象之间的依赖关系:A类需要B类的一个实例来进行某些操作,比如在A类的方法中需要调用B类的方法来完成功能,叫做A类依赖于B类.控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术,由容器控制程序之间的关系,而不是由代码直接控制. 1.接口注入 public class ClassA {  private InterfaceB

Spring IOC 中三种注入方式

项目错误知识点记录 正文 最近在项目的时候,用到Spring框架,Spring框架提供了一种IOC的自动注入功能,可以很轻松的帮助我们创建一个Bean,这样就省的我们四处写new Object()这样的代码了.IOC提供了三种注入方式,接口注入,set方法注入以及构造器注入,三种注入方式使用起来都很easy,具体的使用方法网上都有很多,大家可以自行搜索百度... 那天当我使用接口注入的时候,发现IDEA给我一个警告(以前也有这样的警告,只不过我没太注意),看了看是让我采用构造器注入方式.这就让我

Spring常用的三种注入方式

好文要收藏,摘自:https://blog.csdn.net/a909301740/article/details/78379720 Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入. 构造方法注入先简单了解一下测试项目的结构,用maven构建的,四个包: entity:存储实体,里面只有一个User类dao:数据访问,一个接口,两个实现类service:服务层,一个接口,一个实现类,实现类依赖于IUserDaote

Spring bean的三种注入方式

Spring的一个重要原理就是IOC(Inverse Of Control),即控制反转.IOC就是一种将组件依赖关系的创建和管理置于程序外部的技术,在Spring中Bean组件的实例化和依赖关系的管理控制都由Spring容器负责,对象与对象之间的关系可以简单的理解为对象之间的依赖关系:在 类 A 需要类 B 的一个实例来进行某些操作时,比如在类 A 的方法中需要调用类 B 的方法来完成功能,叫做类 A 依赖于类 B.依赖注入(DI:Dependency Injection) :两个对象之间的依

Spring bean三种创建方式

spring共提供了三种实例化bean的方式:构造器实例化  静态工厂实例化   动态工厂实例化,下面一一详解: 1.构造器实例化 City.java 1 package com.proc.bean; 2 3 public class City { 4 5 private String name; 6 private String code; 7 8 public City() { 9 } 10 11 public City(String name, String code) { 12 this

Spring事务-三种实现方式

一.引入JAR文件: 二.开始搭建分层架构---创建账户(Account)和股票(Stock)实体类 Account: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 /*  * 账户  */ public class Account {     private int aid;//账户编号     private String aname;//账户名称     private double

Spring容器三种注入类型

Spring注入有三种方式: 1.Set注入(使用最多) 2.构造器注入(使用不多) 3.接口注入(几乎不用)不做测试了 1.Set注入:所谓Set注入就是容器内部调用了bean的Set***方法,注意:xml文件中的名字一定要和对象中属性的名字对应 1 2 3 4 5 6 7 8 9 public class User {     private Role role;//注意:配置文件中property中name的名字跟这个属性的名字一定要相同,不然会找不到     public Role g

Spring的几种注入方式

通过set方式注入 bean的定义: package com.ydoing.demo; public class Person { private Computer computer; public void setComputer(Computer computer) { this.computer = computer; } public void useComputer() { computer.start(); } } bean的配置: <bean id="person"