• 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
    
  • 相关阅读:
    Codeforces 512E
    UOJ #36 -【清华集训2014】玛里苟斯(线性基+暴搜)
    Codeforces 1188E
    洛谷 P7163
    C++ Boost库 操作日期与时间
    C/C++ 搜索缝隙并插入ShellCode
    线性代数学习之正交性,标准正交矩阵和投影
    洛谷 P5851 [USACO19DEC]Greedy Pie Eaters P(区间dp)
    洛谷 [NOIP2009 普及组] 道路游戏(dp)
    洛谷 P2890 [USACO07OPEN]Cheapest Palindrome G(区间dp)
  • 原文地址:https://www.cnblogs.com/shwo/p/9850144.html
Copyright © 2020-2023  润新知