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
发表回复