关于java:Spring-FrameWork从入门到NB-Bean

Spring Ioc容器是负责管理Bean的,所以在持续学习Spring其余内容之前,咱们须要首先理解一下Bean。

利用创立的java class,通过Spring IoC实例化创建对象并放入Spring IoC容器交给Spring IoC容器治理后,这个java对象就叫Bean。

Bean通过xml文件定义(bean标签),或者能够通过注解定义。Spring外部通过BeanDefinition治理Bean的定义信息(也叫元数据),BeanDefinition次要包含如下Bean定义的元数据:

  1. class name:全限定类名称,xml中通过class指定,注解形式的话就是该类的全限定类名。
  2. 行为属性:包含scope、lifecycle、callbacks等。
  3. 其余对象的援用:依赖对象。

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理