Bean获取与实例化

Bean获取与实例化
ApplicationContext与BeanFactory关系
Bean获取与实例化
ApplicationContext它是扩展BeanFactory接口。
BeanFactory它采取延迟加载的方案,只有真正在getBean时才会实例化Bean
在开发中我们一般使用的是ApplicationContext,真正使用的是其实现类,
FileSystemXmlAppliCationContext 根据文件路径获取
ClassPathXmlApplicationContext 根据类路径获取
AppliCationContext它会在配置文件加载时,就会初始化Bean,并且ApplicationContext它提供不同的应用层的Context实现。例如在web开发中可以使用WebApplicationContext.
Bean的实例化方式无参数构造
对于这种方式,注意Bean类中必须提供无参数构造。
Bean获取与实例化
静态工厂方法
需要创建一个工厂类,在工厂类中提供一个static返回bean对象的方法就可以。
Bean获取与实例化
Bean获取与实例化
实例工厂方法
需要创建一个工厂类,在工厂类中提供一个非static的创建bean对象的方法,在配置文件中需要将工厂配置,还需要配置bean
Bean获取与实例化
Bean获取与实例化
Bean的作用域
Bean获取与实例化
在bean声明时它有一个scope属性,它是用于描述bean的作用域。
可取值有:
singleton:单例 代表在spring ioc容器中只有一个Bean实例 (默认的scope)
prototype多例 每一次从spring容器中获取时,都会返回一个新的实例
request 用在web开发中,将bean对象request.setAttribute()存储到request域中
session 用在web开发中,将bean对象session.setAttribute()存储到session域中
在开如常用的值是singleton与prototype
Bean的生命周期
Bean获取与实例化

  1. instantiate bean对象实例化
  2. populate properties 封装属性
  3. 如果Bean实现BeanNameAware执行setBeanName
  4. 如果Bean实现BeanFactoryAwar或ApplicationContextAwar设置工厂setBeanFactory或上下文对象setApplicationContext
  5. 如果存在类实现BeanPostProcessor(后处理Bean),执行postProcessBeforeInitialization
  6. 如果Bean实现InitializingBean执行afterPropertiesSet
  7. 调用自定义的init-method方法
  8. 如果存在类实现BeanPostProcessor(处理Bean),执行postProcessAfterInitialization
  9. 执行业务处理
  10. 如果Bean实现DisposableBean执行destroy
  11. 调用自定义的destroy-method
    对于bean的生命周期方法:
    第三步与第四步是让Bean了解spring容器。
    第五步与第八步 可以针对指定的Bean进行功能增强,这时一般会使用动态代理.
    第六步与第十步:通过实现指定的接口来完成init与destroy操作
    但是在开发中一般不使用第6步与第10步,原因是我们可以使用第7步与第11步来完成。
    第7步与第11步的初始化与销毁操作它无耦合,推荐使用的。但是必须在配置文件中指定初始化与销毁的方法
    Bean获取与实例化
    总结:
    对于bean的生命周期,我们需要关注的主要有两个方法:
  12. 增强bean的功能可以使用后处理Bean, BeanPostProcessor
  13. 如果需要初始化或销毁操作我们可以使用init-method destroy-method
    注意:destroy-method只对scope=singleton有效果。
    Bean的属性注入
    在spring中bean的属性注入有两种
    构造器注入
    Bean获取与实例化
    Setter方法注入
    Bean获取与实例化
    关于ref属性作用
    Bean获取与实例化
    使用ref来引入另一个bean对象,完成bean之间注入
    集合属性的注入
    在spring中对于集合属性,可以使用专门的标签来完成注入例如:list set map properties等集合元素来完成集合属性注入.
    Bean获取与实例化
    List属性注入
    Bean获取与实例化
    如果属性是数组类型也可以使用list完成注入
    Set属性注入
    Bean获取与实例化
    Map属性注入
    Bean获取与实例化
    Properties属性注入
    Java.util.Properties是java.utilsMap的实现类,它的key与value都是String类型.
    Bean获取与实例化
    名称空间p和c的使用
    Spring2.0以后提供了xml命名空间。
    Bean获取与实例化
    P名称空间
    C名称空间
    首先它们不是真正的名称空间,是虚拟的。它是嵌入到spring内核中的。
    使用p名称空间可以解决我们setter注入时<property>简化
    使用c名称空间可以解决我们构造器注入时<constructor-arg>简化
    使用setter注入
    Bean获取与实例化
    在applicationContext.xml文件中添加p名称空间简化setter注入
    Bean获取与实例化

使用c名称空间来解决构造器注入
Bean获取与实例化
在applicationContext.xml文件中添加c名称空间

Bean获取与实例化
注:如果c或p名称空间操作的属性后缀是”-ref”代表要引入另一个已经存在的bean,例如
Bean获取与实例化
SpEl
spring expression language 是在spring3.0以后的版本提供
它类似于ognl或el表达式,它可以提供在程序运行时构造复杂表达式来完成对象属性存储及方法调用等。
Spel表达式的格式 #{表达式}
示例1:完成bean之间的注入
Bean获取与实例化
示例2 支持属性调用及方法调用
Bean获取与实例化

猜你喜欢

转载自blog.51cto.com/13587708/2131239
今日推荐