Spring -- Bean 01

Spring Bean

1.Bean生命周期

一个Bean从创建到销毁,如果是用BeanFactory来生成,管理Bean的话,会经历几个执行阶段(如图1.1):

 image.png

1.1 详细步骤:

  在说明前可以思考一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;

    Spring上下文中的Bean也类似,如下

    1、实例化一个Bean--也就是我们常说的new;

    2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;

    3、如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值

    4、如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);

    5、如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);

    6、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;

    7、如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。

    8、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;

    注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。

    9、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;

    10、最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

 


 

1.2 简单来说分了五个步骤:

  1. 通过构造方法或工厂方法创建bean实例

  1. 为bean属性设置值和对其他bean的引用
  2. 调用bean的初始化方法 (init -method),可以用PostConstruct初始化方法的注解方式
  3. bean可以使用了
  4. 当容器关闭时,调用bean的销毁方法 ( destory-method),等同于@PreDestroy 

 

注意:

在xml文件中配置bean的时候就可以指定init-method 和的story-method

1.3 细化

当加入了bean的前置和后置处理器之后,就会在init方法前后分别调用

方式:实现BeanPostProcessor接口

前置:提供postProcessBeforeInitialization(Object bean ,String beanName)方法实现  init-method 之前调用

后置:提供postProcessAfterInitialization(Object bean ,String beanName)方法实现  init-method之后调用

返回值是实际上返回给用户的那个bean,

可以两个方法中返回的bean,甚至返回一个新的bean

xml文件配置后置处理器:

不需要配置id,只要实现了BeanPostProcessor接口,IOC会自动识别它是后置处理器

<bean class="后置处理器的路径地址/>"

注意:后置处理器是处理所有 bean的,如果要特殊处理某个bean

1.4 细化之后

现在的生命周期:

  1. 通过构造方法或工厂方法创建bean实例

  1. 为bean属性设置值和对其他bean的引用
    1. 将bean实例传递给bean后置处理器的postProcessBeforeInitialization方法
  1. 调用bean的初始化方法 (init -method)
    1. 将bean实例传递给bean后置处理器的postProcessAfterInitialization方法
  1. bean可以使用了
  2. 当容器关闭时,调用bean的销毁方法 ( destory-method)

 

 

参考博客:

JAVA面试题:Spring中bean的生命周期

实践出真知:理解Spring Bean生命周期

 


 

2.实例化Bean的方式

 

image.png

image.png

image.png

image.png

image.pngimage.png

image.png

 

image.png

 

示例参考

2.1  通过工厂来注入bean

2.1.1 通过调用某一个类的类的静态方法来返回bean实例

 

image.png

 

2.2.2 非静态方法来配置bean

先写一个实例工厂的类

image.png

 

2.2.3 通过spring提供的FactoryBean来注入bean

 

  image.png

 

 

 

3. 注入Bean的方式

 

image.png

用bean标签将java的bean交由spring IOC 管理

3.1 通过构造方法注入bean

image.png

index表示参数的顺序,name表示参数名称,type类型,ref 引用, value 字面量;

简便写法:

image.png

3.2 通过set方法注入bean

image.png

 

3.3 集和类型Bean注入

image.png

 

image.png

3.4 注入null值

image.png

 

3.5 注入内部bean 

image.png

 

 

 


 

4. Bean的作用域

 

image.png

 

4.1 singleton作用域

同一个上下文每次获取到的bean实例是同一个

4.2 prototype作用域

每次返回的bean的实例是新创建的

image.png

 

如何让singleton的bean1,prototype的bean2 返回多个bean2实例呢

在class bean1里去掉原来的setter方式参数私有属性域注入bean2 

改为以方法的形式获取bean2

变成一个抽象方法,

 

image.png

 

image.png

 

 4.3 Web环境作用域

 

image.png

 

4.4 自定义作用域-simpleThread   

每一个线程有一个单独的实例

评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值