02 Bean的相关概念

来源:互联网 发布:淘宝抢购秒杀器哪个好 编辑:程序博客网 时间:2024/06/05 14:45

是什么

满足以下条件的Java类就可以看做一个Bean:
所有属性为private
提供默认构造方法
提供getter和setter
实现serializable接口


Bean的生命周期

图示
Bean的生命周期
Bean的完整生命周期经历了各种方法调用
1. Bean自身的方法:这个包括了Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法 。
2. Bean级生命周期接口方法:这个包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法 。
3. 容器级生命周期接口方法:这个包括了InstantiationAwareBeanPostProcessor和BeanPostProcessor这两个接口实现,一般称它们的实现类为“后处理器”。
4. 工厂后处理器接口方法:这个包括了AspectJWeavingEnabler、ConfigurationClassPostProcessor、CustomAutowireConfigurer等等非常有用的工厂后处理器接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。
说明
1. 当调用者向容器请求某一个Bean时,如果容器注册了InstantiationAwareBeanPostProcessor接口,在实例化Bean之前,将调用接口的postProcessBeforeInstantiation()方法。
2. 根据配置情况调用Bean构造函数或工厂方法实例化Bean。
3. 如果容器注册了InstantiationAwareBeanPostProcessor接口,在实例化Bean之后,调用该接口的postProcessAfterInstantiation()方法,可在这里对已经实例化的对象进行一些“梳妆打扮”。
4. 如果Bean配置了属性信息,容器在这一步着手将配置值设置到Bean对应的属性中,不过在设置每个属性之前将先调用InstantiationAwareBeanPostProcessor接口的postProcessPropertyValues()方法。
5. 调用Bean的属性设置方法设置属性值。
6. 如果Bean实现了BeanNameAware接口,将调用setBeanName()接口方法,将配置文件中该Bean对应的名称设置到Bean中。
7. 如果Bean实现了BeanFactoryAware接口,将调用setBeanFactory()接口方法,将BeanFactory容器实例设置到Bean中。
8. 如果BeanFactory装配了BeanPostProcessor后处理器,将调用BeanPostProcessor的postProcessBeforeInitialization(Object bean, String beanName)接口方法对Bean进行加工操作。其中入参bean是当前正在处理的Bean,而beanName是当前Bean的配置名,返回的对象为加工处理后的Bean。用户可以使用该方法对某些Bean进行特殊的处理,甚至改变Bean的行为,BeanPostProcessor在Spring框架中占有重要的地位,为容器提供对Bean进行后续加工处理的切入点,Spring容器所提供的各种“神奇功能”(如AOP,动态代理等)都通过BeanPostProcessor实施。
9. 如果Bean实现了InitializingBean的接口,将调用接口的afterPropertiesSet()方法。
10. 如果在<bean>通过init-method属性定义了初始化方法,将执行这个方法。
11. 调用BeanPostProcessor后处理器的postProcessAfterInitialization(Object bean, String beanName)方法,容器再次获得对Bean进行加工处理的机会。
12. 如果在<bean>中指定Bean的作用范围为scope=”prototype”,将Bean返回给调用者,调用者负责Bean后续生命的管理,Spring不再管理这个Bean的生命周期。如果作用范围设置为scope=”singleton”,则将Bean放入到SpringIOC容器的缓存池中,并将Bean引用返回给调用者,Spring继续对这些Bean进行后续的生命管理。
13. 对于scope=”singleton”的Bean,当容器关闭时,将触发Spring对Bean的后续生命周期的管理工作,首先如果Bean实现了DisposableBean接口,则将调用接口的afterPropertiesSet()方法,可以在此编写释放资源、记录日志等操作。
14. 对于scope=”singleton”的Bean,如果通过<bean>的destroy-method属性指定了Bean的销毁方法,Spring将执行Bean的这个方法,完成Bean资源的释放等操作。


Bean的作用域

当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。
Spring支持5种作用域:
Singleton:单例模式。在整个SpringIoC容器中,使用singleton定义的Bean将只有一个实例。
Prototype:原型模式。每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。
request:对于每次HTTP请求,使用request定义的Bean都将产生一个新的实例,即每次HTTP请求都会产生不同的Bean实例。当然只有在Web应用中使用Spring时,该作用域才真正有效。
session:对于每次HTTPSession,使用session定义的Bean都将产生一个新的实例时,即每次Session都将产生不同的Bean实例。同HTTP一样,只有在Web应用才会有效。
global session:每个全局的HTTPSession对应一个Bean实例。仅在portlet Context的时候才有效。


传统Java中Bean和Spring中Bean的区别

用处不同
传统JavaBean更多地作为值传递参数,而Spring中的Bean用处几乎无处不在,任何组件都可以被称为Bean。
写法不同
传统JavaBean作为值对象,要求每个属性都提供getter和setter方法,但Spring中的Bean只需为接受设值注入的属性提供setter方法。
生命周期不同
传统JavaBean作为值对象传递,不接受任何容器管理其生命周期,Spring中的Bean有Spring管理其生命周期行为。


名词区分

JavaBean
提供公有默认构造器。
属性私有并提供公有的get和set方法访问。
序列化,这是框架和工具跨平台所必需的。
EJB(Enterprise Java Bean)
在JavaBean的基础上提出了新的要求。
POJO(Plain Old Java Object)
POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。
POJO是一个简单的普通的Java对象,它不包含业务逻辑或持久逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不继承或不实现任何其它Java框架的类或接口。
简而言之,当一个POJO可序列化,有一个无参的构造函数,使用getter和setter方法来访问属性时,他就是一个JavaBean。
BO(Business Object)
POJO在业务层的体现,对于业务操作来说,更多的是从业务上来包装对象,每一张表对应一个PO,而我们的BO需要这些PO组合起来才能成为业务上的一个完整对象。
PO(Persistence Object)
用于持久化,例如保存到数据库或者缓存。
VO(Value Object)
用于前端展示使用,例如放置到JSP中解析或者给前端传递数据。
DTO(Data Transfer Object)
用于接口互相调用返回和数据传输,例如很多接口调用返回值或消息队列内容。
DAO(Data Access Objects)
DAO是数据访问对象,DAO一般有接口和该接口的实现类,接口用于规范实现类。实现类一般用于操作数据库,如对数据库进行修改、添加、删除等操作,一般直接调用公共类DAO。


参考资料

POJO和javabean的异同
JAVABEAN EJB POJO区别
Difference between DTO, VO, POJO, JavaBeans?

0 0