Spring_10_Beans 的自动装配


65269@163.com


Beans 的自动装配

Spring 容器可以在不使用和元素的清空下自动装配相互协作的bean之间的关系,这有助于减少编写一个答的基于Spring的应用程序的XML配置的数量.

自动装配模式

自动装配:

Spring是受欢迎的企业级Java应用程序开发框架,数以百万的来自世界各地的开发人员都在使用 Spring 框架创建高性能、易于测试和可重用的代码。

自动装配是Spring框架的重要功能,是使用Spring满足bean依赖的一种方式,Spring会在应用中为某个bean寻找其依赖的bean,Spring中bean有三种装配机制,分别是:在xml中显示配置、在java中显示配置以及隐式的bean发现机制和自动装配。

自动装配模式

下列是自动装配模式,他们可以用于指示Spring容器为 来使用自动装配进行依赖注入. 你可以使用元素的autowire属性为一个bean定义指定的自动装配模式

模式描述
no这个是默认的设置,它以为着没有自动装配,你应该使用显示的bean引用来连接.你可不用为了连接做特殊的事.
byName由属性名自动装配,Spring容器看到在XML配置文件中bean的自动装配的属性设置为byName.然后尝试匹配,并且将它的属性与在配置文件中被定义为相同名称的bean的属性进行连接
byType由属性类型自动装配.Spring容器看到在XML配置文件中bean的自动装配的属性为byType.然后如果它的类型匹配配置文件中的一个确切的bean名称,它将尝试匹配连接属性的类型,如果存在不止一个这样的bean,则一个指明的异常将会被抛出.
constructor类似于byType,但该类型适用于构造函数参数类型,如果在容器中没有一个构造函数类型的bean,则一个指明的错误将会发生.
autodetectSpring首先尝试通过constructor使用自动装配来连接,如果它不执行,Spring尝试通过byType来自动装配

可以使用byType或者constructor自动装配模式来连接数组和其他类型的集合.

自动装配的局限性

当自动装配始终在同一个项目中使用时,它的效果最好.如果通常不使用自动装配,它可能会使开发人员混淆的使用它来连接只有一个或者两个bean定义.不过,自动装配可以显著减少需要指定的属性构造器参数,但你应该在使用他们之前考虑到自动装配的局限性和缺点.

限制描述
重写的可能性你可以使用总是重写自动装配和设置来指定依赖关系
原始数据类型你不能自动渣u哪个品牌所谓的简单类型包括基本类型,字符串和类
混乱的本质自动装配不如显示装配精确,所以如果可能的话尽可能的使用显示装配.

Spring 自动装配’byName’

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

例如:

在配置文件中,如果一个bean定义设置为自动装配byName,并且它包含SpellChecker属性(即,它有一个setSpellChecker()的方法),那么S平均日那个就会查找定义名为spellChecker的bean,并且用它来设置属性.你仍可以使用标签连接其余的属性.

步骤描述
1创建一个名称为 SpringExample 的项目,并且在已创建的项目的 c src 文件夹中创建一个包 com.tutorialspoint 。
2使用 Add External JARs 选项,添加所需的 Spring 库,在 Spring Hello World Example 章节中已说明。
3在 com.tutorialspoint 包中创建 Java 类 TextEditor , SpellChecker 和 MainApp
4在src 文件夹中创建 Beans 的配置文件 Beans.xml 。
5最后一步是创建所有 Java 文件和 Bean 配置文件的内容,并运行该应用程序,正如下面解释的一样。

TextEditor.java

package com.tutorialspoint;

public class TextEditor {
    private SpellChecker spellChecker;
    private String name;

    public SpellChecker getSpellChecker() {
        return spellChecker;
    }

    public void setSpellChecker(SpellChecker spellChecker) {
        this.spellChecker = spellChecker;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void spellCheck(){
        spellChecker.checkSpelling();
    }

}

SpellChecker.java

package com.tutorialspoint;

public class SpellChecker {


    public SpellChecker() {
        System.out.println(" SpellChecker     的 构造方法");
    }

    public void checkSpelling() {
        System.out.println("SpellChecker 中的  checkSpelling() 方法");
    }

}

MainApp.java

package com.tutorialspoint;

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

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "Beans.xml");
        TextEditor te = (TextEditor) context.getBean("textEditor");
        te.spellCheck();
    }
}

下面是正常清空下的配置文件

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-3.0.xsd">

    <bean id="textEditor" class="com.tutorialspoint.TextEditor">
        <property name="spellChecker" ref="spellChecker" />
        <property name="name" value="Generic TextEditor" />
    </bean>

    <bean id="spellChecker" class="com.tutorialspoint.SpellChecker"></bean>

</beans>

如果使用自动装配”byName” , 那么你的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-3.0.xsd">

    <bean id="textEditor" class="com.tutorialspoint.TextEditor"
        autowire="byName">
        <property name="name" value="Generic Text Editor" />
    </bean>

    <bean id="spellChecker" class="com.tutorialspoint.SpellChecker" />

</beans>

byName的加载过程图解:

img

图片中只理解了对byName的加载,其他的执行过程都是一样的.

Spring 自动装配 byType

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

例如:

在配置文件中,如果一个bean定义设置为自动装配byType,并且包含SpellChecker类型的spellChecker属性,那么Spring就会查找定义名为SpellChecker的bean,并且用它来设置这个属性.你仍然可以使用标签连接其余属性.下面的例子说明这个概念,你会发现和上面的例子没什么区别.除了XML文件的配置发生了少许的改变.

代码与上面的byName的代码一致,但Beans.xml中的类型需要该成byType.

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-3.0.xsd">

    <bean id="textEditor" class="com.tutorialspoint.TextEditor"
        autowire="byType">
        <property name="name" value="Generic Text Editor" />
    </bean>

    <bean id="spellChecker" class="com.tutorialspoint.SpellChecker" />

</beans>

img

Spring 由 构造函数自动装配

这种模式与byType非常相似,但它应用于构造器参数.Spring容器看做beans,在XML配置文件中beans的autowire属性设置为 constructot . 然后 , 它尝试把构造函数的参数与配置文件中的beans名称中的一个进行匹配和连接,如果找到匹配项,它会注入这些bean,否则抛出异常.

例如

在配置文件中,如果一个本定义设置通过构造函数自动装配,而且它带有一个SpellChecker类型的参数之一的构造函数,那么Spring就会查找定义名为SpellChecker的bean,并且用它来设置构造函数的参数,你仍然可以使用标签连接其余属性.

案例:

步骤描述
1创建一个名称为 SpringExample 的项目,并且在已创建的项目的 c src 文件夹中创建一个包 com.tutorialspoint 。
2使用 Add External JARs 选项,添加所需的 Spring 库,在 Spring Hello World Example 章节中已说明.
3在 com.tutorialspoint 包中创建 Java 类 TextEditor , SpellChecker 和 MainApp
4在src 文件夹中创建 Beans 的配置文件 Beans.xml 。
5最后一步是创建所有 Java 文件和 Bean 配置文件的内容,并运行该应用程序,正如下面解释的一样。

TextEditor.java

package com.tutorialspoint;

public class TextEditor {
    private SpellChecker spellChecker;

    private String name;


    public TextEditor(SpellChecker spellChecker, String name) {
        this.spellChecker = spellChecker;
        this.name = name;
    }

    public SpellChecker getSpellChecker() {
        return spellChecker;
    }

    public void setSpellChecker(SpellChecker spellChecker) {
        this.spellChecker = spellChecker;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void spellCheck(){
        spellChecker.checkSpelling();
    }

}

SpellChecker.java

package com.tutorialspoint;

public class SpellChecker {

    public SpellChecker() {
        System.out.println(" SpellChecker     的 构造方法");
    }

    public void checkSpelling() {
        System.out.println("SpellChecker 中的  checkSpelling() 方法");
    }

}

MainApp.java

package com.tutorialspoint;

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

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "Beans.xml");
        TextEditor te = (TextEditor) context.getBean("textEditor");
        te.spellCheck();
    }
}

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-3.0.xsd">

    <bean id="textEditor" class="com.tutorialspoint.TextEditor"
        autowire="constructor">
        <constructor-arg value="Generic Text Editor" />
    </bean>

    <bean id="spellChecker" class="com.tutorialspoint.SpellChecker" />

</beans>

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值