Spring学习----------Spring Bean 的命名方式介绍

本文介绍了在Spring框架中定义Bean时的各种命名方式,包括仅配置全限定类名、指定id、指定name、同时指定id和name、指定多个name以及使用alias标签指定别名等六种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般情况下,在配置一个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接口:

[java] view plain copy
  1. public interface HelloWorld {  
  2.     public void sayHello();  
  3. }  
接下来我们创建HelloWorldImpl实现类:
[java] view plain copy
  1. public class HelloWorldImpl implements HelloWorld{  
  2.     public void sayHello() {  
  3.         System.out.println("Hello World");  
  4.     }  
  5. }  
接下来我们在配置文件中为HelloWorldImpl进行Bean的命名:
[html] view plain copy
  1. <bean class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>  

我们在程序入口Mian.java来加载配置文件以及运行示例。
[java] view plain copy
  1. public static void sayHelloWorldByClass(){  
  2.     //使用FileSystemXmlApplicationContext加载配置文件信息  
  3.     BeanFactory beanFactory=  
  4.           new FileSystemXmlApplicationContext("src/conf/conf-definition.xml");  
  5.     //获取bean实例  
  6.     HelloWorld helloWorld=beanFactory.getBean(HelloWorldImpl.class);  
  7.     helloWorld.sayHello();  
  8. }  
在Main.java文件当中我们需要:
  1. 完成配置文件的加载以及Spring IoC容器的启动
  2. 从容器中获得HelloWorldImpl实现类的实例
  3. 输出问候信息
2.    指定id,唯一
在配置文件中对bean进行配置
[html] view plain copy
  1. <bean id="HelloWorldById" class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>  
修改Main程序入口,新建方法来调用bean
[java] view plain copy
  1. public static void sayHelloWorldById(){  
  2.     BeanFactory factory=  
  3.             new FileSystemXmlApplicationContext("src/conf/conf-definition.xml");  
  4.     HelloWorld helloWorld=factory.getBean("HelloWorldById",HelloWorldImpl.class);  
  5.     helloWorld.sayHello();  
  6. }  
3.    指定name,name为标识符,唯一
在配置文件中对bean进行配置
[html] view plain copy
  1. <bean name="HelloWorldByName" class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>  
修改Main程序入口,新建方法来调用bean
[java] view plain copy
  1. public static void sayHelloWorldByName(){  
  2.     BeanFactory factory=  
  3.             new FileSystemXmlApplicationContext("src/conf/conf-definition.xml");  
  4.     HelloWorld helloWorld=factory.getBean("HelloWorldByName",HelloWorldImpl.class);  
  5.     helloWorld.sayHello();  
  6. }  
4.    指定id和name,其中id为标识符,name为别名,唯一
在配置文件中对bean进行配置
[html] view plain copy
  1. <bean id="HelloWorldById01" name="HelloWorldByName01"  
  2.       class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>  
修改Main程序入口,新建方法来调用bean
[java] view plain copy
  1. public static void sayHelloWorldByNameAndId(){  
  2.     BeanFactory factory=  
  3.             new FileSystemXmlApplicationContext("src/conf/conf-definition.xml");  
  4.     HelloWorld helloWorld01=factory.getBean("HelloWorldById01",HelloWorldImpl.class);  
  5.     HelloWorld helloWorld02=factory.getBean("HelloWorldByName01",HelloWorldImpl.class);  
  6.     helloWorld01.sayHello();  
  7.     helloWorld02.sayHello();  
  8. }  
5.    指定多个name,其中多个name需要用分号来进行分割,第一个name为标识符,其他的为别名,唯一
在配置文件中对bean进行配置
[html] view plain copy
  1. <bean name="bean1;alias01;alias02;alias03"  
  2.       class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>  
  3. <bean id="bean2" name="alias11;alias12;alias13"  
  4.       class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>  
修改Main程序入口,新建方法来调用bean
[java] view plain copy
  1. public static void sayHelloWorldByMutilName(){  
  2.     BeanFactory factory=  
  3.             new FileSystemXmlApplicationContext("src/conf/conf-definition.xml");  
  4.     HelloWorld helloWorld1=factory.getBean("bean1",HelloWorldImpl.class);  
  5.     HelloWorld helloWorld01=factory.getBean("alias01",HelloWorldImpl.class);  
  6.     HelloWorld helloWorld02=factory.getBean("alias02",HelloWorldImpl.class);  
  7.     HelloWorld helloWorld03=factory.getBean("alias03",HelloWorldImpl.class);  
  8.     helloWorld1.sayHello();  
  9.     helloWorld01.sayHello();  
  10.     helloWorld02.sayHello();  
  11.     helloWorld03.sayHello();  
  12.   
  13.     HelloWorld helloWorld2=factory.getBean("bean2",HelloWorldImpl.class);  
  14.     HelloWorld helloWorld11=factory.getBean("alias11",HelloWorldImpl.class);  
  15.     HelloWorld helloWorld12=factory.getBean("alias12",HelloWorldImpl.class);  
  16.     HelloWorld helloWorld13=factory.getBean("alias13",HelloWorldImpl.class);  
  17.     helloWorld2.sayHello();  
  18.     helloWorld11.sayHello();  
  19.     helloWorld12.sayHello();  
  20.     helloWorld13.sayHello();  
  21. }  
6.    指定别名,使用alias标签来进行指定,唯一
在配置文件中对bean进行配置
[html] view plain copy
  1. <bean name="bean3" class="cn.lovepi.chapter03.definition.HelloWorldImpl"/>  
  2. <alias name="bean3" alias="alias21"/>  
  3. <alias name="bean3" alias="alias22"/>  
修改Main程序入口,新建方法来调用bean
[java] view plain copy
  1. public static void sayHelloWorldByAlias(){  
  2.     BeanFactory factory=  
  3.             new FileSystemXmlApplicationContext("src/conf/conf-definition.xml");  
  4.     HelloWorld helloWorld01=factory.getBean("bean3",HelloWorldImpl.class);  
  5.     HelloWorld helloWorld02=factory.getBean("alias21",HelloWorldImpl.class);  
  6.     HelloWorld helloWorld03=factory.getBean("alias22",HelloWorldImpl.class);  
  7.     helloWorld01.sayHello();  
  8.     helloWorld02.sayHello();  
  9.     helloWorld03.sayHello();  
  10.   
  11. }  

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

以上就是命名bean的六种方式。
std::atomicC++11引入的一个原子类型,用于实现多线程环境下的原子操作。它提供了一种线程安全的方式来访问和修改共享变量。 std::atomic<T>的内部实现可以使用不同的机制,具体取决于编译器和平台。一种常见的实现方式是使用硬件提供的原子指令来实现原子操作。这些指令可以确保在多线程环境下对共享变量的操作是原子的,即不会被其他线程中断。 另一种实现方式是使用互斥锁来保护共享变量的访问。当一个线程要访问共享变量时,它会先获取互斥锁,然后执行操作,最后释放互斥锁。这种方式可以确保在任意时刻只有一个线程能够访问共享变量,从而避免了竞争条件。 无论使用哪种实现方式,std::atomic都提供了一系列的成员函数来进行原子操作,包括load、store、exchange、compare_exchange等。这些函数可以保证对共享变量的操作是原子的,并且提供了不同的内存序(memory order)选项来控制操作的顺序和可见性。 下面是一个示例代码,演示了如何使用std::atomic进行原子操作: ```cpp #include <iostream> #include <atomic> std::atomic<int> counter(0); void increment() { counter.fetch_add(1, std::memory_order_relaxed); } int main() { std::cout << "Counter: " << counter.load() << std::endl; std::thread t1(increment); std::thread t2(increment); t1.join(); t2.join(); std::cout << "Counter: " << counter.load() << std::endl; return 0; } ``` 这段代码创建了一个std::atomic<int>类型的counter变量,并定义了一个increment函数,该函数使用fetch_add函数对counter进行原子加一操作。在主函数中,我们创建了两个线程来同时调用increment函数,最后输出counter的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值