SpringFramework|基于XML的依赖注入

SpringFramework|基于XML的依赖注入

环境交代

Java: 1.8

Maven: 3

SpringFramework版本以及各组件成员: 5.1.1.RELEASE

  • spring-context
  • spring-core
  • spring-beans

依赖注入

分别有两种注入形式:

  • 构造注入
  • 设值注入

基于XML的构造注入

背景

例子中的BeanUser是个"哑巴", 不具备表达能力. 它希望能借用BeansayHelloWorld来说两句话, 以表达自己第一次加入程序大家庭的喜悦之情.

代码

具有sayHelloWorld的bean - Bean.java


这个"Bean"并不符合JavaBean规范, 只是根据Spring中的配置顺口叫的...
具体的JavaBean可以另行搜索.

package noioo;

public class Bean {
    public void sayHelloWorld(){
        System.out.println("Hello World");
    }
}

这是想说话的 - BeanUser.java

package noioo;

public class BeanUser {

    private Bean bean;

    // need to SayHelloWorld
    public BeanUser(Bean bean){
        this.bean = bean;
    }

    // user
    public void useBean(){
        bean.sayHelloWorld();
    }
}

srping容器, 配置依赖注入的元数据 - 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.xsd">

    <!--被使用(被依赖)的Bean-->
    <bean id="bean" class="noioo.Bean"/>

    <!--bean的使用者-->
    <bean id="beanUser" class="noioo.BeanUser">
        <!--表明需要构造注入, 并指定ref=所依赖bean的名字-->
        <constructor-arg ref="bean"/>
    </bean>
</beans>

这是第三方调用方(执行者), BeanUser总得有个人来调用它的方法.

package noioo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainRunner {

    public static void main(String[] args){

        // 加载容器
        ApplicationContext context = new
                ClassPathXmlApplicationContext("spring-beans.xml");

        // 利用容器对象(上下文)来获取beanUser对象, 此时会依据beanUser在容器中的配置元数据进行注入.
        BeanUser beanUser = (BeanUser)context.getBean("beanUser");

        // 调用方法: 表明了beanUser可以使用bean中的方法, 是已经获得了bean对象的了.
        beanUser.useBean();
    }
}

运行结果

运行MainRunner, 会出现以下结果:

Hello World

Process finished with exit code 0

基于XML的设值注入

背景

仍是上面的例子.

代码

具有sayHelloWorld的bean - Bean.java

package noioo;

public class Bean {
    public void sayHelloWorld(){
        System.out.println("Hello World");
    }
}

这是想说话的 - BeanUser.java

package noioo;

public class BeanUser {
    
    private Bean bean;
    public Bean getBean() {
        return bean;
    }
    public void setBean(Bean bean) {
        this.bean = bean;
    }
    public void useBean(){
        bean.sayHelloWorld();
    }
}

配置文件 - 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.xsd">

    <!--被使用(被依赖)的Bean-->
    <bean id="bean" class="noioo.Bean"/>

    <!--bean的使用者-->
    <bean id="beanUser" class="noioo.BeanUser">
        <!--表明需要构造注入, 并指定ref=所依赖bean的名字-->
        <property name="bean" ref="bean"/>
    </bean>
</beans>

执行者

package noioo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainRunner {

    public static void main(String[] args){

        // 加载容器
        ApplicationContext context = new
                ClassPathXmlApplicationContext("spring-beans.xml");

        // 利用容器对象(上下文)来获取beanUser对象, 此时会依据beanUser在容器中的配置元数据进行注入.
        BeanUser beanUser = (BeanUser)context.getBean("beanUser");

        // 调用方法: 表明了beanUser可以使用bean中的方法, 是已经获得了bean对象的了.
        beanUser.useBean();
    }
}

运行结果

Hello World

Process finished with exit code 0
posted @ 2018-10-25 14:11  Senyag  阅读(368)  评论(0编辑  收藏  举报