对Spring Bean的一些思考(对Bean的理解及命名问题)

本文探讨了Spring IoC容器中Bean的本质,它是对象的工厂产物,单例或多例的区别,以及Spring命名规则在注册Bean时的重要性。通过实例说明了如何理解和处理Bean命名问题,包括UserController类的实例化和扫描目录下Bean的命名规则。

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

Bean简单介绍

我们知道Spring是一个“大型工厂”,是一个IoC容器。
那么Bean就是这个工厂的产品,以前我们的对象是由自己 new 出来的,现在,现在是由Spring帮我们制造并且保管,所以说白了。
Spring是容器,Bean就是容器里装的东西,Bean的概念和对象相似(纠正:当时对Bean理解有些偏差,一个Bean默认为单例模式,就是我一开始误以为理解的一个Bean就是一个实例。而实际上,Bean还有多例模式,一个Bean对应多个实例,本处知识涉及到我刚学的Bean作用域:http://t.csdn.cn/x8UTw)。

学习过程中有了以下思考:

新建一个UserController类:
在这里插入图片描述
然后在xml注册Bean:
![在这里插入图片描述](https://img-blog.csdnimg.cn/cea3082297694c60a97a56b531812453.png在这里插入图片描述

这里是一个Bean,然后在启动类做以下操作:
在这里插入图片描述
创建user 和 user1两个引用,打印二者地址:
在这里插入图片描述
这表明两个引用是引用的同一个对象(这个是都知道的)

那么我们换一种方式
在这里插入图片描述
xml注册两个Bean:user1 and user2.
然后在启动类做以下操作:

@Controller
public class App {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
        UserController user = applicationContext.getBean("user1",UserController.class);
        UserController user1 = applicationContext.getBean("user2",UserController.class);
        System.out.println(user);
        System.out.println(user1);
    }
}

两个引用分别获取user1和user2,再打印
!](https://img-blog.csdnimg.cn/f031b54959544f6e9d2c55f7b28268d7.png)

此时二者两个引用引用的对象就不一样了,没有什么神奇的,但是想清楚了这个一下子对bean的理解就更清晰了,回到我们开头对Bean的简单介绍,其实说那么多,Bean其实就是一个个对象,id不同,对象也不同,只不过这个对象是由Spring来创建并托管的(可能说法不太严谨,但理解上应该没错)。

遇到的Bean的命名问题

之前遇到的一个问题:
通过扫描目录注册Bean
该目录下的类:
在这里插入图片描述

在这里插入图片描述
然后再启动类获取Bean却报错了

@Controller
public class App {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
        UserController user = applicationContext.getBean("UserController",UserController.class);
    }
}

在这里插入图片描述

检查了半天,getBean里的名称和类名是对应的,也没有打错呀,但是为什么会报错找不到该bean呢?
这里就牵扯了Spring扫描目录创建bean的命名规则了
搜索该方法,是负责创建bean的方法
在这里插入图片描述
然后疯狂F4,找到了它的命名规则:
在这里插入图片描述

  • 如果前两个字母都是大写,则直接使用这个名字
  • 如果非前两个字母都是大写,则将第一个字母转换为小写,然后用转换后的名称命名该Bean

例如:IsBean会被转换为isBean,而IBean就直接是IBean,不经过转换。
我们明白了这个之后,对上面报错代码进行验证
在这里插入图片描述
将UserController改为userController之后,这次就没有报错
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值