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的主要内容,如果未能解决你的问题,请参考以下文章