spring学习之bean的命名

bean的命名

每一个bean都有一个或者多个标识符,这些标识符在容器中必须是惟一的。spring

XML

  1. 若是id和name都不指定,IOC容器会自动生成一个惟一标识符,即全类名。
  2. 若是仅指定id或者name,则为惟一标识符。
  3. 若是同时指定,id为标识符,name为别名。

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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="orderDao" class="com.learn.ch1.OrderDao"/>

    <bean class="com.learn.ch1.BuyDao"/>
    <bean id="buyDao2" class="com.learn.ch1.BuyDao2"/>
    <bean name="buyDao3" class="com.learn.ch1.BuyDao3"/>
    <bean id="buyDao4" name="buyDao5" class="com.learn.ch1.BuyDao4"/>

</beans>

测试代码:app

@Test
public void test() {
    ApplicationContext app = new ClassPathXmlApplicationContext("daos.xml");
    String[] names = app.getBeanDefinitionNames();
    for (String name : names) {

    }
}

运行结果以下:
image.png测试

注解

注解也有两个属性,name和value,可是这两个不能共存,只能用一个。若是都不指定name和value,那么方法名做为bean的惟一标识符。
MyConfigspa

@Configuration
public class MyConfig {
    @Bean
    public BuyDao buyDao() {
        return new BuyDao();
    }

    @Bean(name = "buyDao2")
    public BuyDao2 buyDao2() {
        return new BuyDao2();
    }

    @Bean(value = "buyDao3")
    public BuyDao3 buyDao3() {
        return new BuyDao3();
    }

  /*  
    两个一块儿指定,会报错
    @Bean(value = "buyDao4", name = "buyDao5")
    public BuyDao4 buyDao4() {
        return new BuyDao4();
    }*/

}

测试代码:3d

@Test
public void test() {
    ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
    String[] names = app.getBeanDefinitionNames();
    for (String name : names) {
        System.out.println(name);
    }
}

运行结果以下:
image.pngcode

bean的别名

当一个bean须要多个标识符时,就须要别名,这些别名也要是惟一的。xml

XML

bean标签

多个别名,能够用,;以及空格隔开。
services.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="orderService" class="com.learn.ch1.OrderService" name="orderService2 orderService3,orderService4;orderService5"/>
</beans>

测试代码以下:blog

@Test
public void test() {
    ApplicationContext app = new ClassPathXmlApplicationContext("services.xml");
    System.out.println(app.getBean("orderService2"));
    System.out.println(app.getBean("orderService3"));
    System.out.println(app.getBean("orderService4"));
    System.out.println(app.getBean("orderService5"));
    String[] aliases = app.getAliases("orderService");
    for(String alias : aliases) {
        System.out.println(alias);
    }
}

运行结果以下:
image.png
能够看出,都是同一个对象,且打印了多个别名。

alias标签

alias配置以下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="orderService" class="com.learn.ch1.OrderService"/>
    <!--name对应的是bean的惟一标识符,alias对应的别名-->
    <alias name="orderService" alias="orderService2"/>
    <alias name="orderService" alias="orderService3"/>
</beans>

测试代码以下:

@Test
public void test() {
    ApplicationContext app = new ClassPathXmlApplicationContext("alias.xml");
    System.out.println(app.getBean("orderService"));
    System.out.println(app.getBean("orderService2"));
    System.out.println(app.getBean("orderService3"));
    String[] aliases = app.getAliases("orderService");
    for(String alias : aliases) {
        System.out.println(alias);
    }
}

运行结果以下:
image.png
效果跟上面例子同样

注解

bean的name和value,都是string类型的数组,因此直接用数组定义,就能够了。
MyConfig

@Configuration
public class MyConfig {
    @Bean(name ={"orderService1","orderService2","orderService3"})
    public OrderService orderService(){
        return new OrderService();
    }
}

测试代码:

@Test
public void test() {
    ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
    System.out.println(app.getBean("orderService1"));
    System.out.println(app.getBean("orderService2"));
    System.out.println(app.getBean("orderService3"));
    String[] aliases = app.getAliases("orderService1");
    for(String alias : aliases) {
        System.out.println(alias);
    }
}

运行结果以下:
image.png

相关文章
相关标签/搜索