`
234390216
  • 浏览: 10191497 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460707
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1771614
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395289
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393844
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678159
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529213
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178601
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:461557
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150069
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66778
社区版块
存档分类
最新评论

Spring(01)——bean定义

阅读更多

1 bean定义

1.1 命名

给bean命名不是必须的,但是如果如果有其它bean需要引用该bean,那么就需要给该bean命名。当我们没有给bean命名时,Spring将自动为该bean生成一个唯一的名称。

1.1.1 id和name属性

可以通过id和name给bean命名,如果只需要给bean指定一个名称则使用id和name都可以。id和name在整个ApplicationContext中都要求是唯一的,其中id我们只能指定一个,如果我们还需要为当前bean指定更多的名称,则可以通过name进行指定。name属性可以用来为bean指定多个名称,多个名称之间可以以逗号“,”、分号“;”或空格进行分隔。

	<bean id="hello" name="hello2,hello3 hello4;hello5" class="java.lang.String">
		<constructor-arg value="hello"/>
	</bean>

1.1.2 alias元素指定别名

alias元素可以为指定的名称指定一个别名。假设在我们的ApplicationContext中拥有一个名为name1的bean,同时通过alias元素指定了name1的别名为alias1,这样在其它需要引用名为name1的bean的地方都可以使用alias1来代替,当然继续使用name1也是可以的。这种机制是非常有效的。考虑这样一种场景,假设我们的应用有两个module,其中module1需要关联名为module1-dataSource,module2需要关联名为module2-dataSource。但实际上它们使用的都是同一个数据源,当然我们可在定义该DataSource时同时指定其名称为module1-dataSource和module2-dataSource。另一种方式是我们可以为该DataSource指定两个别名,分别为module1-dataSource和module2-dataSource。
以下是一个使用alias元素定义别名的示例,其分别指定hello的别名为helloAlias1和helloAlias2。

	<alias name="hello" alias="helloAlias1"/>
	<alias name="hello" alias="helloAlias2"/>
	
	<bean name="hello" class="java.lang.String">
		<constructor-arg value="hello"/>
	</bean>

1.2 class属性指定类型

在定义bean时可以通过class属性来指定当前bean对应的类型。class属性要求是对应Class类的全限定名,即需要包含包名的。如果我们需要定义的bean类型属于某个类的静态内部类,那么对应的class值应该是该内部类的二进制名称,即中间以$符号连接。下面来看一个示例,假设我们有如下这样一个类,先需要分别定义Hello对应的bean和World对应的bean,其中Hello所在的包名为com.app

public class Hello {

	public static class World {
		
	}
	
}

那么,对应bean定义应该是这样子的:

	<bean id="hello" class="com.app.Hello"/>

	<bean id="world" class="com.app.Hello$World"/>

1.3 depends-on

depends-on是定义在bean元素上的一个属性,用于指定其所依赖的bean,这样Spring将在初始化当前bean前先初始化其depends-on属性所指定的bean。所以depends-on的功能就是指定一个bean所依赖的bean,通过它来告诉Spring将优先初始化depends-on属性指定的bean。注意,该属性只有告诉Spring该优先初始化哪个bean的功能,Spring不会因为这个属性的定义而注入对应的bean。在不使用depends-on属性的情况下,Spring初始化bean的顺序是固定的,通常是根据bean定义的先后顺序来进行初始化。在下面的示例中,Spring将先初始化world,再初始化hello,但是其不会将world注入给hello。

	<bean name="world" class="com.app.World"/>
	<!-- 通过depends-on属性告诉Spring先初始化depends-on属性指定的bean,即这里的world -->
	<bean id="hello" class="com.app.Hello" depends-on="world"/>

如果我们需要指定多个bean先于某个bean被初始化,我们也可以通过depends-on属性来指定,只是此时多个bean之间需要以逗号、分号或空格进行分隔。如下示例中就表示bean1依赖于bean2、bean3和bean4,即bean2、bean3和bean4需先于bean1被初始化。

	<!-- 当依赖于多个bean时,多个bean之间以逗号、分号或空格进行分隔 -->
	<bean id="bean1" class="com.app.Bean1" depends-on="bean2,bean3,bean4"/>

使用depends-on属性后,depends-on属性指定的bean将先于该bean被初始化,但对于销毁而言,其是一个逆过程,即将先销毁该bean,再销毁depends-on属性指定的bean。

1.4 lazy-init

默认情况下,Spring将在初始化bean容器的时候初始化所有的单例bean。如果我们有一个bean是单例的,但是又不想其在bean容器初始化的时候被初始化,那么我们可以在该bean上定义lazy-init属性为true,这样Spring将不会在初始化bean容器的时候将其初始化。相对应的,其会在第一次被需要的时候进行初始化。所以如果我们有一个叫beanA的单例bean定义了lazy-init为true,这就表示其不会在Spring初始化bean容器的时候进行初始化,但是如果其被另一个名叫beanB的单例bean所依赖,而beanB没有指定lazy-init为true,这就意味着beanB将在Spring初始化bean容器时进行初始化,这个时候由于Spring需要给beanB注入一个beanA,也就是说beanA在这个时候被需要了,所以此时Spring也将会初始化beanA。

	<!-- 通过lazy-init="true"指定其将不在初始化bean容器时初始化 -->
	<bean id="beanA" class="com.app.BeanA" lazy-init="true"/>
	<!-- 由于beanB对beanA有依赖,所以在初始化BeanB后,如果容器中不存在beanA,Spring将初始化备案A -->
	<bean id="beanB" class="com.app.BeanB">
		<property name="beanA" ref="beanA"/>
	</bean>

lazy-init的值默认是false,也就是说对于单例bean而言,如果没有指定lazy-init=”true”时其默认会在bean容器初始化时被初始化,如果用户希望这种全局的初始化策略为不在bean容器初始化时进行初始化,则可以在beans元素上定义default-lazy-init=”true”

1.5 继承bean定义(parent)

试想一下,假设我们有一个类ParentA,其需要引用BeanA、BeanB和BeanC这三种类型的对象。然后针对于ParentA而言,我们又拥有三个子类ChildA、ChildB和ChildC。如果我们现在要定义ChildA、ChildB和ChildC三种类型的bean,依据传统的思想是不是就需要定义这三个bean,然后分别给这三个bean注入类型为BeanA、BeanB和BeanC的bean呢?Spring为我们提供了一种继承机制,它允许我们在定义一个bean时指定其对应的父bean,然后子bean将继承父bean的属性等,当然通过子bean注入的内容将覆盖父bean的内容,这里所谓的继承是对应bean定义的继承,不是真正意义上对象的继承。Spring允许我们在定义一个bean时通过parent属性来指定对应的父bean定义,其属性值对应父bean的id或name。所以针对于该应用场景,我们可以使用Spring的继承机制进行如下定义。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="beanA" class="com.app.BeanA"/>
    <bean id="beanB" class="com.app.BeanB"/>
    <bean id="beanC" class="com.app.BeanC"/>
    
	<bean id="parentA" class="com.app.ParentA">
		<property name="beanA" ref="beanA"/>
		<property name="beanB" ref="beanB"/>
		<property name="beanC" ref="beanC"/>
	</bean>
	
	<bean id="childA" class="com.app.ChildA" parent="parentA"/>
	<bean id="childB" class="com.app.ChildB" parent="parentA"/>
	<bean id="childC" class="com.app.ChildC" parent="parentA"/>
	
</beans>

这时子bean也可以注入自己额外的内容,比如对于childA而言,它可以给自己注入一个beanD,这是没有问题的。当然,它也可以选择给自己注入一个特定的BeanA,此时childA自己注入的BeanA将覆盖其父bean持有的BeanA,即childA所拥有的BeanA将是其自身注入的那一个。
对于上述配置而言,将默认初始化所有的单例bean,所以上述配置中的parentA也将被初始化,如果我们不希望其被初始化,或者parentA是一个抽象类,根本就不能被初始化,我们可以在该bean上通过abstract=”true”指定该bean是抽象的,这样Spring将不会对其进行初始化,而仅仅把它当做其它bean定义的父bean定义而已。

	<bean id="parentA" class="com.app.ParentA" abstract="true">
		<property name="beanA" ref="beanA"/>
		<property name="beanB" ref="beanB"/>
		<property name="beanC" ref="beanC"/>
	</bean>

如果我们的父bean不需要真正被初始化,只是用来作为一个父bean定义供子bean继承时,我们也可以不指定其对应的class,但需要指定abstract=”true”。这对实际应用是非常有用的,打个比方,如果我们的应用是通过XML配置来管理对应的依赖关系的,同时我们的Dao都需要注入一个JdbcTemplate,我们就无需在定义Dao对应bean时给每个bean都定义注入一个JdbcTemplate,而可以让它们都继承一个父级的bean定义,然后在父级的bean定义上去注入对应的JdbcTemplate。如:

	<bean id="parent" abstract="true">
		<property name="jdbcTemplate" ref="jdbcTemplate"/>
	</bean>
	<bean id="xxxDao" class="xxx.xxx.xxxDao" parent="parent"/>

1.6 description

通过description元素指定当前bean的描述信息,方便用户阅读。

	<bean id="hello" class="com.app.Hello">
		<description>当前bean的描述信息,便于阅读</description>
	</bean>

(注:本文是基于Spring4.1.0所写)

 

0
0
分享到:
评论

相关推荐

    Spring技术内幕学习笔记.docx

    《Spring技术内幕》学习笔记2——IoC定位Bean定义资源 《Spring技术内幕》学习笔记3——IoC容器载入Bean定义资源文件 《Spring技术内幕》学习笔记4——IoC容器解析Bean定义资源并注册解析后的Bean 《Spring技术...

    Spring注解——@Profile详解

    Spring中的Profile功能可以理解为我们在Spring容器中所定义的Bean的逻辑组名称,只有当这些Profile被激活的时候,才会将Profile中所对应的Bean注册到Spring IoC容器中。 举个更具体的例子,我们以前所定义的Bean,当...

    跟我学spring3(1-7)

    【第五章】Spring表达式语言 之 5.4在Bean定义中使用EL—跟我学spring3 【第六章】 AOP 之 6.1 AOP基础 ——跟我学spring3 【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我学spring3 【第六章】 AOP 之 6.3 基于...

    跟我学spring3(8-13)

    【第十二章】零配置 之 12.3 注解实现Bean定义 ——跟我学spring3 【第十二章】零配置 之 12.4 基于Java类定义Bean配置元数据 ——跟我学spring3 【第十二章】零配置 之 12.5 综合示例-积分商城 ——跟我学spring3 ...

    spring培训-笔记

    Bean的定义 16 Bean的之前初始化 19 Bean的准备就绪(Ready)状态 21 Bean的销毁 21 ApplicationContext 21 Spring的AOP框架 21 Spring的数据层访问 22 Spring的声明式事务 22 Spring对其它企业应用支持 22 ...

    Spring教程  主要内容:介绍Spring的历史,Spring的概论和它的体系结构,重点阐述它在J2EE中扮演的角色。

    Bean的定义 16 Bean的之前初始化 19 Bean的准备就绪(Ready)状态 21 Bean的销毁 21 ApplicationContext 21 Spring的AOP框架 21 Spring的数据层访问 22 Spring的声明式事务 22 Spring对其它企业应用支持 22

    跟我学spring3(8-13).pdf

    11.2 实现通用层 11.3 实现积分商城层 12.1 概述 12.2 注解实现Bean依赖注入 12.3 注解实现Bean定义 12.4 基于Java类定义Bean配置元数据 12.5 综合示例-积分商城 13.1 概述 13.2 单元测试 集成测试 ——跟我学spring3

    跟开涛学Spring

    1.17 【第五章】Spring表达式语言 之 5.4在Bean定义中使用EL—跟我学spring3 . . . . . . . . . . . . . . . .197 1.18 【第六章】 AOP 之 6.1 AOP基础 ——跟我学spring3 . . . . . . . . . . . . . . . . . . . ....

    跟我学spring3(1-7).pdf

    —— 5.1 概述 5.2 SpEL基础5.3 SpEL语法5.4在Bean定义中使用EL6.1 AOP基础6.2 AOP的HelloWorld6.3 基于Schema的AOP6.4 基于@AspectJ的AOP 6.5 AspectJ切入点语法详解6.6 通知参数6.7 通知顺序6.8 切面实例化模型

    第2章 容器和bean的基本原理1

    Spring框架技术—— 容器和bean的基本原理本章内容知识点掌握程度 难易程度传统组件调用方式理解理解为何使用IoC理解掌握理解Bean的定义和命名掌握Be

    Spring.3.x企业应用开发实战(完整版).part2

    4.11.1 使用Java类提供Bean定义信息 4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 不同配置方式比较 4.13 小结 第5章 Spring容器高级主题 5.1 Spring容器技术内幕 5.1.1 内部工作机制 5.1.2 BeanDefinition ...

    SpringBoot下的SpringAOP-day04-源代码

    SpringBoot下的Spring——DAY04——动态代理总结、AOP、自定义注解进行拦截、动态获取注解参数、通知方法 1.动态代理总结 1.1 JDK动态代理特点 1.2 CGlib动态代理 1.2.1 CGLib特点说明 1.3 动态代理的作用 2 Spring...

    Spring4.x企业应用开发 有书签,很方便查找

    本书是在《精通Spring 3.x——企业应用开发详解》的基础上,历时一年的重大调整改版而成的,延续了上一版本“追求深度,注重原理,不停留在技术表面”的写作风格,力求使读者在熟练使用Spring的各项功能的同时透彻...

    Spring3.x企业应用开发实战(完整版) part1

    4.11.1 使用Java类提供Bean定义信息 4.11.2 使用基于Java类的配置信息启动Spring容器 4.12 不同配置方式比较 4.13 小结 第5章 Spring容器高级主题 5.1 Spring容器技术内幕 5.1.1 内部工作机制 5.1.2 BeanDefinition ...

    Spring Security-3.0.1中文官方文档(翻译版)

    另:Spring Security 从2010-01-01 以后,版本控制从SVN 换成了GIT,我们在翻译文档的 时候,主要是根据SVN 的变化来进行文档内容的比对,这次换成GIT 后,感觉缺少了之前 那种文本比对工具,如果有对GIT 熟悉的...

    SpringSecurity 3.0.1.RELEASE.CHM

    Spring Bean配置 18.4.6. LDAP属性和自定义UserDetails 19. JSP标签库 19.1. 声明Taglib 19.2. authorize标签 19.3. authentication 标签 19.4. accesscontrollist 标签 20. Java认证和授权服务(JAAS)供应...

    Spring Security 中文教程.pdf

    Spring Bean配置 19.4.6. LDAP属性和自定义UserDetails 20. JSP标签库 20.1. 声明Taglib 20.2. authorize 标签 20.3. authentication 标签 20.4. accesscontrollist 标签 21. Java认证和授权服务...

    NewsSystem:基于Struts + Spring + Hibernate + Bootstrap

    jQuery的引导程序UEditor——在线HTML编辑器模块介绍公共类设计Web.xml中配置Struts及初始化Spring容器,准备WEB-INF路径下applicationContex.xml文件作为Spring配置文件,在Spring中定义数据源Bean,使用C3P0数据...

    harmonyos2-spring-ratpack-2016:SpringBootRatpack网络研讨会代码(https://spring.

    和声2 Spring Boot 和 Ratpack 随着 Ratpack 和 Spring Boot ...中定义 bean 图 1. 但是为什么要在@Configuration使用 XML 基于注解的框架集成 spring-cloud 项目 @EnableDiscoveryClient @RibbonCl

    swing界面设计之JTree

    创建 Spring app-context.xml bean 定义文件 19 运行应用程序 20 定义 bean 属性 21 创建 to-do 列表:创建一个可重用组件并在表中显示数据 23 创建一个可重用的面板 23 将 bean 组合在一起 24 添加一个表并重用这个...

Global site tag (gtag.js) - Google Analytics