Spring-Spring配置概述

Spring容器高层视图

成功启动Spring容器的三个必要条件:

  1. Spring框架的类包均已放在应用程序的类路径下
  2. 应用程序为Spring提供了完整的Bean配置信息
  3. Bean的类都已经放到应用程序的类路径下

Spring启动时,读取应用程序提供的Bean配置信息,并在Spring容器中提供一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。

Bean配置信息

Bean配置信息是Bean的元数据信息,由以下4个方面组成

  • Bean的实现类
  • Bean的属性信息 ,如数据源的连接数、用户名密码等
  • Bean的依赖关系,Spring根据依赖关系配置Bean之间的装配
  • Bean的行为配置,如生命周期范围和生命周期各个过程的回调函数等。

Spring元数据信息在Spring容器中的内部对应由一个个BeanDefinition行程的Bean注册表。

Spring支持多种形式的Bean配置方式。

  • Spring 1.0仅支持基于XML的配置方式
  • Spring 2.0新增基于注解的配置方式
  • Spring 3.0新增基于Java类配置的支持
  • Spring 4.0新增基于Groovy动态语言配置的支持

这里写图片描述

Bean配置信息
首先定义了Bean的实现及依赖关系,Spring容器根据Bean的配置信息在容器内部建立Bean定义注册表,
然后根据注册表加载、实例化Bean,并建立Bean之间的依赖关系,
最后将这些准备就绪的Bean放到Bean缓存池中,供外层的应用调用。


基于XML的配置

基于XML的配置,spring1.0的配置文件采用DTD格式,Spring2.0以后则采用Schema形式,基于Schema形式,让不同类型的配置拥有了自己的命名空间,更具扩展性。此外,Spring基于Schema配置方案为许多领域的问题提供了简化的配置方法,配置工作因此得到了大幅简化。

Schema的配置格式

这里写图片描述

解析:

  • ① 默认命名空间:它没有空间名,用于Spring Bean的定义;
  • ② xsi命名空间:这个命名空间用于为每个文档中命名空间指定相应的Schema样式文件,是标准组织定义的标准命名空间;
  • ③ aop命名空间:这个命名空间是Spring配置AOP的命名空间,是用户自定义的命名空间。

命名空间的定义分为两个步骤:
第一步指定命名空间的名称,
第二步指定命名空间的Schema文档样式文件的位置,用空格或回车换行进行分隔。

命名空间使用全限定名,每个组织机构在发布Schema文件后,都会为该Schema文件提供一个引用的URL地址,一般使用这个URL地址指定命名空间对应的Schema文件。

命名空间名称和对应的Schema文件地址之间使用空格或回车分隔,不同的命名空间之间也使用这种分隔方法。

指定命名空间的Schema文件地址有两个用途:

  • XML解析器可以获取Schema文件并对文档进行格式合法性验证;
  • 在开发环境下,IDE可以引用Schema文件对文档编辑提供诱导功能(自动补全)。

Spring4.0配置的Schema文件放在各模块Jar文件内一个名为config的目录下

比如AOP:

这里写图片描述
这里写图片描述

强烈建议使用新的基于Schema的配置方式

除了Xml的配置方式,spring还支持基于注解、Java类、Groovy的配置方式,本质上是相同的,仅仅是形的区别。

基于Xml的配置方式是最基础、最传统的配置方式,下面我们注重探讨基于Xml的配置,另外三种也作简要介绍。


Bean的基本配置

装载一个Bean

在Spring容器的配置文件中定义一个简要的Bean的配置片段如下

<bean id="plane"  class="com.xgj.Plane">
  • id:bean的名称 ,通过容器的getBean(“plane”)即可获得对应的Bean,在容器中起到定位查找的作用,是外部程序和SpringIoC容器进行交互的桥梁,
  • class:bean的类名,指定了Bean对应的实现类

我们用STS创建一个Maven工程如下:举例:

这里写图片描述

logback.xml没用,使用的log4j的配置那文件

package com.xgj.ioc.beans;

public class Boss {

    private String name;
    private String sex;
    private int age;
    private Plane plane ;

    ....省略setter/getter 
    public void introduce() {
        System.out.println("Boss Information【name:" + name + ",sex:" + sex + ",age:" + age +"】" );
        plane.info();
    }

}
package com.xgj.ioc.beans;

public class Plane {

    private String brand;
    private String color;
    private int speed;

    ....省略setter/getter     

    public void info(){
        System.out.println("brand:" + brand + ",color:" + color + ",speed" + speed);
    }

}
package com.xgj.ioc.beans;

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

public class Test {

    public static void main(String[] args) {
        // 加载配置文件
        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "classpath:spring/application-config.xml");
        // 从容器中获取实例化后的bean
        Boss boss = ctx.getBean("boss", Boss.class);
        Plane plane = ctx.getBean("plane", Plane.class);

        // 设置属性
        boss.setName("XGJ");
        boss.setSex("MALE");
        boss.setAge(20);
        boss.setPlane(plane);
        // 设置属性
        plane.setBrand("A380");
        plane.setColor("red");
        plane.setSpeed(900);
        // 调用方法
        boss.introduce();

    }

}

application-config.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">

    <!-- Uncomment and add your base-package here:
         <context:component-scan
            base-package="org.springframework.samples.service"/>  -->

     <bean id="plane" class="com.xgj.ioc.beans.Plane"/>
     <bean id="boss" class="com.xgj.ioc.beans.Boss"/>

</beans>

这里写图片描述


Bean的命名

一般情况下,在配置一个Bean时,需要为其指定一个id属性作为Bean的名称。

id在IoC容器中必须是唯一的,并且id的命名需要满足XML对id的命名规范(id是xml规定的特殊属性)

  • 必须以字母开始,后面可以是字符、数字、连接符、下划线、局号、冒号等完整结束(full stops)的符号
  • 逗号和空格这些非完整结束符是非法的。

在实际情况下,id命名约束并不会给用户带来影响,如果用户确实希望用一些特殊字符进行bean命名,这可以使用<bean>的name属性。 name属性没有字符上的限制,几乎可以使用任何字符比如?ab、123

id和name都可以指定多个名字,名字之间可以用逗号、分号或者空格进行分隔,比如

     <bean id="plane" name="#plane1,123,$plane" class="com.xgj.ioc.beans.Plane"/>

用户可以通过getBean(“#plane1”),getBean(“123”),getBean(“$plane”),获取IoC容器中的plane Bean.

Spring配置文件不允许出现两个相同id的bean, 但可以出现两个相同name的bean。

如果有多个相同name的bean,通过getBean(BeanName)则获取的是后面声明的那个Bean。

为了避免此问题,应尽量使用ID,而非Name来命名Bean。

如果id和name均未指定,比如

 <bean class="com.xgj.ioc.beans.Plane"/>

Spring会指定将全限定类名作为bean的名称,用户可以通过getBean(“com.xgj.ioc.beans.Plane”)获取Bean

如果存在多个实现类相同的匿名Bean,如下

 <bean class="com.xgj.ioc.beans.Plane"/>
 <bean class="com.xgj.ioc.beans.Plane"/>
 <bean class="com.xgj.ioc.beans.Plane"/>

第一个Bean可以通过getBean(“com.xgj.ioc.beans.Plane”)获得
第二个Bean通过getBean(“com.xgj.ioc.beans.Plane#1”)获得
第三个Bean通过getBean(“com.xgj.ioc.beans.Plane#2”)获得

一般匿名bean在通过内部Bean为外层Bean提供注入值是使用,类似Java的匿名类。

总结:

上面各种命名方式,只是为了演示Sping配置的灵活性和包容性,实际应用中并不多见, 通过id为Bean指定唯一的名称才是正解。


导读

01-Spring-Spring配置概述

02-Spring-依赖注入

03-Spring-注入参数详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值