Spring的Bean的配置(二)
Bean相关的配置
-
< bean >标签的id和name的属性配置
id:使用了约束的唯一约束,并且里面不能出现特殊字符(如 / )
name:没有使用约束中的唯一约束(理论上是可以重复的,但实际上不允许),里面可以出现特殊字符。
例如:Spring和Struts1框架整合的时候,Struts1 将action 托管给Spring框架,带入字符, < bean name=”/user” class=””/>。
Bean的生命周期
可以在ApplicationContext.xml中配置Bean的初始化方法以及销毁方法
init-method:Bean被初始化的时候执行的方法
destroy-method:Bean被销毁的时候执行的方法(Bean默认是单例创建,工厂关闭)
< bean name=“Service” class=“demo.ServiceImpl” init-method=“init” destroy-method=“destroy”>
同时需要在被托管的类中写 init 方法和 destroy 方法
public void init(){
System.out.println("类被初始化啦");
}
public void destroy() {
System.out.println("类被销毁啦");
}
Bean的作用范围的配置
-
scope:Bean的作用范围
- singleton:默认的,Spring会采用单例模式创建这个对象。
- prototype:多例模式。(Struts2和Spring整合一定会用到)
- request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
- session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
- globalsession:应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
<bean name="Service" class="demo.ServiceImpl" scope="singleton">
属性的注入方式
-
构造方法的属性注入:
需要先在类中写一个有参的构造方法,然后再在配置文件中设置:
<bean name="Service" class="demo.ServiceImpl">
<!--构造方法的依赖注入,给属性赋值,需要先在类中写有参构造方法-->
<constructor-arg name="name" value="kk1"/>
<constructor-arg name="age" value="18"/>
</bean>
- set方法的属性注入:
需要在类中提供相应属性的setXXX()方法,然后再在配置文件中使用value属性配置值。
value:设置普通类型的值
<bean name="Service" class="demo.ServiceImpl"">
<!--DI的基本配置,set方式依赖注入,给类里面的属性赋值-->
<!--需要在类中提供属性的Set方法-->
<property name="name" value="kk" />
<property name="age" value="kk" />
</bean>
当依赖注入的类中有对象成员的时候,需要使用到 ref属性 来给对象成员赋值。
有user类和car类,car类是user类中的成员。
car类:
public class car {
String name;
String price;
public void setName(String name) {
this.name = name;
}
public void setPrice(String price) {
this.price = price;
}
}
user类:
public class user {
String name;
car car;
public void setName(String name) {
this.name = name;
}
public void setCar(demo.car car) {
this.car = car;
}
}
需要将两个类都托管在Spring中,也就是在xml中配置类,然后使用 ref 属性为 user 类注入 car 成员。
相当于是引用了 car 类的属性注入,再为自己的成员进行属性注入。
<bean name="car" class="demo.car">
<property name="name" value="baoma" />
<property name="price" value="10000" />
</bean>
<bean name="user" class="demo.user">
<!--car,是对象成员,ref:设置其它的类的id或者name,相当于引用别的类-->
<property name="name" value="kk" />
<property name="car" ref="car" />
</bean>
构造方法设置对象属性也是一样,同样在< constructor-arg>标签中使用ref属性进行设置。
< constructor-arg name=“car” ref=“car”/>
P名称空间的属性注入
-
通过引入P:名称空间完成属性的注入
-
普通属性: p:属性名 = “值”
-
对象属性: p:属性名-ref = “值”
-
首先,先需要在xml的< beans>标签中添加一行代码,声明 p 名称空间
xmlns:p="http://www.springframework.org/schema/p "
将刚刚的user,car案例改一**入方式:
<bean name="car" class="demo.car" p:name="baoma" p:price="12550"/>
<bean name="user" class="demo.user" p:name="kk" p:car-ref="car"/>
SpEL的属性注入
-
SpEL:Spring Expression Language,Spring的表达式语言
- 语法:#{SpEL}
< property name=“count” value="#{5}" />
在< property>元素的value属性中使用 #{} 界定符将值装配到Bean的属性中。
<!--SpEL的属性注入方式-->
<bean name="car" class="demo.car">
<property name="name" value="#{baoma}"></property>
<property name="price" value="#{1800}"></property>
</bean>
<bean name="user" class="demo.user">
<property name="name" value="#{an}"/>
<!--car 指向的是另个一个bean对象-->
<property name="car" value="#{car}"/>
</bean>
可以装配以下类型:
-
浮点型数字:#{89.7}
-
科学计数法:#{1e4}
-
字符或者字符串:#{‘moonlit’},{“moonlit”}
-
布尔值:#{true}
-
bean的对象:#{car}
-
其他类的成员:#{car.name}
-
其他类的方法:#{car.getName()}
-
运算或者字符串拼接:#{car.getPrice + 100},#{car.getName + car.getPrice}
-
正则表达式匹配:#{car.getEmail matches ‘[a-zA-Z0-9.%+][email protected][a-zA-Z0-9.-]+\.com’},matches 是关键字
注入复杂类型(集合,数组)
如果bean对象的成员是 数组,集合等,可以通过相对应的标签,往这些复杂类型的成员中依次注入值。
一样的也需要为各个成员配置getXXX 方法,以便Spring可以获取到。
基本类型的值使用value标签注入
对象类型的值使用ref标签 注入,还需要在Spring容器中配置相应Bean
CollectionBean类:
public class CollectionBean {
private String[] arrs;
private List<String> list;
private Set<String> set;
private Map<String,String>map;
@Override
public String toString() {
return "CollectionBean{" +
"arrs=" + Arrays.toString(arrs) +
", list=" + list +
", set=" + set +
", map=" + map +
'}';
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setList(List<String> list) {
this.list = list;
}
public void setArrs(String[] arrs) {
this.arrs = arrs;
}
}
配置文件:
<bean id="CollectionBean" class="demo2.CollectionBean">
<!--数组类型-->
<!--如果是数组里存放的是对象类型的成员,就使用ref标签-->
<!--用list标签,和list集合类型一样,使用value标签注入成员-->
<property name="arrs">
<list>
<value>王东1</value>
<value>王东2</value>
<value>王东3</value>
<!--<ref>car</ref>-->
</list>
</property>
<!--对象数组类型-->
<!--使用ref标签,指定bean名称,注入car对象数组,car对象需要在Spring中配置-->
<property name="cars">
<list>
<ref bean="car"></ref>
</list>
</property>
<!--注入集合类型-->
<!--如果是集合里存放的是对象类型的成员,就使用ref标签-->
<!--用list标签,和数组一样,使用value标签注入成员-->
<property name="list">
<list>
<value>kk1</value>
<value>kk2</value>
<value>kk3</value>
</list>
</property>
<!--注入set类型-->
<!--使用set标签,使用value标签注入成员-->
<property name="set">
<set>
<value>jj1</value>
<value>jj2</value>
<value>jj3</value>
</set>
</property>
<!--注入map集合-->
<!--使用map标签-->
<!--使用entry标签注入key成员,用value标签注入对应的value成员-->
<!--如果key是对象类型,那么使用key-ref标签,如果是value是对象类型,那么使用value-ref标签-->
<property name="map">
<map>
<entry key="aa">
<value>hh</value>
</entry>
<!--或者是-->
<entry key="aa1" value="hh1"/>
<entry key="aa2" value="hh2"/>
</map>
</property>
</bean>