SpringFramework|基于XML的两种自动装配

SpringFramework|基于XML的两种自动装配

环境交代

Java: 1.8

Maven: 3

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

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

自动装配byName

来自: W3CSchool中的概述

这种模式由属性名称指定自动装配。Spring 容器看作 beans,在 XML 配置文件中 beans 的 auto-wire 属性设置为 byName。然后,它尝试将它的属性与配置文件中定义为相同名称的 beans 进行匹配和连接。如果找到匹配项,它将注入这些 beans,否则,它将抛出异常。

对比示例 (byName在设值注入的应用)

其目的是省略XML中的一些配置, 以减少代码量.

原例

Bean - Bean.java

❗这个Bean只是由于Spring配置所写顺口叫的, 并不符合严格意义上的JavaBean.

package noioo;

public class Bean {

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

Bean的使用者, 它依赖这个Bean - BeanUser.java

package noioo;

public class BeanUser {

    private Bean beanName;


    public Bean getBeanName() {
        return beanName;
    }

    public void setBeanName(Bean beanName) {
        this.beanName = beanName;
    }

    public void useSayHelloWorld(){
        beanName.sayHelloWorld();
    }
}

Spring XML配置文件 - 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" xmlns:lang="http://www.springframework.org/schema/lang"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">

    <bean id="beanUser" class="noioo.BeanUser">
        <!-- 待会我们将省略下面这个property配置 -->
        <property name="beanName" ref="bean"/> 
    </bean>

    <bean id="beanName" class="noioo.Bean">
    </bean>
</beans>

执行者 - Runner.java

package noioo;

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

public class Runner {

    public static void main(String[] args){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-beans.xml");
        BeanUser beanUser = (BeanUser)context.getBean("beanUser");
        beanUser.useSayHelloWorld();
    }
}
运行结果
Hello World

Process finished with exit code 0

使用byName来省略其中的一些配置

修改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" xmlns:lang="http://www.springframework.org/schema/lang"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">

    <!-- 去掉了property, 新增了属性autowire="byName" -->
    <bean id="beanUser" class="noioo.BeanUser" autowire="byName">
    
    </bean>

    <!-- 这里的id值对应了BeanUser中的属性名bean -->
    <bean id="beanName" class="noioo.Bean">

    </bean>

</beans>

也就是说, 在BeanUser这个类中的属性private Bean beanName将被取出, 用来匹配同名为"beanName"的Spring Bean.

运行结果

运行结果一样.

Hello World

Process finished with exit code 0

虽然在这里省略的代码并不是很多, 毕竟只有一个对象....


自动装配byType

这种模式由属性类型指定自动装配。Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 byType。然后,如果它的 type 恰好与配置文件中 beans 名称中的一个相匹配,它将尝试匹配和连接它的属性。如果找到匹配项,它将注入这些 beans,否则,它将抛出异常。

来自: W3CSchool中的概述

示例

上面的Java代码不用改, 仅仅修改配置文件即可.

Spring配置文件 - 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" xmlns:lang="http://www.springframework.org/schema/lang"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd">

    <bean id="beanUser" class="noioo.BeanUser" autowire="byType">
        <!-- 它将会以定义的属性值的类型来匹配这里的Bean名,
                    属性值是Bean, 也就是将会匹配一个类型为"Bean"的Spring Bean
                -->
    </bean>

    <!-- 因为是根据类型匹配的, 我们甚至连给这个Bean起id都不用 -->
    <bean class="noioo.Bean">

    </bean>

</beans>

❗注意:

是按照UserBean中属性的类型来匹配的.

运行结果

Hello World

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