2.Spring的配置

一、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"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章