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

那么我们换一种方式
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,再打印
此时二者两个引用引用的对象就不一样了,没有什么神奇的,但是想清楚了这个一下子对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之后,这次就没有报错