spring入门--bean加载

[*] spring加载bean的两种方式

[*] spring依赖注入方式

[*] bean配置

源码地址

spring加载bean的两种方式

  • ClassPathXmlApplicationContext 从类路径下加载配置文件
  • FileSystemXmlApplicationContext 从系统文件加载配置文件
  • 两个都继承AbstractRefreshableConfigApplicationContext实现

依赖关系图

1
2
3
// ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext ctx = new FileSystemXmlApplicationContext("F:\\code\\java\\springdemoroot\\spring4.0x\\src\\main\\resources\\applicationContext.xml");

bean的获取

  • ctx.getBean(); 不赘述

spring 依赖注入方式

属性注入

  • 通过setter方法注入 eg: <property name="value" value="spring 4.3"/> (value与class类的setter方法名称对应)

通过构造器注入

  • 重载构造器可以通过位置(index)、类型(type)、参数名称(name)区分
  • 基本类型、封装类、string 都可以使用<value>标签获取value属性注入
  • 特殊字符使用<![CDATA[]]>进行注入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!--通过构造器注入1-->
<bean id="car" class="com.sunny.beans.di.Car">
<constructor-arg index="0">
<value><![CDATA[<Benchi^>]]></value>
</constructor-arg>
<constructor-arg index="1">
<value>shanghai</value>
</constructor-arg>
<constructor-arg index="2">
<value>3000</value>
</constructor-arg>
</bean>
<!--通过构造器注入2-->
<bean id="car2" class="com.sunny.beans.di.Car">
<constructor-arg value="240" name="maxSpeed" type="int" index="2"></constructor-arg>
<constructor-arg value="baoma" index="0"></constructor-arg>
<constructor-arg value="shanghai" index="1"></constructor-arg>
</bean>

工厂方法注入(没有用过)

bean配置

内部bean配置

  • 不能被外部引用,只能在person内部使用
1
2
3
4
5
6
7
8
9
10
<bean id="person2" class="com.sunny.beans.reference.Person">
<property name="name" value="李四"></property>
<property name="age" value="25"></property>
<property name="car">
<bean id="car3" class="com.sunny.beans.di.Car">
<constructor-arg value="250" name="maxSpeed" type="int" index="2"/>
<constructor-arg value="mazida" name="brand" index="0"/> <constructor-arg value="shanghai" name="corp" index="1"/>
</bean>
</property>
</bean>

null值设置

  • 使用<null/>标签
1
2
3
4
5
6
7
<bean id="person3" class="com.sunny.beans.reference.Person">
<constructor-arg name="name" value="王五"/>
<constructor-arg name="age" value="25"/>
<constructor-arg name="car">
<null/>
</constructor-arg>
</bean>

给级联属性赋值

  • 属性(car)需要初始化后才可以级联赋值
1
2
3
4
5
6
7
<bean id="person4" class="com.sunny.beans.reference.Person">
<constructor-arg name="name" value="王五"/>
<constructor-arg name="age" value="25"/>
<constructor-arg name="car" ref="car"/>
<!--使用级联修改小车的最大速度为100-->
<property name="car.maxSpeed" value="100"></property>
</bean>

配置集合属性

  • spring 提供了xml标签(<list><set><map>)为集合赋值
  • 在集合标签可以通过<value>指定简单的常量值,<ref>指定bean的引用,<bean>内部bean定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<bean id="conllectionsPerson" class="com.sunny.beans.conllections.Person">
<property name="name" value="钻石王老五"/>
<property name="age" value="50"/>
<property name="cars">
<list>
<ref bean="car"/>
<ref bean="car2"/>
<!--<value type="com.sunny.beans.HelloWorld">sdfsd</value>-->
<bean class="com.sunny.beans.di.Car">
<constructor-arg value="250" name="maxSpeed" type="int" index="2"></constructor-arg>
<constructor-arg value="mazida" name="brand" index="0"></constructor-arg>
<constructor-arg value="shanghai" name="corp" index="1"></constructor-arg>
</bean>
</list>
</property>
</bean>

配置map属性

  • 通过<entry>标签的 key 和value-ref 绑定值
1
2
3
4
5
6
7
8
9
10
<bean id="mapPerson" class="com.sunny.beans.conllections.MapPerson">
<property name="name" value="老王"/>
<property name="age" value="30"/>
<property name="cars">
<map>
<entry key="AA" value-ref="car"></entry>
<entry key="BB" value-ref="car2"></entry>
</map>
</property>
</bean>

配置 properties 属性值

  • 通过<entry>标签的 key 和value-ref 绑定值
1
2
3
4
5
6
7
8
9
10
<bean id="dataSource" class="com.sunny.beans.properties.DataSource">
<property name="properties">
<props>
<prop key="user">root</prop>
<prop key="password">123456</prop>
<prop key="jdbcUrl">jdbc:mysql....</prop>
<prop key="driverClass">com.mysql.jdbc.Driver</prop>
</props>
</property>
</bean>

配置单独的bean,提供多个bean引入

  • 使用标签定义一个公用bean
1
2
3
4
5
6
7
8
9
10
<util:list id="commonCars">
<ref bean="car"/>
<ref bean="car2"/>
</util:list>
<!--引入公用的bean-->
<bean id="person5" class="com.sunny.beans.conllections.Person">
<property name="name" value="引入公用的bean"/>
<property name="age" value="30"/>
<property name="cars" ref="commonCars"/>
</bean>

通过p命名空间为bean属性赋值

1
<bean id="person6" class="com.sunny.beans.reference.Person" p:age="20" p:name="通过p给bean属性赋值" p:car-ref="car"></bean>

如果有写的不对的地方请指出

我的微信号可以一起学习、讨论、纠错

分享到