3.5 Bean的装配方式

Bean的装配方式可以理解为将Bean依赖注入到Spring容器中,Bean的装配方式即Bean的依赖注入方式。Spring容器支持基于XML配置的装配、基于注解的装配以及自动装配等多种装配方式。本节将主要讲解基于XML配置的装配和基于注解的装配。

1.基于XML配置的装配

通过2.3节的学习之后,我们知道Spring提供了两种基于XML配置的装配方式:构造方法注入和属性setter方法注入。

目录结构

img

1.1创建Bean的实现类

在ch3应用src目录中,创建包assemble,在assemble包下创建类ComplexUser。在类ComplexUser中分别使用构造方法注入和setter注入

ComplexUser.java

package assemble;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class ComplexUser {
    private String uname;
    private List<String> hobbyList;
    private Map<String,String> residenceMap;
    private Set<String> aliasSet;
    private String[] array;
    
    public ComplexUser(String uname, List<String> hobbyList, Map<String, String> residenceMap, Set<String> aliasSet,
            String[] array) {
        super();
        this.uname = uname;
        this.hobbyList = hobbyList;
        this.residenceMap = residenceMap;
        this.aliasSet = aliasSet;
        this.array = array;
    }

    public ComplexUser() {
        super();
        // TODO Auto-generated constructor stub
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public List<String> getHobbyList() {
        return hobbyList;
    }

    public void setHobbyList(List<String> hobbyList) {
        this.hobbyList = hobbyList;
    }

    public Map<String, String> getResidenceMap() {
        return residenceMap;
    }

    public void setResidenceMap(Map<String, String> residenceMap) {
        this.residenceMap = residenceMap;
    }

    public Set<String> getAliasSet() {
        return aliasSet;
    }

    public void setAliasSet(Set<String> aliasSet) {
        this.aliasSet = aliasSet;
    }

    public String[] getArray() {
        return array;
    }

    public void setArray(String[] array) {
        this.array = array;
    }

    @Override
    public String toString() {
        return "ComplexUser [uname=" + uname + ", hobbyList=" + hobbyList + ", residenceMap=" + residenceMap
                + ", aliasSet=" + aliasSet + ", array=" + Arrays.toString(array) + "]";
    }
    
    
}

1.2配置Bean

在Spring配置文件中,使用实现类ComplexUser配置Bean的两个实例。

<!-- 使用构造方法注入方式装配ComplexUser实例user1 -->
    <bean id="user1" class="assemble.ComplexUser">
        <constructor-arg index="0" value="cxk" />
        <constructor-arg index="1">
            <list>
                <value>唱</value>
                <value>跳</value>
                <value>rap</value>
                <value>篮球</value>
            </list> 
        </constructor-arg>
        <constructor-arg index="2">
            <map>
                <entry key="dalian" value="大连" />
                <entry key="shenyang" value="沈阳" />
                <entry key="shanghia" value="上海" />
            </map>
        </constructor-arg>
        <constructor-arg index="3">
            <set>
                <value>100</value>
                <value>101</value>
                <value>102</value>
            </set>
        </constructor-arg>
        <constructor-arg index="4">
            <array>
                <value>aaaaa</value>
                <value>bbbbb</value>
            </array>
        </constructor-arg>
    </bean>
<!-- 使用属性setter方法注入方式装配ComplexUser实例user2 -->
    <bean id="user2" class="assemble.ComplexUser">
        <property name="uname" value="wtf" />
        <property name="hobbyList">
            <list>
                <value>看书</value>
                <value>学spring</value>
            </list> 
        </property>
        <property name="residenceMap">
            <map>
                <entry key="dalian" value="大连" />
                <entry key="shenyang" value="沈阳" />
                <entry key="shanghia" value="上海" />
            </map>
        </property>
        <property name="aliasSet">
            <set>
                <value>103</value>
                <value>104</value>
                <value>105</value>
            </set>
        </property>
        <property name="array">
            <array>
                <value>ccccc</value>
                <value>ddddd</value>
            </array>
        </property>
    </bean>

1.3测试基于XML配置的装配方式

在ch3应用的test包中,创建测试类TestAssemble

TestAssemble.java

package test;

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

import assemble.ComplexUser;

public class TestAssemble {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
        ComplexUser u1 = (ComplexUser)appCon.getBean("user1");
        System.out.println(u1);
        ComplexUser u2 = (ComplexUser)appCon.getBean("user2");
        System.out.println(u2);
    }

}

运行结果

img

2.基于注解的装配

在Spring框架中定义了一些列的注解,常用注解的使用见3.5+;
下面通过一个实例讲解@Component()

注:在Spring 4.0以上版本,配置注解指定包中的注解进行扫描前,需要事先导入Spring Aop的JAR包spring-aop-5.0.2.RELEASE.jar

目录结构

img

2.1创建Bean的实现类

在ch3应用src目录中,创建包annotation,在annotation包下创建类AnnotationUser.java。

AnnotationUser.java

package annotation;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component()
/*
 * 相当于@Component("annotationUser")或
 * @Component(value="annotationUser"),annotationUser为Bean的id,默认为类名首字母的小写
 */
public class AnnotationUser {
    @Value("基于注解装配")
    private String uname;

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    @Override
    public String toString() {
        return "AnnotationUser [uname=" + uname + "]";
    }
    
    
}

2.2配置注解

现在有了Bean的实现类,但还不能进行测试,因为Spring容器并不知道去哪里扫描Bean对象。需要在配置文件中配置注解,这里我们在src目录中新建一个annotationContext.xml,注解配置方式如下:

annotationContext.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.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 使用context命名空间,通过Spring扫描指定包下所有的Bean实现类,通过注释解析 -->
    <context:component-scan base-package="annotation"/>
     
</beans>

2.3测试Bean实例

在ch3英语的test包中,创建测试类TestAnnotation,具体代码如下

TestAnnotation.java

package test;

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

import annotation.AnnotationUser;
import assemble.ComplexUser;

public class TestAnnotation {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ApplicationContext appCon = new ClassPathXmlApplicationContext("annotationContext.xml");
        AnnotationUser au = (AnnotationUser)appCon.getBean("annotationUser");
        System.out.println(au.getUname());
    }

}

运行结果

img

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容