3、IoC 之Bean概述
3.1、Bean 命名
Bean 在容器内被封装成
BeanDefinition
类,具体内容可访问 官方文档 进行深入了解
bean命名约定为小驼峰式(如 accountManager、accountService、userDao、loginController)
通过类路径中的组件扫描,基本上采用简单的类名并将其初始字符转换为小写。但是,特殊情况下,当有多个字符并且第一个和第二个字符都是大写时,原始大小写将被保留。这些规则与
java.beans.Introspector.decapitalize
(Spring在这里使用的规则)所定义的规则相同。
3.2、Bean 实例化
- 通常,容器通过反射调用bean的构造器来实例化,等效于
new
- 在不太常见的情况下,容器调用类上的工厂方法来创建 Bean。从调用工厂方法返回的对象类型可以是同一类,也可以是完全另一个类
① 构造函数进行实例化
Bean类:
package hom.wang.vo;
public class ExampleBean {
// ...
}
xml 定义Bean:
<beans>
<!-- 默认调用无参构造,没有无参直接报错:No default constructor found -->
<bean id="exampleBean" class="hom.wang.vo.ExampleBean"/>
</beans>
② 静态工厂方法进行实例化
通过 factory-method
调用静态工厂方法,返回一个 Bean 实例。
Bean类:
package hom.wang.vo;
public class ExampleBean {
private static ExampleBean exampleBean = new ExampleBean();
public static ExampleBean createInstance(){
return exampleBean;
}
}
xml 定义Bean:
<beans>
<!-- 通过 factory-method 指定静态工厂方法 -->
<bean id="exampleBean" class="hom.wang.vo.ExampleBean" factory-method="createInstance"/>
</beans>
③ 实例工厂方法实例化
与通过静态工厂方法
进行实例化类似,实例工厂方法实例化就是bean-B通过 factory-bean
指定bean-A,再通过 factory-method
指定bean-A的静态工厂方法返回bean-B的实例
Bean类:
package hom.wang.vo;
public class BeanA {
private static BeanB beanB = new BeanB();
public static BeanB createBeanBInstance(){
return beanB;
}
}
public class BeanB {
// ...
}
xml 定义Bean:
<beans>
<!-- Bean-A正常创建 -->
<bean id="beanA" class="hom.wang.vo.beanA"/>
<!-- Bean-B通过Bean-A的实例工厂方法创建 -->
<bean id="beanB"
factory-bean="beanA"
factory-method="createBeanBInstance"/>
</beans>
这种方法表明工厂bean本身可以通过依赖注入(DI)进行管理和配置。