Spring学习(十三)Spring Bean 的命名方式介绍

一般情况下,在配置一个Bean时需要为其指定一个id属性作为bean的名称。id在IoC容器中必须是唯一的,此外id的命名需要满足xml对id的命名规范。
       在实际情况中,id命名约束并不会给我们带来影响。但是如果用户确实希望用到一些特殊字符来对bean进行命名,那么可以使用bean的name属性来进行命名,name属性没有字符上的限制,几乎可以使用任何字符。
       每个Bean可以有一个或多个 id,我们把第一个 id 称为“标识符”,其余id叫做“别名”,这些id在 IoC 容器中必须唯一。

首先来介绍一下Bean id 的命名规则
  1. 遵循XML命名规范
  2. 由字母,数字,下划线组成
  3. 驼峰式,首个单词字母小写,从第二个单词开始首字母大写。
接下来我们使用具体的例子来介绍Bean的不同命名方式
1.    配置全限定类名,唯一
在示例中主要向大家输出问候信息,我们需要一个HelloWorld接口以及一个名称为HelloWorldImpl的实现类。接下来我们创建一个配置文件和一个程序的入口类。

首先在项目中创建包definition,接下来在包中创建HelloWorld接口:

public interface HelloWorld {
    public void sayHello();
}
接下来我们创建HelloWorldImpl实现类:
public class HelloWorldImpl implements HelloWorld{
    public void sayHello() {
        System.out.println("Hello World");
    }
}
接下来我们在配置文件中为HelloWorldImpl进行Bean的命名:

<bean class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>

我们在程序入口Mian.java来加载配置文件以及运行示例。
public static void sayHelloWorldByClass(){
    //使用FileSystemXmlApplicationContext加载配置文件信息
    BeanFactory beanFactory=
          new FileSystemXmlApplicationContext("src/conf/conf-definition.xml");
    //获取bean实例
    HelloWorld helloWorld=beanFactory.getBean(HelloWorldImpl.class);
    helloWorld.sayHello();
}
在Main.java文件当中我们需要:
  1. 完成配置文件的加载以及Spring IoC容器的启动
  2. 从容器中获得HelloWorldImpl实现类的实例
  3. 输出问候信息
2.    指定id,唯一
在配置文件中对bean进行配置
<bean id="HelloWorldById" class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>
修改Main程序入口,新建方法来调用bean

public static void sayHelloWorldById(){
    BeanFactory factory=
            new FileSystemXmlApplicationContext("src/conf/conf-definition.xml");
    HelloWorld helloWorld=factory.getBean("HelloWorldById",HelloWorldImpl.class);
    helloWorld.sayHello();
}
3.    指定name,name为标识符,唯一
在配置文件中对bean进行配置
<bean name="HelloWorldByName" class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>
修改Main程序入口,新建方法来调用bean
public static void sayHelloWorldByName(){
    BeanFactory factory=
            new FileSystemXmlApplicationContext("src/conf/conf-definition.xml");
    HelloWorld helloWorld=factory.getBean("HelloWorldByName",HelloWorldImpl.class);
    helloWorld.sayHello();
}
4.    指定id和name,其中id为标识符,name为别名,唯一
在配置文件中对bean进行配置
<bean id="HelloWorldById01" name="HelloWorldByName01"
      class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>
修改Main程序入口,新建方法来调用bean

public static void sayHelloWorldByNameAndId(){
    BeanFactory factory=
            new FileSystemXmlApplicationContext("src/conf/conf-definition.xml");
    HelloWorld helloWorld01=factory.getBean("HelloWorldById01",HelloWorldImpl.class);
    HelloWorld helloWorld02=factory.getBean("HelloWorldByName01",HelloWorldImpl.class);
    helloWorld01.sayHello();
    helloWorld02.sayHello();
}
5.    指定多个name,其中多个name需要用分号来进行分割,第一个name为标识符,其他的为别名,唯一
在配置文件中对bean进行配置
<bean name="bean1;alias01;alias02;alias03"
      class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>
<bean id="bean2" name="alias11;alias12;alias13"
      class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>
修改Main程序入口,新建方法来调用bean
public static void sayHelloWorldByMutilName(){
    BeanFactory factory=
            new FileSystemXmlApplicationContext("src/conf/conf-definition.xml");
    HelloWorld helloWorld1=factory.getBean("bean1",HelloWorldImpl.class);
    HelloWorld helloWorld01=factory.getBean("alias01",HelloWorldImpl.class);
    HelloWorld helloWorld02=factory.getBean("alias02",HelloWorldImpl.class);
    HelloWorld helloWorld03=factory.getBean("alias03",HelloWorldImpl.class);
    helloWorld1.sayHello();
    helloWorld01.sayHello();
    helloWorld02.sayHello();
    helloWorld03.sayHello();

    HelloWorld helloWorld2=factory.getBean("bean2",HelloWorldImpl.class);
    HelloWorld helloWorld11=factory.getBean("alias11",HelloWorldImpl.class);
    HelloWorld helloWorld12=factory.getBean("alias12",HelloWorldImpl.class);
    HelloWorld helloWorld13=factory.getBean("alias13",HelloWorldImpl.class);
    helloWorld2.sayHello();
    helloWorld11.sayHello();
    helloWorld12.sayHello();
    helloWorld13.sayHello();
}
6.    指定别名,使用alias标签来进行指定,唯一
在配置文件中对bean进行配置
<bean name="bean3" class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>
<alias name="bean3" alias="alias21"/>
<alias name="bean3" alias="alias22"/>
修改Main程序入口,新建方法来调用bean
public static void sayHelloWorldByAlias(){
    BeanFactory factory=
            new FileSystemXmlApplicationContext("src/conf/conf-definition.xml");
    HelloWorld helloWorld01=factory.getBean("bean3",HelloWorldImpl.class);
    HelloWorld helloWorld02=factory.getBean("alias21",HelloWorldImpl.class);
    HelloWorld helloWorld03=factory.getBean("alias22",HelloWorldImpl.class);
    helloWorld01.sayHello();
    helloWorld02.sayHello();
    helloWorld03.sayHello();

}

利用别名命名时得先有一个唯一的名称(id和name都可以)

以上就是命名bean的六种方式。









Spring中的循环依赖指的是两个或多个Bean之间相互依赖,形成了一个循环依赖的关系。例如,Bean A依赖于Bean B,而Bean B又依赖于Bean A,这样就形成了一个循环依赖的关系。 当Spring容器在创建Bean时遇到循环依赖的情况,会抛出BeanCurrentlyInCreationException异常,提示循环依赖的存在。为了解决这个问题,Spring采用了“提前曝光”的方式来处理循环依赖。 具体来说,当发现循环依赖的情况时,Spring会将其中一个Bean提前暴露给另一个Bean使用。这个提前暴露的Bean会被注入一个代理对象(Proxy),而不是实际的Bean实例。当被注入的Bean被调用时,代理对象会自动获取实际的Bean实例并调用其方法。 Spring中对于循环依赖的处理过程包括以下步骤: 1. 创建Bean A实例,并将其加入到缓存中。 2. 创建Bean B实例,发现Bean B依赖于Bean A。 3. 创建Bean A的代理对象,并注入到Bean B中。 4. 使用Bean B的代理对象完成Bean B的创建,并将其加入到缓存中。 5. 使用Bean A的代理对象完成Bean A的创建,并将其加入到缓存中。 6. 将Bean A的实际实例注入到Bean B的代理对象中。 7. 将Bean B的实际实例注入到Bean A的代理对象中。 需要注意的是,对于循环依赖的处理过程,只有在Bean的作用域为单例(Singleton)时才会发生。对于其他作用域,例如原型(Prototype)作用域,Spring容器不会缓存Bean实例,也就不存在循环依赖的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值