bean的使用
通过装配bean,spring帮你创建一个javabean类的实例对象,这样你可以从spring Ioc容器中取出对象,不用自己去new。
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) ctx2.getBean("user");
或者User user = ctx2.getBean(User.class);//要求xml文件中该类的bean只有一个
装配bean的方式
- 使用一个或多个xml文件作为配置文件方式
- 基于java注解方式
- 混合使用xml文件和注解方式(推荐使用)
通过xml配置bean
基于XML文件的方式,通过全类名(反射)的方法配置bean
声明bean,通过<bean>
标签声明bean。
<bean id="stage" class="spring.Stage" > </bean>
通过工厂方法创建bean
当一个javabean类没有公开的构造方法,通过该类的一个静态内部类去创建这个类的实例,然后去调用这个内部类的对象。
配置这样的bean,通过<bean>
标签中的factory-method属性,来调用一个指定的静态方法。
1.javabean类
public class Stage{
private Stage(){
}
private static class StageSingleton{
static Stage stage = new Stage();
}
public static Stage getInstance(){
return StageSingleon.stage;
}
}
2.bean的配置
<bean id="stage" class="spring.Stage"
factory-method="methodName" />
bean的作用域
通过配置bean 的scope属性,指定bean的作用域
singleton (默认)容器初始时创建bean实例,整个容器的生命周期中只创建这一个实例,单例的
prototype 原型的,容器初始化时不创建bean实例,而在每一次请求时都创建一个新的bean的实例
request、session、global-session
<bean id="car" class="scope.Car" scope="prototype">
<property name="brand" value="audi"></property>
<property name="price" value="12000"></property>
</bean>
配置bean的属性
java类一般通过set方法和构造方法来为属性赋值。spring中<property>
是依靠set方法,<constructor-arg>
是依靠构造方法。
使用直接量为属性赋值,直接量会自动转换为该属性的基本数据类型。
1.<property>
标签,是通过类的set方法为bean对象的属性赋值,必须要有对应的set方法
<bean id="car" class="beans.Car">
<property name="brand" value="audi"></property>
<property name="price" value="10000"></property>
</bean>
2.<constructor>
标签,是通过构造方法为bean对象的属性赋值,需要有对应的构造方法。
<bean id="car2" class="beans.Car">
<constructor-arg value="bengci"></constructor-arg>
<constructor-arg value="10000" type="int"></constructor-arg>
</bean>
基本使用标签
1.使用<ref>
标签,引用其他bean
<bean name="person" class="beans.Person">
<property name="car" ref="car"></property>
<property name="car">
<ref bean="car"/>
</property>
</bean>
2.使用内部bean,只能在内部使用,不能被外部访问
<bean name="person" class="beans.Person">
<bean class="beans.Car">
<property name="brand" value="baoma"></property>
<property name="price" value="10000"></property>
</bean>
</bean>
3.通过p命名空间为bean的属性赋值,需要先导入p命名空间,相对于传统的配置方式更为简洁
<bean id="person5" class="collection.Person"
p:name="lisi" p:age="34" p:cars-ref="listCars"></bean>
4.测试赋值null
<bean id="person2" class="beans.Person">
<property name="car"><null/></property>
</bean>
装配集合
1.配置List、Set、Array等集合属性,
其他的只需替换<list>
标签,使用<set>,<array>
标签
<bean name="person3" class="collection.Person">
<property name="cars">
<list>
<ref bean="Ccar"/>
<ref bean="Ccar2"/>
</list>
</property>
</bean>
2.配置Map集合
使用map节点及map的entry子节点配置Map类型成员变量
<bean id="newPerson" class="collection.NewPerson">
<property name="car">
<map>
<entry key="AA" value-ref="Ccar"></entry>
<entry key="BB" value-ref="Ccar2"></entry>
</map>
</property>
</bean>
3.配置Properties集合
使用props 和 子节点prop 来为Properties属性赋值
<bean id="dataSource" class="collection.DataSource">
<property name="properties">
<props>
<prop key="user">root</prop>
<prop key="password">root</prop>
<prop key="jdbcUrl">jdbc:mysql:///test</prop>
<prop key="dirverClass">com.mysql.jdbc.Driver</prop>
</props>
</property>
</bean>
使用表达式装配
spEL表达式的使用,#{}
<property name="count" value="#{}"/>
1.字面值(基本数据类型)
#{5}、#{1.2}、#{“zhangsan”}、#{false}
科学计数法#{1e4},混合使用value=“the value is #{5}”
2.引用bean,bean的属性
引用bean
<property name="car" value="#{car1}">相当于<property name="car" ref="car1"/>
引用bean的属性
<property name="name" value="#{person.name}"/> //bean的id.属性名
调用bean的方法
<property name="name" value="#{person.getName()}"/>
3.操作类
通过#{T(类名).属性},#{T(类名).方法}
<property name="munber" value="#{T(java.lang.Math).PI}"/>
<property name="randomNmuber" value="#{T(java.lang.Math).random()}"/>
4.数值运算,逻辑运算和三元运算符
value="#{counter.total-2}"
value="#{T(java.lang.Math).PI*circle.radius*2}"
5.正则表达式
通过matches运算符支持正则表达
<property name="email" value="#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-z0-9.-]+\.com'}"/>
6.筛选集合
使用<util:list>
标签配置Car对象的List集合,spEL可以从中筛选满足条件的一个或者多个Car对象
<util:list id="cars">
<bean class="beans.Car"
p:brand="aodi" p:price="10000"/>
<bean class="beans.Car"
p:brand="baoma" p:price="20000"/>
<ref bean="car 1"/>
</util:list>
可以访问集合成员,集合的元素个数
value="#{cars[2]}"、value="cars"
value="#{cars.size()}"
加载一个.properties文件
<util:properties id="jdbc" location="classpath:db.properties">
通过bean的某个属性筛选集合中的对象
value="#{cars.?[price gt 1000]}" //找到价格为10000的Car对象
投影运算符
.![]取对象的某些属性组成一个新的集合
value="#{cars.![brand]}" //一个string类型的集合,每个元素为brand的值
value="#{cars.!['the car brand is' + [brand] + 'price is' +[price] ]}" //一个String类型的集合
抽象bean
bean的abstract 属性设为 true 。这样的bean 不能被 IOC 容器实例化,只能用来继承配置
若一个bean的 class 没有指定,则该 bean 一定是个抽象 bean
使用bean 的 parent 属性指定继承哪个 bean 的配置
<bean id="address-abstract"
p:city="harbin" p:street="sobei" abstract="true"></bean>
<bean id="address3" class="autowire.Address"
p:street="songpu" parent="address-abstract"></bean>
bean之间的依赖
A bean 依赖 B bean,在设置这个A bean的时候,必须存在B这个bean,不然在IOC容器初始化的时候就会报错
<bean id="person" class="autowire.Person"
p:name="taogen" p:address-ref="address" depends-on="car"></bean>
<!-- 没有car这个bean,调用person这个bean的对象时会报错-->
<bean id="car" class="autowire.Car"
p:brand="baoma" p:price="120000"></bean>