Spring4.0(上)
记录Spring 4.0 上 学习中的知识点
bean的配置方式
- 通过全类名(反射)
- 通过工厂方式(静态工厂方法&实例工厂方法)
- FactoryBean
依赖注入的方式
- 属性注入
- 构造器注入
- 工厂方法注入
通过全类名(反射)配置Bean
要求:Bean中有默认构造器
class:bean的全类名
id:标识容器中的bean,id唯一
示例代码如下:
<!-- 配置bean -->
<bean id="helloWorld" class="com.wkl.Spring.beans.HelloWorld">
<property name="name" value="Spring"></property>
</bean>
ApplicationContext的主要实现类
ClassPathXmlApplictaionContext:从类路径下加载配置文件
FileSystemXmlApplicationContext:从系统文件中加载配置文件
ApplicationConetx ctx = new ClassPathXmlApplictaionContext(XXXX.xml);
Object obj = ctx.getBean("beanId");
使用构造器注入属性,可以设置index或者type区别位置和传值类型来确定构造器:
<!-- 通过构造方法来配置bean 的属性 -->
<bean id="car" class="com.wkl.Spring.beans.Car">
<constructor-arg value="Audi" index="0"></constructor-arg>
<constructor-arg value="上海" index="1"></constructor-arg>
<constructor-arg value="300000" index="2"></constructor-arg>
</bean>
引用其他bean:可以用ref属性或者ref元素<ref>
<bean id="person" class="com.wkl.Spring.beans.Person">
<property name="name" value="越马飞"></property>
<property name="age" value="23"></property>
<!-- <property name="car" ref="car2"></property> -->
<property name="car">
<ref bean="car2"/>
</property>
</bean>
*内部bean
内部bean不能被外部使用,只能内部使用
<!-- 内部bean -->
<bean id="person2" class="com.wkl.Spring.beans.Person">
<property name="name" value="剑马飞"></property>
<property name="age" value="23"></property>
<!-- <property name="car" ref="car2"></property> -->
<!-- <property name="car">
<ref bean="car2"/>
</property> -->
<property name="car">
<bean class="com.wkl.Spring.beans.Car">
<constructor-arg value="Ford"></constructor-arg>
<constructor-arg value="长安"></constructor-arg>
<constructor-arg value="200000" type="double"></constructor-arg>
</bean>
</property>
<!--
<property name="car.maxSpeed" value="260"></property>
-->
</bean>
当使用集合bean的时候:
不能将集合作为独立的bean定义,所以其他的bean无法引用该集合,所以无法在不同bean之间共享集合;
可以使用util schema来定义独立的集合bean
<!-- 测试如何配置集合属性 -->
<bean id="person4" class="com.wkl.Spring.beans.collection.Person">
<property name="name" value="Mike"></property>
<property name="age" value="25"></property>
<property name="cars">
<!-- 使用list属性给集合赋值 -->
<list>
<ref bean="car"/>
<ref bean="car2"/>
</list>
</property>
</bean>
<!-- 配置map属性值 -->
<bean id="newPerson" class="com.wkl.Spring.beans.collection.NewPerson">
<property name="name" value="Rose"></property>
<property name="age" value="28"></property>
<property name="cars">
<map>
<entry key="AA" value-ref="car"></entry>
<entry key="BB" value-ref="car2"></entry>
</map>
</property>
</bean>
<!-- 配置Properties属性值 -->
<bean id="dataSource" class="com.wkl.Spring.beans.collection.DataSource">
<property name="properties">
<props>
<prop key="user">root</prop>
<prop key="password">123456</prop>
<prop key="jdbcUrl">jdbc:mysql:///test</prop>
<prop key="driverClass">com.mysql.jdbc.Driver</prop>
</props>
</property>
</bean>
<!-- 配置单例集合bean,以供多个bean进行引用,需要导入util命名空间 -->
<util:list id="cars">
<ref bean="car"/>
<ref bean="car2"/>
</util:list>
<bean id="person5" class="com.wkl.Spring.beans.collection.Person">
<property name="name" value="Jack"></property>
<property name="age" value="29"></property>
<property name="cars" ref="cars"></property>
</bean>
Xml配置里的Bean自动装配
可以使用auto-wire属性指定自动装配的方式
ByType(根据类型自动装配):根据bean的类型,若IoC容器中有一个以上的类型匹配bean,则报异常
ByName(根据名称自动装配):根据名字和当前bean的setter风格属性进行自动装配
Constructor(根据构造器自动装配)
<!-- 通过名称自动装配示例 -->
<bean id="person" class="com.wkl.Spring.beans.autowire.Person"
p:name="Tom" autowire="byName"></bean>
bean之间的关系
- 继承:
使用bean的parent属性指定继承哪个bean的配置
注:使用abstruct属性把bean定义为抽象bean(模版bean),则该bean不能实例化;
<!-- bean的 abstract属性为true,这样的bean不能被ioc容器实例化,只能用来被继承配置
若某一个bean的class属性没有指定,则该bean必须是一个抽象bean
-->
<bean id="address"
p:city="BeiJing" p:street="WuDaoKou" abstract="true"></bean>
<!-- 使用bean的parent属性指定继承哪个bean的配置 -->
<bean id="address2" class="com.wkl.Spring.beans.autowire.Address" parent="address" p:street="WangFuJing"></bean>
<bean id="address3" class="com.wkl.Spring.beans.autowire.Address" parent="address2" p:street="DaZhongSi"></bean>
- 依赖
使用depends-on属性配置依赖属性,依赖的bean会在本bean实例前创建好;
依赖多个bean,可以通过逗号、空格的方式配置bean名称
<bean id="address"
p:city="BeiJing" p:street="WuDaoKou" abstract="true"></bean>
<!-- 使用bean的parent属性指定继承哪个bean的配置 -->
<bean id="address2" class="com.wkl.Spring.beans.autowire.Address" parent="address" p:street="WangFuJing"></bean>
<bean id="car" class="com.wkl.Spring.beans.autowire.Car" p:brand="Audi"
p:price="300000"></bean>
<!-- 要求在配置Person时必须有一个关联的car ! 换句话说就是person依赖于car这个bean -->
<bean id="person" class="com.wkl.Spring.beans.autowire.Person"
p:name="Tom" p:address-ref="address2" depends-on="car"></bean>
bean的作用域
scope属性:
prototype:原型的。容器初始化的时候不创建bean的实例,而是在每次请求时都创建一个新的bean实例,并返回;
singleton:默认的;单例的;在整个容器生命周期中只创建这一个bean(在容器初始化时创建);
不常用的属性:request、session
<bean id="car" class="com.wkl.Spring.beans.autowire.Car"
scope="">
<property name="brand" value="Audi"></property>
<property name="price" value="300000"></property>
</bean>
使用外部属性文件
需要C3P0.jar;mysql需要mysql相应的jar
配置方式:<context:property-placeholder location="classpath:db.properties"/>
使用${name}
的形式导入数据
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 使用外部属性文件的属性 -->
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="driverClass" value="${driverClass}"></property>
<property name="jdbcUrl" value="${jdbcUrl}"></property>
</bean>
SpEL
使用#{}
作为界定,大括号里的都为SpEL
- 整数:
#{5}
- 小数:
#{1.1}
- 科学计数法:
#{1e4}
- 字符串用单、双引号为界定符号:
#{'char'},#{"char"}
-
Boolean:
#{false}
引用bean属性和方法:
引用其他对象:
#{beanName}
- 引用属性:
#{beanName.suffix}
-
引用方法:
#{beanName.method()}
或者方法调用方法#{beanName.method().otherMethod()}
SpEL支持
- 支持:
+,-,*,/,%,^
; - 支持:
"String" + "String"
; - 支持:<(
lt
),>(gt
),==(eq
),<=(le
),>=(ge
); - 支持:
and,or,not,|
; - 支持:if-else:
a > b ? c : d
; - 支持:正则表达式;
- 支持:静态方法、属性:
T()
调用一个类,然后调用相应的静态属性和方法:#{T().PI}
;
IoC管理Bean的生命周期
未加后置处理
- 通过构造器或工厂方法创建Bean实例;
- 为Bean的属性设置值和对其他Bean引用;
- 调用Bean的初始化方法;
- 使用Bean;
-
当容器关闭时
xx.close()
,调用Bean的销毁方法。暂时没有,稍后补充。。。
Bean声明中设置:
初始化方法:init-method
销毁方法:destroy-method
暂时没有,稍后补充。。。
创建Bean后置处理器
- 在调用初始化方法前后对Bean进行额外的处理
- 对IoC容器中所有Bean实例逐一处理
-
需要实现BeanPostProcessor借口
- 通过构造器或工厂方法创建Bean实例
- 为Bean的属性设置值和对其他Bean的引用
2.5 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialzation方法 - 调用Bean的初始化方法
3.5 将Bean实例传递给Bean后置处理器的postProcessAfterInitialzation方法 - 使用Bean
- 当容器关闭时
xx.close()
,调用Bean的销毁方法
使用方法: <bean class="XXXX.XXXXX.XXXXX.PostP....."></bean>
注意:在After和Before时,可以换掉或修改Bean
暂时没有,稍后补充。。。
上一篇: 你才是贱货
下一篇: 特么老毛病又犯了是吧
推荐阅读