Spring之Bean

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring之Bean相关的知识,希望对你有一定的参考价值。

参考技术A spring 容器就是一个工厂,而bean 是工厂里的每一个产品,而这个工厂生产什么样的产品,是依赖于配置文件的声明。
一、
注册的方式有两种:
1、xml配置文件

2、java based 配置

二、Bean的命名规则
默认,spring是以@Bean声明的方法名作为bean的名称,spring容器集中管理Bean的实例化,Bean实例可以通过BeanFactory的getBean(string beanName) 方法得到。

从上图可以看出,
name:用于为bean指定别名,如果需要为Bean实例指定多个别名,可以在name 属性中使用逗号,冒号和空格来分隔多个别名
autowire:是否按名称或是类型来注入依赖的对象
initMethod: 在初始化完后,调用的方法
destroyMethod: bean在销毁时调用的方法
三、Bean的作用域
通过@Scope来声明

1、singleton:单例模式
2、Prototype:原型模式
3、request:对于 每次http 请求,bean都会产生一个新的实例,只有在web 应用中才会生效
4、session 对于 每次HttpSession时会产生一个新的实例,只有在web 应用中才会生效
5、global session ,只有在portlet context中有效
比较常用到的是singleton和prototype,java在创建实例,要进行内存申请,销毁实例时,要垃圾回收,这些都会导致系统开销的增加,因此prototype作用域的bean在创建、销毁代价会比较大,而singleton的bean实例,一旦创建,就可以重复使用
四、Bean的生命周期
1、@Bean注解的内容:通过配置initMethod和destroyMethod方法
2、bean的接口:BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口,@PostConstruct,@PreDestroy
测试如下

bean的声明:

日志输出:

我们来看下Bean的初始化是怎么进行的

1、是调用 实现了相应Aware接口的方法

2、调用Bean实例的后置处理器BeanPostProcessor

这里有两个方法 ,Before和After....,分别在initMethod方法前后被调用

3、调用Bean实例的InitializingBean接口和@Bean的initMethod,InitializingBean接口是优于initMethod的

4、实例销毁

spring bean注册之bean工厂方式

一般我们在spring中注册一个bean,直接

<bean id="websocket" class="com.sdyy.common.spring.websocket.WebsocketEndPoint"/>

这样会用WebsocketEndPoint的构造方法(这种是无参),为我们创建一个对象bean。

 

————————————————————————————分界线—————————————————————————————————————————————

 

但是还有一种方式,用bean工厂注册bean的,有三种写法,我们先看第一种:

 

第一种写法以及实例解析:

拿著名的Ehcahce,在spring里注册的方式来说,它在spring里是这样写的:

<bean id="realCache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:cache/ehcache.xml" />
    </bean>

但是最后你会发现最后生成的名为realCache的bean是一个net.sf.ehcache.CacheManager类的对象,而非org.springframework.cache.ehcache.EhCacheManagerFactoryBean

这是因为EhCacheManagerFactoryBean实现了spring的FactoryBean接口

 FactoryBean有三个方法要求实现

其中getObject方法返回的结果才会作为真正的注册结果bean返回给spring我们来看一下

org.springframework.cache.ehcache.EhCacheManagerFactoryBean 的 getObject方法返回了什么:

是的,就是net.sf.ehcache.CacheManager。

 

ps:如果想要获取EhCacheManagerFactoryBean本身:

1、可以根据类型注入即直接使用@Autowired,

2、或者使用ApplicationContext的getBean(EhCacheManagerFactoryBean.class);

3、或者使用ApplicationContext的getBean("&realCache",EhCacheManagerFactoryBean.class);  这里的id就是xml里面写的id,特别注意前边的“&”

 

第二、三种写法:

通过工厂bean还可以写:

 写法一:
<
bean id="factoryBean" class="com.demo.BaseBeanFactory"></bean> <bean id="bean" factory-bean="factoryBean" factory-method="createBaseDao"></bean>

写法二:
<bean id="bean" class="com.demo.BaseBeanFactory" factory-method="createBaseDao"></bean>
 
factory-method指的就是哪个方法来创建bean,这里就不要求继承FactoryBean了



完毕!

以上是关于Spring之Bean的主要内容,如果未能解决你的问题,请参考以下文章

IOC装配Bean(注解方式)

Spring

Spring注解

Spring注解

管理Bean

Spring 中常用的注解