一、String的配置
1.XML的提示配置
首先,拷贝下图中的网址,
然后,打开Windows - - Preferences,搜索XML Catalog,点击User Specified Entries,再点击Add,
得到如下界面:在1处粘贴复制的网址,2处找到硬盘中对应的文件(本电脑的路径为:E:\Spring4.2.4\spring-framework-4.2.4.RELEASE-schema\beans),在3处选择Schema location,然后点击OK。
最后,得到如下效果:当输入左括号<时,会出现如下提示,
2.< bean > 标签的id和name配置
id:使用了约束中的唯一约束(不能重复),里面不能出现特殊的字符;
name:没有使用约束中的唯一约束(理论上不会出现重复数字,但是实际开发不能出现),里面可以出现特殊字符(比如“\”)
理解:可以认为id和name的功能是一样的,都是起一个标识的作用,不过id中不能出现特殊字符,而name可以,将下图中的id换成name完全没有问题。
3.< bean > 的生命周期配置
init-method:Bean被初始化的时候执行的方法;
destroy-method:Bean被销毁的时候执行的方法(前提:Bean是单例创建的,在工厂关闭时执行)。
Spring的单例与多例:
单例(singleton):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。
多例(prototype):对这个bean的每次请求都会创建一个新的bean实例,类似于new。
通俗理解:单例模式只创建一个对象,即new一次,而多例模式,每调用一次new一个对象。
注:Spring bean 默认是单例模式。
转自:https://www.cnblogs.com/nickup/p/9800120.html
配置代码:
配置文件中代码为:
<!-- spring的生命周期的配置 -->
<bean id = "userdao" class = "com.UserDAOImpl" init-method="setup" destroy-method="destroy"></bean>
另外,在UserDAOImpl类中需要添加setup()和destroy()方法,
public void setup() {
System.out.println("该类的对象被初始化了");
}
public void destroy() {
System.out.println("该类的对象被销毁了");
}
测试代码:
@Test
public void demo2() {
//创建spring工厂
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml");
UserDAO userdao = (UserDAO) applicationContext.getBean("userdao");
userdao.save();
applicationContext.close(); //销毁对象
}
运行结果:可见,工厂创建了UserDAOImpl类的实例对象,然后先调用了setup()方法,然后又调用了save()方法,之后在对象被销毁时,调用了destroy()方法。
4.< bean > 的作用范围的配置
scope:Bean的作用范围,singleton和prototype用的最多。
singleton:单例模式,Spring默认的,Spring会默认单例模式去创建对象;
prototype:多例模式,(在Struts2和Spring整合时一定会用到);
request:应用在Web项目中,Spring创建这个类的对象之后,将这个类对象存入request范围中;
session:应用在Web项目中,Spring创建这个类的对象之后,将这个类对象存入session范围中;
globalsession:应用在Web项目中,必须在prolet环境(举个例子,相当于登陆了QQ,则QQ音乐、QQ游戏等都有不需要登录了)下使用,如果没有这种环境,则相当于session。
举例:单例与多例模式的区别:
配置文件代码:
<!-- spring的Bean作用范围的配置 -->
<bean id = "userdao" class = "com.UserDAOImpl" scope="singleton"
init-method="setup" destroy-method="destroy"></bean>
测试代码:
@Test
public void demo2() {
//创建spring工厂
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml");
UserDAO userdao = (UserDAO) applicationContext.getBean("userdao");
System.out.println(userdao);
UserDAO userdao1 = (UserDAO) applicationContext.getBean("userdao");
System.out.println(userdao1);
System.out.println(userdao == userdao1);
applicationContext.close(); //销毁对象
}
单例测试结果:
多例测试结果:
结果分析:单例创建的对象只new了一次,所以调用两次该对象(UserDAOImpl类对象)的地址是一样的,并且userdao 和userdao 1比较结果为true,而多例创建的对象每调用一次,new一次,所以两次调用对象的地址不一样,并且返回false。
5.Spring中属性注入的方式
给属性设置值有三种方式:构造函数方式、set方法方式、接口注入的方式。
构造函数方式:
public class User{
private String name;
private String password;
public User(String name, String password){
this.name = name;
this.password = password;
}
}
set方法方式:
public class User {
private String name;
private String password;
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
}
接口注入的方式:
public interface Injection{
public void setName(String name);
}
public class User implements Injection{
private String name;
public void setName(String name){
this.name = name;
}
}
Spring支持的注入方式:构造函数方式、set方法方式
set方法方式举例(设置普通类型属性):
属性类代码:
public class Car { //属性类代码
private String name;
private Double price;
public void setName(String name) {
this.name = name;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Car [name=" + name + ", price=" + price + "]";
}
}
配置文件代码:
<!-- spring的属性注入的set方法方式配置 -->
<bean id = "car" class = "com_1.Car">
<property name="name" value = "奔驰"/>
<property name="price" value = "1000000"/>
</bean>
测试代码:
@Test
public void demo3() {
//创建spring工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml");
Car car = (Car) applicationContext.getBean("car");
System.out.println(car);
}
测试结果:
构造函数方式举例(设置普通类型属性):与set方法的主要区别为:配置文件的配置使用,另外注入方式采用构造函数方式,
配置文件代码:
<!-- spring的属性注入的构造方法方式配置 -->
<bean id = "car1" class = "com_1.Car1">
<constructor-arg name = "name" value = "宝马"/>
<constructor-arg name = "price" value = "800000"/>
</bean>
测试结果:
set方法方式举例(设置引用类型属性):
引用类型属性注入代码:
public class Employee {
private String name;
private Car1 car;
public void setName(String name) {
this.name = name;
}
public void setCar(Car1 car) {
this.car = car;
}
@Override
public String toString() {
return "emplyee [name=" + name + ", car=" + car + "]";
}
}
配置文件代码:注意,对于对象的属性注入,使用关键字ref = “a”,a为某一个类的实例对象。
<!-- spring的属性注入的set方法方式配置 -->
<bean id = "employee" class = "com_1.Employee">
<property name="name" value = "张三"/>
<property name="car" ref = "car1"/>
</bean>
测试代码:
@Test
public void demo5() {
//创建spring工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml");
Employee employee = (Employee) applicationContext.getBean("employee");
System.out.println(employee);
}
测试结果:
注:对于构造函数方式(设置引用类型属性),只需要改改配置文件和注入方式即可。
6.引入p名称空间的属性注入方式(只能替换property,即对应的类只能采用set方法注入)
p名称空间注入方式的作用是替换下图中标注的代码:
格式:
普通属性: p:属性名=“值”
对象属性: p:属性名-ref=“值”
这里,属性名表示类中创建的变量(包括普通类型和引用类型),值为要注入的值(可以为普通类型和引用类型)。
步骤:
第一步:p名称空间的引入,在配置文件中相应位置添加如下代码,
xmlns:p="http://www.springframework.org/schema/p"
第二步:先将Spring控制的Car类对象car注入属性值,然后再将Spring控制的Employee类的对象employee注入属性值。
<bean id = "car" class = "com_1.Car" p:name="宝马" p:price="800000"></bean>
<bean id="employee" class="com_1.Employee" p:name="王五" p:car-ref="car"></bean>
重要注意:
若出现如下错误:Error creating bean with name ‘employee’ defined in class path resource…,这样的错误,在进行属性注入时,要考虑是不是构造方式和set方式进行注入的时候出现前后不匹配的情况,并且p名称空间只能用于set方法方式的属性注入。
7.Spring中SpEL属性注入
格式:
value = “#{}”
这里{}里边可以是数字、字符串(字符串需要加单引号,比如’hexufeng’)、引用类型对象、其他对象的属性
测试代码:
配置文件代码:
<!-- spring的属性注入的SpEL方法方式配置 -->
<bean id = "car" class = "com_1.Car">
<property name="name" value = "#{'桑塔拉'}"/>
<property name="price" value = "#{50000}"/>
</bean>
<bean id = "employee" class = "com_1.Employee">
<property name="name" value = "#{'张三'}"/>
<property name="car" value = "#{car}"/>
</bean>
其他对象的属性值注入:
其他对象类:
public class spring_Inf {
public String getName() {
return "奔驰";
}
public double getprice() {
return 30000;
}
}
配置文件代码:
<bean id = "car" class = "com_1.Car">
<property name="name" value = "#{springInf.getName()}"/>
<property name="price" value = "#{springInf.getprice()}"/>
</bean>
运行结果:
8.Spring中集合类型的属性注入
对于类中数组的注入:
测试代码:
类代码:
public class Array {
public String arr[];
public void setArr(String[] arr) {
this.arr = arr;
}
@Override
public String toString() {
return "Array [arr=" + Arrays.toString(arr) + "]";
}
}
public class TestDemo {
@Test
public void demo6() {
//创建spring工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml");
Array arr1 = (Array) applicationContext.getBean("arr1");
System.out.print(arr1);
}
}
配置文件代码:
<bean id = "arr1" class = "com_2.Array">
<property name="arr">
<list>
<value>张三丰</value>
<value>张翠山</value>
<value>张无忌</value>
</list>
</property>
</bean>
测试结果:
对于类中集合的注入:
包括:List、Set、Map
测试代码:
类文件代码:
public class Array {
public String arr[];
public List<String> list;
public Set<String> set;
public Map<String,String> map;
public void setArr(String[] arr) {
this.arr = arr;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public String toString() {
return "Array [arr=" + Arrays.toString(arr) + ", list=" + list + ", set=" + set + ", map=" + map + "]";
}
}
public class TestDemo {
@Test
public void demo6() {
//创建spring工厂
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml");
Array arr1 = (Array) applicationContext.getBean("arr1");
System.out.print(arr1);
}
}
配置文件代码:注意List、Set、Map的配置文件中对属性注入与数组的区别
<property name="list">
<list>
<value>令狐冲</value>
<value>任盈盈</value>
<value>东方不败</value>
</list>
</property>
<property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<property name="map">
<map>
<entry key = "郭靖" value = "111"></entry>
<entry key = "黄蓉" value = "222"></entry>
<entry key = "杨过" value = "333"></entry>
</map>
</property>
</bean>
测试结果:
9.Spring中分模块配置
分为两种方式:
1.在加载配置文件的时候加载多个,
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring_first.xml","spring_first1.xml");
Array arr1 = (Array) applicationContext.getBean("arr1");
2.在一个配置文件中可引入多个配置文件,
<import resource="spring_first1.xml"/>