二、Spring的依赖注入

Spring的依赖注入

1.理解依赖注入

(1)A对象需要调用B对象的方法,这种情形被称为依赖注入,即A对象依赖B对象;依赖注入(DI)也被成为控制反转(IoC);

(2)依赖注入的两种方式:

  1)设值注入:IoC容器通过使用成员变量的setter方法来注入被依赖对象;

  2)构造注入:IoC容器通过使用构造器来注入被依赖的对象;

2.设置注入

(1)Bean与Bean之间的依赖关系由Spring管理,Spring采用setter方法为目标Bean注入所需要的值,这种注入方式被称为设值注入;

(2)代码

public interface Person {
    //定义一个使用斧头的方法
    public void useAxe();
}
public interface Axe {
    //Axe中定义一个chop()方法
    public String chop();
}
public class Chinese implements Person{
    private Axe axe;
    public void setAxe(Axe axe){
        this.axe = axe;
    }
    //实现Person接口的useAxe()方法
    @Override
    public void useAxe() {
        // TODO Auto-generated method stub
        //调用axe的chop方法
        //表明Person对象依赖于axe对象
        System.out.println(axe.chop());
    }

}
public class StoneAxe implements Axe{

    @Override
    public String chop() {
        // TODO Auto-generated method stub
        return "石斧砍柴好慢";

    }

}
public class SteelAxe implements Axe{

    @Override
    public String chop() {
        // TODO Auto-generated method stub
        return "钢斧砍柴真快";
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<!-- Spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"
    >
    <!-- 配置chinese实例,其实现类是Chinese -->
    <bean id="chinese" class="test_2.Chinese">
        <!-- 驱动调用chinese的setAxe方法,将容器中的StoneAxe作为参数传入 -->
        <property name="axe" ref="stoneAxe"/>
        <!--
        <property name="axe" ref="steelAxe"/>
         -->
    </bean>
    <!-- 配置StoneAxe实例,其实现类是StoneAxe -->
    <bean id="stoneAxe" class="test_2.StoneAxe"></bean>
    <bean id="steelAxe" class="test_2.SteelAxe"></bean>
</beans>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanTest {
    public static void main(String[] args) {
        //创建Spring容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("test_2_bean.xml");
        //获取chinese实例
        Chinese chinese = ctx.getBean("chinese",Chinese.class);
        //调用chinese的useAxe()方法
        chinese.useAxe();
    }
}

(3)使用Spring IoC的三个基本要点:

  1)应用程序的各组件面向接口编程;

  2)应用程序的各组件不再由程序主动创建,而是由Spring容器负责创建并初始化;

  3)Spring采用配置文件或注解来管理Bean的实现类、依赖关系,Spring容器根据配置文件或注解,利用反射来        创建实例,并为之注入依赖关系。

3.构造注入

(1)利用构造器来设置依赖关系的方式被称为构造注入;

(2)本质:驱动Spring在底层以反射的方式执行带指定参数的构造器,当执行带参数的构造器时,就可以利用构造器参数对成员变量执行初始化;

(3)代码

public interface Axe {
    public String chop();
}
public interface Person {
    public void useAxe();
}
public class Chinese implements Person{
    private Axe axe;
    //提供携带参数的构造器,参数是被依赖的Axe
    public Chinese(Axe axe){
        this.axe = axe;
    }
    @Override
    public void useAxe() {
        // TODO Auto-generated method stub
        System.out.println(axe.chop());
    }
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanTest {
    public static void main(String[] args) {
        //创建容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("test_3_bean.xml");
        //获取对象
        Chinese c = ctx.getBean("chinese",Chinese.class);
        //调用方法
        c.useAxe();
    }
}    
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"
    >
    <!-- 配置chinese实例,实现类是Chinese -->
    <bean id="chinese" class="test_3.Chinese">
        <constructor-arg ref="stoneAxe"/>
    </bean>
    <!-- 配置stoneAxe实例,实现类是StoneAxe -->
    <bean id="stoneAxe" class="test_3.StoneAxe"/>
</beans>

(4)配置<constructor-arg>元素,两个属性:

  1)index

  2)type

public class Student {
    private String name;
    private int age;
    private String sex;
    //构造器
    public Student(){

    }
    public Student(String name){
        this.name = name;
    }
    public Student(String name,int age){
        this(name);
        this.age = age;
    }
    public Student(String name,int age,String sex){
        this(name,age);
        this.sex = sex;
    }
    //Student方法
    public void sayHello(){
        System.out.println("我的名字是"+this.name+",今年"+this.age+"岁,是个"+this.sex+"同学");
    }
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class StudentTest {
    public static void main(String[] args) {
        //创建容器
        ApplicationContext ctx = new ClassPathXmlApplicationContext("test_3_bean.xml");
        //获取对象
        Student st = ctx.getBean("student",Student.class);
        //执行方法
        st.sayHello();
    }
}    
<?xml version="1.0" encoding="UTF-8"?>
<!-- Spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"
    >
    <!-- 配置Student对象,其实现类是Student -->
    <!-- 构造注入 -->
    <bean id="student" class="test_3.Student">
        <constructor-arg value="小明" index="0"/>
        <constructor-arg value="25" index="1" type="int"/>
        <constructor-arg value="男" index="2"/>
        <!--
        <constructor-arg value="小明" />
        <constructor-arg value="25" />
        <constructor-arg value="男" />
         -->
    </bean>
</beans>

4.两种注入方式的对比

  设值注入:通过无参构造器创建一个Bean,再使用setter方法注入依赖关系;

  构造注入:直接调用有参数的构造器,当Bean实例被创建完成后,已经完成了依赖关系的注入;

时间: 2024-10-17 18:57:09

二、Spring的依赖注入的相关文章

Spring IoC 依赖注入(二)源码分析

目录 Spring IoC 依赖注入(二)源码分析 1. 依赖注入口 - populateBean 1.1 doCreateBean 1.2 populateBean 2. 手动注入 2.1 相关的类说明 2.2 applyPropertyValues 2.3 BeanDefinitionValueResolver 2.4 依赖检查 2. 自动注入 2.1 那些字段会自动注入 2.2 名称注入 2.3 类型注入 Spring IoC 依赖注入(二)源码分析 本章主要分析 Spring IoC 依

(spring-第3回)spring的依赖注入-属性、构造函数、工厂方法等的注入

Spring要把xml配置中bean的属性实例化为具体的bean,"依赖注入"是关卡.所谓的"依赖注入",就是把应用程序对bean的属性依赖都注入到spring容器中,由spring容器实例化bean然后交给程序员.spring的依赖注入有属性注入.构造函数注入.工厂方法注入等多种方式,下面用几个简单的栗子来一一道来. 一.首先是属性注入: 代码001 1 <?xml version="1.0" encoding="UTF-8&q

第二十七天 春之细雨润物于无形 —Spring的依赖注入

6月11日,晴."夏条绿已密,朱萼缀明鲜.炎炎日正午,灼灼火俱燃." IT人习惯把具体的事物加工成的形状一致的类,正是这样的一致,加上合适的规范,才能彰显对象筋道的牙感和bean清香的味道.Spring比谁都清楚OO的奥妙,让组件之间的依赖关系由容器在运行时期决定,称作依赖注入(Dependency Injection). 下面用一通俗的例子,一探依赖注入奥妙. 设计模式中的一个原则:针对接口编程,不要针对实现编程. 一.设计两个接口: (1)奶制品接口-MilkProductInte

Spring.NET依赖注入框架学习--简单对象注入

Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常用文件 我们使用Spring.Net 框架经常要使用到的是以下文件: Common.Logging.dll  包含了Spring.Net日志方面的功能(必须) Spring.Core.dll       包含了Spring.Net 的核心库(必须) Spring.Data.dll       包含了

Spring BeanFactory 依赖注入

Spring BeanFactory 依赖注入 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一.autowire 五种注入方式测试 (1) 环境准备 public class Company { private Department department; private List<Employee> employees; public Company() { } public Company(Departmen

java之spring之依赖注入

一.DI: Dependency injection; 依赖注入 依赖注入和控制反转是同一个概念的不同说法. 对象的创建依赖于容器.对象属性的设置是由容器来设置. 对象属性的赋值过程称为注入. 二.Spring中如何注入属性: 1.普通属性(String 和 基本数据类型),直接通过 property 设置即可 <bean id="user" class="cn.sxt.vo.User"> <property name="name&quo

spring中依赖注入方式总结

Spring中依赖注入的四种方式 在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的setter方法注入 首先要配置被注入的bean,在该bean对应的类中,应该有要注入的对象属性或者基本数据类型的属性.例如:为UserBiz类注入UserDAO,同时为UserBiz注入基本数据类型String,那么这时,就要为UserDAO对象和String类型设置se

从入门到放弃,.net构建博客系统(二):依赖注入

文章目录:<从入门到放弃,.net构建博客系统> 从入门到放弃,.net构建博客系统(一):系统构建 从入门到放弃,.net构建博客系统(二):依赖注入 上一篇中有讲到项目启动时会进行ioc的依赖注入,但具体是怎么注入的呢?我们先一步步往下走 一.注册autofac配置 首先bootstraper会进行初始化,接着将当前mvc控制器工厂改为AutofacControllerFactory. 1 public class AutofacConfig 2 { 3 /// <summary&g

Spring的依赖注入(DI)三种方式

Spring依赖注入(DI)的三种方式,分别为: 1.  接口注入 2.  Setter方法注入 3.  构造方法注入 下面介绍一下这三种依赖注入在Spring中是怎么样实现的. 首先我们需要以下几个类: 接口 Logic.java 接口实现类 LogicImpl.java 一个处理类 LoginAction.java 还有一个测试类 TestMain.java Logic.java如下: package com.spring.test.di; public interface Logic {