Spring Bean

什么是Spring beans?

Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中<bean/> 的形式定义。

虎丘bean的方式

方法一:在初始化时保存ApplicationContext对象
方法二:通过Spring提供的utils类获取ApplicationContext对象
方法三:继承自抽象类ApplicationObjectSupport
方法四:继承自抽象类WebApplicationObjectSupport
方法五:实现接口ApplicationContextAware
方法六:通过Spring提供的ContextLoader

bean装配

通过依赖注入把bean组装到一起
自动装配:Spring 容器能够自动装配相互合作的bean,这意味着容器不需要<constructor-arg>和<property>配置,能通过Bean工厂自动处理bean之间的协作。
装配方式:
1.no:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。
2.byName:通过参数名自动装配
3.byType:通过参数类型自动装配
4.constructor:这个方式类似于byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
5.autodetect: 优先使用constructor ,失败则byType

Spring注解

@Autowire

其实是使用了byType的Bean装配方式
如何使用:
xml里配置
方式1.
<bean
class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

方式2.
<context:annotation-config />

ps:当出现一个接口由多个实现的时候,可以使用 @Quanlifier 来指定要装配的bean

spring bean的作用域

1.singleton : 单例作用域 不是线程安全的
2.prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例
3.request:每次请求有一个实例
4.session:在一个HTTP session中,一个bean定义一个实例,该作用域仅在基于web的Spring ApplicationContext情形下有效。
5.global-session:在全局HTTP session中 ,一个bean一个实例,该作用域仅在基于web的Spring ApplicationContext情形下有效。

bean 加载方式

1.applicationcontext上下文,这种加载会一开始就加载进去
2.beanFactory,会在需要的时候 getBean的时候加载

bean 生命周期

image.png

1.实例化一个bean
2.按照上下文的属性,对bean进行ioc注入
3.1如果bean实现BeanNameAware的接口,就会对该接口里面的setBeanName进行设置,此处传递的是Spring配置文件中Bean的ID
3.2如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)
3.3果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文,该方式同样可以实现步骤3.2,但比3.2更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法(通过beanFactory的时候没有这一步)
4.是否关联实现了BeanPostProcessor接口,调用前置处理方法
5.如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法
6.是否关联实现了BeanPostProcessor接口,调用后置处理方法
7.注册必要的Destruction的回调接口
——————————————————
好啦,现在我们可以用这个bean啦
——————————————————
8.用完了这个bean,就不需要了,如果实现DispoableBean接口,那么会调用其实现的destroy方法
9.最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法

不建议使用(建议使用init-method 和 destroy-method ):

InitializingBean和DisposableBean是两个标记接口,为Spring执行时bean的初始化和销毁某些行为时的有用方法。
对于Bean实现 InitializingBean,它将运行 afterPropertiesSet()在所有的 bean 属性被设置之后。
对于 Bean 实现了DisposableBean,它将运行 destroy()在 Spring 容器释放该 bean 之后。
实例:

public class CustomerService implements InitializingBean, DisposableBean
{
    String message;
    
    public String getMessage() {
      return message;
    }

    public void setMessage(String message) {
      this.message = message;
    }
    
    public void afterPropertiesSet() throws Exception {
      System.out.println("Init method after properties are set : " + message);
    }
    
    public void destroy() throws Exception {
      System.out.println("Spring Container is destroy! Customer clean up");
    }

init-method 和 destroy-method:

public class CustomerService
{
    String message;
    
    public String getMessage() {
      return message;
    }

    public void setMessage(String message) {
      this.message = message;
    }
    
    public void initIt() throws Exception {
      System.out.println("Init method after properties are set : " + message);
    }
    
    public void cleanUp() throws Exception {
      System.out.println("Spring Container is destroy! Customer clean up");
    }
    
}

xml设置

<bean id="customerService" class="com.yiibai.customer.services.CustomerService" 
        init-method="initIt" destroy-method="cleanUp">  
        <property name="message" value="i'm property message" />
    </bean>

bean扩展点

在实例化之前可以使用BeanFactoryPostProcessor:可以修改bean的元信息,属性
就是上面的4和6 在初始化之前之后使用BeanPostProcessor:不可以修改。

@Component – 指示自动扫描组件。
@Repository – 表示在持久层DAO组件。
@Service – 表示在业务层服务组件。
@Controller – 表示在表示层控制器组件。
注解的实现都是@Component 不同的命名只是为了区分层

Spring循环依赖

解决方式: 三级缓存
一级缓存singletonObjects
二级缓存earlySingletonObjects
三级缓存singletonFactories
当发生循环依赖的时候。
createBeanInstance之后会调用

protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
    Assert.notNull(singletonFactory, "Singleton factory must not be null");
    synchronized (this.singletonObjects) {
        if (!this.singletonObjects.containsKey(beanName)) {
            this.singletonFactories.put(beanName, singletonFactory);
            this.earlySingletonObjects.remove(beanName);
            this.registeredSingletons.add(beanName);
        }
    }
}

这里会往3级缓存先提前暴露出这个bean。
然后A在createBeanInstance之后,因为依赖了B,会去找B,发现没存在B,就create。createB的时候依赖了A,去找A。然后在3级缓存里找到了,就自己创建后面的流程了。
但是如果是在构造方法里互相依赖就不行,因为加入singletonFactories三级缓存的前提是执行了构造器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,087评论 18 139
  • 1.1 spring IoC容器和beans的简介 Spring 框架的最核心基础的功能是IoC(控制反转)容器,...
    simoscode阅读 6,632评论 2 22
  • 1.1 Spring IoC容器和bean简介 本章介绍了Spring Framework实现的控制反转(IoC)...
    起名真是难阅读 2,534评论 0 8
  • Bean的定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的。bean 是...
    jiangmo阅读 1,153评论 0 3
  • 相信大多处在Android进阶阶段的朋友都了解过Android框架方面的知识,要开发一款优秀的app,自然少不了优...
    卫青臣阅读 1,096评论 1 13