Spring Bean 管理
Spring 的工厂类 课程安排 Spring 的 Bean 管理 (XML 方式 ) Spring 的属性注入 (XML 方式 ) Spring 的 Bean 管理 ( 注解方式 ) Spring 的属性注入 ( 注解方式 )
Spring 的工厂类
Spring 的 Bean 管理 (XML 方式 )
三种实例化 Bean 的方式 使用类构造器实例化 ( 默认无参数 ) 使用静态工厂方法实例化 ( 简单工厂模式 ) 使用实例工厂方法实例化 ( 工厂方法模式 )
Bean 的配置 id 和 name 一般情况下, 装配一个 Bean 时, 通过指定一个 id 属性作为 Bean 的名称 id 属性在 IOC 容器中必须是唯一的 如果 Bean 的名称中含有特殊字符, 就需要使用 name 属性 class class 用于设置一个类的完全路径名称, 主要作用是 IOC 容器生成类的实例
Bean 的作用域 类别 singleton prototype request session 说明在 SpringIOC 容器中仅存在一个 Bean 实例,Bean 以单实例的方式存在每次调用 getbean() 时都会返回一个新的实例每次 HTTP 请求都会创建一个新的 Bean, 该作用域仅适用于 WebApplicationContext 环境同一个 HTTP Session 共享一个 Bean, 不同的 HTTP Session 使用不同的 Bean 该作用域仅适用于 WebApplicationContext 环境
Spring 容器中 Bean 的生命周期 Spring 初始化 bean 或销毁 bean 时, 有时需要作一些处理工作, 因此 spring 可以在创 建和拆卸 bean 的时候调用 bean 的两个生命周期方法 <bean id= xxx class=...yoo init-method= init destory-method= destroy /> 当 bean 被载入到容器的时候调用 init 当 bean 从容器中删除的时候调用 destroy(scope= singleton 有效 ) web 容器中会自动调用, 但是 main 函数或测试用例需要手动调用
Spring 容器中 Bean 的生命周期
Spring 容器中 Bean 的生命周期 1. instantiate bean 对象实例化 2. populate properties 封装属性 3. 如果 Bean 实现 BeanNameAware 执行 setbeanname 4. 如果 Bean 实现 BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setbeanfactory 或者上下文对象 setapplicationcontext 5. 如果存在类实现 BeanPostProcessor( 后处理 Bean), 执行 postprocessbeforeinitialization
Spring 容器中 Bean 的生命周期 6. 如果 Bean 实现 InitializingBean 执行 afterpropertiesset 7. 调用 <bean init-method="init"> 指定初始化方法 init 如果存在类实现 BeanPostProcessor( 处理 Bean), 执行 postprocessafterinitialization 8. 如果存在类实现 BeanPostProcessor( 处理 Bean), 执行 postprocessafterinitialization 9. 执行业务处理 10. 如果 Bean 实现 DisposableBean 执行 destroy 11. 调用 <bean destroy-method="customerdestroy"> 指定销毁方法 customerdestroy
Spring 的属性注入 对于类成员变量, 注入方式有三种 构造函数注入 属性 setter 方法注入 接口注入 Spring 支持前两种
Spring 的属性注入 - 构造方法注入 通过构造方法注入 Bean 的属性值或依赖的对象, 它保证了 Bean 实例在实 例化后就可以使用 构造器注入在 <constructor-arg> 元素里声明的属性
Spring 的属性注入 - set 方法注入 使用 set 方法注入, 在 Spring 配置文件中, 通过 <property> 设置注入的 属性
Spring 的属性注入 -p 名称空间 使用 p 命名空间 为了简化 XML 文件配置,Spring 从 2.5 开始引入一个新的 p 名称空间 p:< 属性名 >="xxx" 引入常量值 p:< 属性名 >-ref="xxx" 引用其它 Bean 对象
Spring 的属性注入 -SpEL 注入 SpEL:spring expression language,spring 表达式语言, 对依赖注入进行简化 语法 :#{ 表达式 } <bean id="" value="#{ 表达式 }"> SpEL 表达式语言语法 :#{} #{ hello } : 使用字符串 #{topicid3}: 使用另一个 bean #{topicid4.content.touppercase()}: 使用指定名属性, 并使用方法 #{T(java.lang.Math).PI}: 使用静态字段或方法 -
复杂类型的属性注入 数组类型的属性注入 List 集合类型的属性注入 Set 集合类型的属性注入 Map 集合类型的属性注入 Properties 类型的属性注入
Spring 的 Bean 管理 ( 注解方式 )
使用注解定义 Bean Spring2.5 引入使用注解去定义 Bean @Component 描述 Spring 框架中 Bean 除了 @Component 外,Spring 提供了 3 个功能基本和 @Component 等效的注解 @Repository 用于对 DAO 实现类进行标注 @Service 用于对 Service 实现类进行标注 @Controller 用于对 Controller 实现类进行标注 这三个注解是为了让标注类本身的用途清晰,Spring 在后续版本会对其增强
Spring 的属性注入 - 注解方式 使用 @Autowired 进行自动注入 @Autowired 默认按照类型进行注入 如果存在两个相同 Bean 类型相同, 则按照名称注入 @Autowired 注入时可以针对成员变量或者 set 方法 通过 @Autowired 的 required 属性, 设置一定要找到匹配的 Bean 使用 @Qualifier 指定注入 Bean 的名称 使用 Qualifier 指定 Bean 名称后, 注解 Bean 必须指定相同名称
Spring 的属性注入 - 注解方式 Spring 提供对 JSR-250 中定义 @Resource 标准注解的支持 @Resource 和 @Autowired 注解功能相似
Spring 的其他注解 Spring 初始化 bean 或销毁 bean 时, 有时需要作一些处理工作, 因此 spring 可以在创建 和拆卸 bean 的时候调用 bean 的两个生命周期方法 <bean id= foo class=...foo init-method= setup destory-method= teardown /> 当 bean 被载入到容器的时候调用 setup 注解方式下 : @PostConstruct 初始化 当 bean 从容器中删除的时候调用 teardown(scope= singleton 有效 ) 注解方式如下 : @PreDestroy 销毁
Bean 的作用范围 使用注解配置的 Bean 和 <bean> 配置的一样, 默认作用范围都是 singleton @Scope 注解用于指定 Bean 的作用范围
传统 XML 配置和注解配置混合使用 XML 方式的优势 结构清晰, 易于阅读 注解方式的优势 开发便捷, 属性注入方便 XML 与注解的整合开发 1 引入 context 命名空间 2 在配置文件中添加 context:annotation-config 标签 <context:annotation-config/>