Spring中的基本配置
1、XML文件中标签提示的配置
IDEA中设置中xml catalog直接引入Spring框架解压包下的约束即可。
例如路径:F:\Spring\spring-framework-4.2.4.RELEASE\schema\beans\spring-beans-4.2.xsd
2、bean标签中,id和name的属性配置
id :使用了约束中的唯一约束。里面不能出现特殊字符的。
name :没有使用约束中的唯一约束。里面可以出现特殊字符。
现在一般bean中只需设置id就可以,无需再设置name。
只有在Spring与Struts1的整合中才可能会用到用name来标识bean。
Spring和Struts1框架整合的时候(了解):
<bean name=”/user” class=”xxx.User”/>
3、bean的生命周期的属性配置(了解)
init-method :Bean被初始化的时候执行的方法
destroy-method :Bean被销毁的时候执行的方法(Bean是单例创建时,工厂关闭会执行销毁方法)
需要在bean绑定的类中写对应的init()和destroy()方法。
4、bean的作用范围的属性配置(重点)
scope属性 :bean的作用范围
- singleton :默认的值,Spring会采用单例模式创建这个对象。
- prototype :多例模式。(Struts2和Spring整合一定会用到,Action类就是多例的)
- request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
- session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
- globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于配置session。
什么是porlet环境?
例如:当你登录了百度账号,你再进入百度旗下的子网页,例如百度网盘,百度地图等,你就不需要再登录了。
5、Spring中bean的实例化几种方式(了解)
无参数构造方法的方式。
静态工厂实例化的方式。
实例工厂实例化的方式。
(1)无参构造方法的方式(默认方式)
编写Bean1类:
package com.pipi.spring.demo2;
// 无参数构造方式
public class Bean1 {
public Bean1() {
super();
System.out.println("Bean1的无参数构造方法执行了!");
}
}
编写配置:
<!-- 无参数实例化Bean对象 -->
<bean id="bean1" class="com.pipi.spring.demo2.Bean1" />
(2)静态工厂实例化的方式
编写Bean2类:
// 静态工厂方式
public class Bean2 {
}
编写Bean2的静态工厂:
package com.pipi.spring.demo2;
// Bean2的静态工厂
public class Bean2Factory {
public static Bean2 createBean2() {
System.out.println("Bean2Factory中的方法执行了!");
return new Bean2();
}
}
编写配置:
<!-- 静态工厂方式,实例化Bean对象 -->
<bean id="bean2" class="com.pipi.spring.demo2.Bean2Factory" factory-method="createBean2" />
(3)实例工厂实例化的方式
编写Bean3类:
public class Bean3 {
}
Bean3的实例工厂:
package com.pipi.spring.demo2;
// Bean3的实例工厂
public class Bean3Factory {
public Bean3 createBean3() {
System.out.println("Bean3Factory中的方法执行了!");
return new Bean3();
}
}
编写配置:
<!-- 实例工厂方式,实例化Bean对象 -->
<bean id="bean3Factory" class="com.pipi.spring.demo2.Bean3Factory" />
<bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3" />
6、Spring的属性注入的几种方式
构造方法的属性注入。
set方法的属性注入。
p名称空间的属性注入。
SpEL表达式的属性注入。
集合类型的属性注入。
(1)构造方法的方式的属性注入
编写类Car:
public class Car {
private String name;
private Double price;
// setter and getter
// 无参数构造方法,有参数构造方法,重写toString()
}
编写配置:
<!-- 构造方法方式的属性注入 -->
<bean id="car" class="com.pipi.spring.demo3.Car">
<constructor-arg name="name" value="宝马" />
<constructor-arg name="price" value="800000.0" />
</bean>
(2)set方法的方式的属性注入
set方法的属性注入:
在Car类中提供属性的set方法即可。
编写配置:
<!-- set()方法的方式的属性注入 -->
<bean id="car" class="com.pipi.spring.demo3.Car">
<property name="name" value="奔驰" />
<property name="price" value="1000000.0" />
</bean>
如果属性是对象类型:
编写车拥有者employee类:
public class Employee {
private String name;
private Car car;
// setter and getter
//无参构造,有参数构造,重写toString()
}
set方法设置对象类型的属性:用ref属性
<bean id="employee" class="com.pipi.spring.demo3.Employee">
<!-- 普通类型的属性 -->
<property name="name" value="张三" />
<!-- 对象类型的属性,name是属性名,ref是引用bean的id -->
<property name="car" ref="car" />
</bean>
当然构造方法的方式,也可以完成对象类型的属性注入:
<!-- 构造方法方式的属性注入 -->
<bean id="employee" class="com.pipi.spring.demo3.Employee">
<constructor-arg name="name" value="张三" />
<constructor-arg name="car" value="car" />
</bean>
(3)p名称空间的属性注入(Spring2.5以后)
通过引入p名称空间完成属性的注入。
写法:
普通属性,p:属性名=”值”
对象属性,p:属性名-ref=”值”
p名称空间怎么引入?
在根标签中将第一个属性值复制黏贴一下,将beans换成p,名称空间加个后缀p,变成xmlns:p。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
......
编写配置:
<!-- p名称空间的属性注入 -->
<bean id="car" class="com.pipi.spring.demo3.Car" p:name="小三轮" p:price="2000.0" />
<bean id="employee" class="com.pipi.spring.demo3.Employee" p:name="张三" p:car-ref="car" />
(4)SpEL的属性注入(Spring3.0以后)
SpEL:Spring Expression Language,Spring的表达式语言。
语法:#{SpEL表达式}
普通属性,对象类型的属性都用value,不用ref。
<!-- SpEL表达式方式的属性注入 -->
<bean id="car" class="com.pipi.spring.demo3.Car">
<property name="name" value="#{'电动车'}" />
<property name="price" value="3000" />
</bean>
<bean id="employee" class="com.pipi.spring.demo3.Employee">
<property name="name" value="#{'张三'}" />
<property name="car" value="#{car}" />
</bean>
(5)集合类型属性注入(了解)
编写Bean类:
public class CollectionBean {
private String[] array;
private List<String> list;
private Set<String> set;
private Map<String, String> map;
// setter and getter,构造方法,重写toString()
}
编写配置:
<!-- 集合类型的属性注入 -->
<bean id="collectionBean" class="com.pipi.spring.demo3.CollectionBean">
<!-- 注入数组属性 -->
<property name="array">
<list>
<value>string1</value>
<value>string2</value>
</list>
</property>
<!-- 注入List集合属性 -->
<property name="list">
<list>
<value>hello</value>
<value>world</value>
</list>
</property>
<!-- 注入Set集合属性 -->
<property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
</set>
</property>
<!-- 注入Map集合属性 -->
<property name="map">
<map>
<entry key="key1" value="value1" />
<entry key="key2" value="value1" />
</map>
</property>
</bean>
7、Spring的分模块开发的配置
(1)在加载配置文件的时候,加载多个(这样做有点麻烦)
ClassPathXmlApplicationContext()构造方法,参数为可变参数。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml", "com/pipi/spring/demo3/springDemo3.xml");
(2)在核心配置文件中引入多个配置文件,加载时只需加载核心配置文件
<import resource="com/pipi/spring/demo3/springDemo3.xml" />
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");