继承 Bean 配置

继承 Bean 配置

Spring 允许继承 bean 的配置, 被继承的 bean 称为父 bean. 继承这个父 Bean 的 Bean 称为子 Bean
子 Bean 从父 Bean 中继承配置, 包括 Bean 的属性配置
子 Bean 也可以覆盖从父 Bean 继承过来的配置
父 Bean 可以作为配置模板, 也可以作为 Bean 实例. 若只想把父 Bean 作为模板, 可以设置 <bean> 的abstract 属性为 true, 这样 Spring 将不会实例化这个 Bean
并不是 <bean> 元素里的所有属性都会被继承. 比如: autowire, abstract 等.
也可以忽略父 Bean 的 class 属性, 让子 Bean 指定自己的类, 而共享相同的属性配置. 但此时 abstract 必须设为 true

依赖 Bean 配置

Spring 允许用户通过 depends-on 属性设定 Bean 前置依赖的Bean,前置依赖的 Bean 会在本 Bean 实例化之前创建好
如果前置依赖于多个 Bean,则可以通过逗号,空格或的方式配置 Bean 的名称

Bean 的作用域

在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域.
默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域.

使用外部属性文件

在配置文件里配置 Bean 时, 有时需要在 Bean 的配置里混入系统部署的细节信息(例如: 文件路径, 数据源配置信息等). 而这些部署细节实际上需要和 Bean 配置相分离
Spring 提供了一个 PropertyPlaceholderConfigurer 的 BeanFactory 后置处理器, 这个处理器允许用户将 Bean 配置的部分内容外移到属性文件中. 可以在 Bean 配置文件里使用形式为 ${var} 的变量, PropertyPlaceholderConfigurer 从属性文件里加载属性, 并使用这些属性来替换变量.
Spring 还允许在属性文件中使用 ${propName},以实现属性之间的相互引用。

注册 PropertyPlaceholderConfigurer

Spring 2.0:

Spring 2.5 之后: 可通过 <context:property-placeholder> 元素简化:
<beans> 中添加 context Schema 定义
在配置文件中加入如下配置:

Spring表达式语言:SpEL

Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。
语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL
SpEL 为 bean 的属性进行动态赋值提供了便利
通过 SpEL 可以实现:
通过 bean 的 id 对 bean 进行引用
调用方法以及引用对象中的属性
计算表达式的值
正则表达式的匹配

SpEL:字面量

字面量的表示:
整数:<property name="count" value="#{5}"/>
小数:<property name="frequency" value="#{89.7}"/>
科学计数法:<property name="capacity" value="#{1e4}"/>
String可以使用单引号或者双引号作为字符串的定界符号:<property name=“name” value="#{‘Chuck‘}"/> 或 <property name=‘name‘ value=‘#{"Chuck"}‘/>
Boolean:<property name="enabled" value="#{false}"/>

SpEL:引用 Bean、属性和方法(1)

引用其他对象:

引用其他对象的属性

调用其他方法,还可以链式操作

SpEL支持的运算符号(1)

算数运算符:+, -, *, /, %, ^:

加号还可以用作字符串连接:

比较运算符: <, >, ==, <=, >=, lt, gt, eq, le, ge

SpEL支持的运算符号(2)

逻辑运算符号: and, or, not, |

if-else 运算符:?: (ternary), ?: (Elvis)


if-else 的变体


正则表达式:matches

SpEL:引用 Bean、属性和方法(2)

调用静态方法或静态属性:通过 T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性:

IOC 容器中 Bean 的生命周期方法

•Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务.

•Spring IOC 容器对 Bean 的生命周期进行管理的过程:

–通过构造器或工厂方法创建 Bean 实例

–为 Bean 的属性设置值和对其他 Bean 的引用

–调用 Bean 的初始化方法

–Bean 可以使用了

–当容器关闭时, 调用 Bean 的销毁方法

•在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法.

创建 Bean 后置处理器

•Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理.

•Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.

•对Bean后置处理器而言,需要实现   接口.在初始化方法被调用前后, Spring 将把每个Bean实例分别传递给上述接口的以下两个方法:

添加 Bean 后置处理器后 Bean 的生命周期

•Spring IOC 容器对 Bean 的生命周期进行管理的过程:

–通过构造器或工厂方法创建 Bean 实例

–为 Bean 的属性设置值和对其他 Bean 的引用

–将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法

–调用 Bean 的初始化方法

–将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法

–Bean 可以使用了

–当容器关闭时, 调用 Bean 的销毁方法

通过调用静态工厂方法创建 Bean

•调用静态工厂方法创建 Bean是将对象创建的过程封装到静态方法中. 当客户端需要对象时, 只需要简单地调用静态方法, 而不同关心创建对象的细节.

•要声明通过静态方法创建的 Bean, 需要在 Bean 的 class 属性里指定拥有该工厂的方法的类, 同时在 factory-method 属性里指定工厂方法的名称. 最后, 使用 <constrctor-arg> 元素为该方法传递方法参数.

通过调用实例工厂方法创建 Bean

•实例工厂方法: 将对象的创建过程封装到另外一个对象实例的方法里. 当客户端需要请求对象时, 只需要简单的调用该实例方法而不需要关心对象的创建细节.

•要声明通过实例工厂方法创建的 Bean

–在 bean 的 factory-bean 属性里指定拥有该工厂方法的 Bean

–在 factory-method 属性里指定该工厂方法的名称

–使用 construtor-arg 元素为工厂方法传递方法参数

实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean

•Spring 中有两种类型的 Bean, 一种是普通Bean, 另一种是工厂Bean, 即FactoryBean.

•工厂 Bean 跟普通Bean不同, 其返回的对象不是指定类的一个实例, 其返回的是该工厂 Bean 的 getObject 方法所返回的对象

时间: 2024-10-14 04:50:54

继承 Bean 配置的相关文章

Spring Bean配置

Spring 是什么 •Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. •Spring 是一个 IOC(DI) 和 AOP 容器框架. –轻量级:Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API –依赖注入(DI --- dependency injection.IOC) –面向切面编程(AOP --- aspect oriented programm

Spring中的Bean配置

一.内容提要 IOC & DI 概述 配置bean: 配置形式:基于XML文件的方式;基于注解的方式 Bean的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & 实例工厂方法).FactoryBean IOC 容器 BeanFactory & ApplicationContext 概述 依赖注入的方式:属性注入;构造器注入 注入属性值细节 自动转换 bean 之间的关系:继承;依赖 bean 的作用域:singleton;prototype;WEB 环境作用域 使用外部

Spring的bean配置

IOC其实是从我们平常new一个对象的对立面来说的,我们平常使用的对象一般直接使用关键字类new一个对象,患处很显然,使用new那么就表示当前模块已经不知不觉和new出的对象耦合了,而我们通常都是更高层次的抽象模块调用底层实现模块,这样就产生模块依赖于具体的实现,这与我们JAVA中提倡的面向接口面向抽象编程是相冲突的,而且这样做也带来系统的模块架构问题.很简单的例子,在进行数据库操作的时候,总是业务层调用DAO层,DAO一般采用接口开发,这在一定程度上满足了松耦合,使业务逻辑层不依赖于具体的DA

Spring 中的 Bean 配置

内容提要 •IOC & DI 概述 •配置 bean –配置形式:基于 XML 文件的方式:基于注解的方式 –Bean 的配置方式:通过全类名(反射).通过工厂方法(静态工厂方法 & 实例工厂方法).FactoryBean –IOC 容器 BeanFactory & ApplicationContext 概述 –依赖注入的方式:属性注入:构造器注入 –注入属性值细节 –自动转配 –bean 之间的关系:继承:依赖 –bean 的作用域:singleton:prototype:WEB

Spring讲解二:Spring中的Bean配置1---基于XML文件的方式

一.在Spring的IOC容器中配置Bean 在xml文件中通过bean节点配置bean id:Bean的名称: (1) 在IOC容器中必须是唯一的 (2) 若id没有指定,Spring自动将权限限定性类名作为bean的名字 (3) id可以指定多个名字,名字之间可以用逗号.分号.或空格分隔 二.Spring容器 在Spring IOC容器读取Bean配置创建Bean实例之前,必须对它进行初始化.只有在容器实例化后,才可以从IOC容器中获取Bean实例并使用. Spring提供了两种类型的IOC

基于注解的bean配置

基于注解的bean配置,主要是进行applicationContext.xml配置.DAO层类注解.Service层类注解. 1.在applicationContext.xml文件中配置信息如下 <!--定义服务层代码存放的包扫描路径--> <context:component-scan base-package="org.mainstudio.com.service,org.mainstudio.com.dao" /> 其中base-package包括了要进行

spring Bean 配置中scope 和 lazy-init

Spring Bean配置默认为单实例 Bean默认的是单例的. 如果不想单例需要如下配置:<bean id="user" class="..." singleton="false"/> singleton就是配置这个bean是否是单例的,如果不写,就是默认值true. spring Bean 配置中 scope的作用 1.Bean的作用域可以通过Bean标签的scope属性进行设置,Bean的作用域包括:默认情况下scope=&qu

[原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

ssh项目实战经验总结-在bean配置中加载外部的properties配置项

spring配置文件中有些需要改动的配置,为了方便维护和管理,我们把这一部分配置单独的写到properties中. db.properties文件 jdbcUrl=jdbc:mysql:///govSys driverClass=com.mysql.jdbc.Driver user=root password=33269456.cx initialPoolSize=10 maxPoolSize=30 spring配置文件 <?xml version="1.0" encoding=