Spring Ioc 容器是负责管理 Bean 的,所以在持续学习 Spring 其余内容之前,咱们须要首先理解一下 Bean。
利用创立的 java class,通过 Spring IoC 实例化创建对象并放入 Spring IoC 容器交给 Spring IoC 容器治理后,这个 java 对象就叫 Bean。
Bean 通过 xml 文件定义(bean 标签),或者能够通过注解定义。Spring 外部通过 BeanDefinition 治理 Bean 的定义信息(也叫元数据),BeanDefinition 次要包含如下 Bean 定义的元数据:
- class name:全限定类名称,xml 中通过 class 指定,注解形式的话就是该类的全限定类名。
- 行为属性:包含 scope、lifecycle、callbacks 等。
- 其余对象的援用:依赖对象。
Bean 的命名
Spring IoC 通过 id 惟一辨认一个 Bean,在整个 Spring IoC 容器中不反复。
通过 xml 文件配置 Spring 的时候,id 个别是要求必须要指定的,然而通过注解形式配置的时候,id 不须要指定。不指定 id 的状况下,Spring 默认通过 java.beans.Introspector.decapitalize 转换类名生成 id:类名首字母小写后生成 id。
Bean 的实例化
其实咱们后面的文章曾经说过了,有两种形式实例化 Bean,一种是基于结构器的,一种是基于 Factory Method。
Spring 反对通过默认的无参结构器实现实例化,或者能够在配置文件指定结构器参数、Spring 调用有参结构器实现实例化。底层理论都是通过 java 反射机制实现 Bean 的实例化。
通过 Factory Method 实例化有两种不同的模式,一种是动态工厂办法:
<bean id="clientService"
class="examples.ClientService"
factory-method="createInstance"/>
还有一种是通过实例工厂办法(非静态方法):
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- inject any dependencies required by this locator bean -->
</bean>
<!-- the bean to be created via the factory bean -->
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
通过实例工厂办法的形式实例化 Bean,要求工厂类必须也是 Spring IoC 治理的 Bean,这是不言而喻的,很容易了解。
工厂类能够指定多个工厂办法,实例化多个 Bean。
因而,这种状况下,Bean 的实在类型就不能通过配置文件决定了,因为配置文件可能并没有指定 class、即便指定了 class,通过动态工厂办法创立的 Bean 的类型也是不确定的,是由工厂办法的返回值决定的,配置文件里不反馈。也能够通过 BeanFactory.getType 在运行时获取到 Bean 的理论类型。
其实 Spring 的 Bean 实例化并不是这么简略,如果 Spring 发现以后类有 AOP 需要的话(比方办法加了 @Transactional 注解),那么 Spring 就须要通过 CGLIB 创立代理对象了,因为只有代理对象能力实现 AOP,这部分内容咱们临时放一放。
上一篇 Spring FrameWork 从入门到 NB – 依赖注入 DI