从0开始的Spring(03)-配置Bean
1 配置形式:基于XML文件的方式;基于注解的方式
1.1 基于XML文件的方式
<!-- 配置Bean -->
<bean id="helloWorld" class="com.trainee.HelloWorld">
<property name="name" value="Spring"></property>
</bean>
- class:Bean的全类名,通过反射的方式在IOC容器中创建Bean,所以要求Bean中必须有无参构造器
- id: Bean的名称
--标识容器中的Bean,id唯一
--若id没有指定,Spring自动将权限定性类名作为Bean的名字
--id可以指定多个名字,名字之间可以用逗号、分号或空格隔开
1.2 基于注解的方式
2 Bean的配置方式:通过全类名(反射);通过工厂方法(静态工厂方法&实例工厂方法);FactoryBean
2.1 通过全类名(反射)
//利用id定位到IOC容器中的Bean
HelloWorld helloWorld = (HelloWorld) ctx.getBean("helloWorld");
//利用类型返回IOC容器重的Bean,但要求IOC容器中必须只能有一个该类型的Bean
HelloWorld helloWorld1 = ctx.getBean(HelloWorld.class);
2.2 通过工厂方法(静态工厂方法&实例工厂方法)
2.3 FactoryBean
3 IOC容器BeanFactory&ApplicationContext概述
在Spring IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化,只有在容器实例化之后,才可以从IOC容器里获取Bean实例并使用。Spring提供了两种类型的IOC容器实现:BeanFactory和ApplicationContext
BeanFactory:IOC容器的基本实现
ApplicationContext:提供了更多的高级特性,是BeanFactory的子接口
- BeanFactory是Spring框架的基础设施,面向Springbenshen
- ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都直接使用ApplicationContext而非底层的BeanFactory
- 无论使用何种方式,配置方式是相同的
3.1 BeanFactory
3.2 ApplicationContext
- ApplicationContext的主要实现类:
1.ClassPathXmlApplicationContext:从类路径下加载配置文件
2.FileSystemXmlApplicationContext:从文件系统中加载配置文件 - ConfigurableApplicationContext扩展于ApplicationContext,新增两个主要方法:refresh()和close(),让ApplicationContext具有启动、刷新和关闭上下文的能力
- ApplicationContext在初始化上下文时就实例化所有单例的Bean
- WebApplicationContext是专门为Web应用而准备的,它允许从相对于Web根目录的路径中完成初始化工作
4 依赖注入的方式:属性注入;构造方法注入;工厂方法注入
4.1 属性注入
- 属性注入即通过setter方法注入Bean的属性值或依赖的对象
- 属性注入使用<property>元素,使用name属性制定Bean的属性名称,value属性或<value>子节点指定属性值
- 属性注入是实际应用中最常用的注入方式
<bean id="helloWorld" class="com.trainee.HelloWorld">
<property name="name" value="Spring"></property>
</bean>
4.2 构造方法注入
- 通过构造方法注入注入Bean的属性值或依赖的对象,它保证了Bean实例在实例化后就可以使用
- 构造器注入在<constructor-arg>元素里声明属性,<constructor-arg>中没有name属性
<bean id="car" class="com.trainee.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg value="ShangHai" index="1"></constructor-arg>
<constructor-arg value="300000" type="double"></constructor-arg>
</bean>
<bean id="car2" class="com.trainee.Car">
<constructor-arg value="BaoMa" type="java.lang.String"></constructor-arg>
<constructor-arg value="ShangHai" type="java.lang.String"></constructor-arg>
<constructor-arg value="300" type="int"></constructor-arg>
</bean>
使用构造器注入属性值可以指定参数的位置(index)和参数的类型(type),以区分重载的构造器
字面值:可用字符串表示的值,可以通过<value>元素标签或value属性进行注入
基本数据类型及封装类、String等类型都可以采取字面值注入的方式
若字面值中包含特殊字符可以使用<![CDATA[]]>把字面值包裹起来
例如 < 和 > 再xml中是特殊字符,如果在字符串中出现了这些字符,就需要使用<![CDATA[]]>
<constructor-arg type="java.lang.String">
<value><![CDATA[<ShangHai>]]></value>
</constructor-arg>
引用其他的Bean:
组成应用程序的Bean经常需要相互协作以完成应用程序的功能。要使Bean能够互相访问,就必须在Bean配置文件中指定对Bean的引用
在Bean的配置文件中,可以通过<ref>元素或ref属性为Bean的属性或构造器参数指定对Bean的引用
也可以在属性或构造器里包含Bean的声明,这样的Bean称为内部Bean
内部Bean
当Bean实例仅仅给一个特定的属性使用时,可以将其声明为内部Bean,内部Bean的声名直接包含在<property>或<constructor-arg>元素里,不需要设置id或name属性
内部不能使用在其他任何地方
<bean id="person" class="com.trainee.Person">
<property name="name" value="Tom"></property>
<property name="age" value="20"></property>
<!--
<property name="car" ref="car2"></property>
-->
<property name="car">
<bean class="com.trainee.Car">
<constructor-arg value="ffff"></constructor-arg>
<constructor-arg value="Changan"></constructor-arg>
<constructor-arg value="202020" type="double"></constructor-arg>
</bean>
</property>
</bean>
集合属性:
在Spring中可以通过一组内置的xml标签(例如:<list>,<set>,<map>)来配置集合属性
配置java.util.List类型的属性,需要指定<list>标签,在标签里包含一些元素,这些标签可以通过<value>指定简单的常量值,通过<ref>指定对其他Bean的引用,通过<Bean>指定内置Bean定义。通过<null/>指定空元素,甚至可以内嵌其他集合
数组的定义和List一样,都使用<list>
配置java.util.Set需要使用<set>标签,定义元素的方法与List一样