|
【郑州校区】Bean获取与实例化
Bean获取与实例化
ApplicationContext与BeanFactory关系ApplicationContext它是扩展BeanFactory接口。 BeanFactory它采取延迟加载的方案,只有真正在getBean时才会实例化Bean 在开发中我们一般使用的是ApplicationContext,真正使用的是其实现类, FileSystemXmlAppliCationContext 根据文件路径获取 ClassPathXmlApplicationContext 根据类路径获取 AppliCationContext它会在配置文件加载时,就会初始化Bean,并且ApplicationContext它提供不同的应用层的Context实现。例如在web开发中可以使用WebApplicationContext. Bean的实例化方式无参数构造对于这种方式,注意Bean类中必须提供无参数构造。 静态工厂方法需要创建一个工厂类,在工厂类中提供一个static返回bean对象的方法就可以。 实例工厂方法需要创建一个工厂类,在工厂类中提供一个非static的创建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的生命周期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的生命周期,我们需要关注的主要有两个方法: 1. 增强bean的功能可以使用后处理Bean, BeanPostProcessor 2. 如果需要初始化或销毁操作我们可以使用init-method destroy-method 注意:destroy-method只对scope=singleton有效果。 Bean的属性注入在spring中bean的属性注入有两种 构造器注入Setter方法注入关于ref属性作用 使用ref来引入另一个bean对象,完成bean之间注入 集合属性的注入在spring中对于集合属性,可以使用专门的标签来完成注入例如:list set map properties等集合元素来完成集合属性注入. List属性注入如果属性是数组类型也可以使用list完成注入 Set属性注入 Map属性注入 Properties属性注入Java.util.Properties是java.utilsMap的实现类,它的key与value都是String类型. 名称空间p和c的使用Spring2.0以后提供了xml命名空间。 P名称空间 C名称空间 首先它们不是真正的名称空间,是虚拟的。它是嵌入到spring内核中的。 使用p名称空间可以解决我们setter注入时<property>简化 使用c名称空间可以解决我们构造器注入时<constructor-arg>简化 使用setter注入 在applicationContext.xml文件中添加p名称空间简化setter注入 使用c名称空间来解决构造器注入 在applicationContext.xml文件中添加c名称空间 注:如果c或p名称空间操作的属性后缀是”-ref”代表要引入另一个已经存在的bean,例如 SpElspring expression language 是在spring3.0以后的版本提供 它类似于ognl或el表达式,它可以提供在程序运行时构造复杂表达式来完成对象属性存储及方法调用等。 Spel表达式的格式 #{表达式} 示例1:完成bean之间的注入 示例2 支持属性调用及方法调用 传智播客·黑马程序员郑州校区地址 河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层 联系电话 0371-56061160/61/62 来校路线 地铁一号线梧桐街站A口出
|