1. 导入Jar包


3.0.2是spring与市面上其他工具类的整合.

根据所需要实现的功能,导入相对应的Jar包.基础功能就导入beans,core,context,expression.

除此之外还需要导入日志包,否则运行会报错



2. 导入约束,书写配置文件.(Spring的配置文件的约束文件是Schema)
  • 文件的位置:建议放到src下,配置文件的名字建议applicationContext.xml
  • 导入约束:
  1. 选择约束文件的路径



  1. 在创建了xml文件的情况下,添加约束.

打开视图



  1. 引入约束




  • 书写配置文件,将对象注册到配置文件中
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
  <bean name="User" class="com.itheima.pojo.User"></bean>
</beans>
复制代码
  • 测试配置成功案例
public class Demo {
	@Test
	public void fun (){
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		User u = (User) ac.getBean("User");
		System.out.println(u);
	}
}
复制代码

配置详解
  1. Bean 元素:使用该元素描述需要被spring管理的对象

属性

详解

class

被管理对象的完整类名

name

给被管理的对象起一个名字.获取对象的时候根据这个名称获取对象.(==可以重复,可以使用特殊字符,但不推荐==)

id

与name属性的作用一样.(==不能重复,不能使用特殊字符==)

==结论:尽量使用name 属性==

  1. scope 属性:


详解

singleton

表示该对象为单例对象,在spring容器中只会存在一个实例

prototype

表示该对象为多例对象.每次在spring容器中获取该对象时都会创建一个新的对象.

request

表示该对象的生命周期与request一样,一次请求结束后就会从spring容器中移除

session

表示该对象的生命周期与session一样,会话结束后就会从spring容器中移除

注意:scope的默认值为singleton,在整合struts2时,action对象的scope的值就需要设置为prototype.因为action对象必须是多例的

  1. init&destory(初始化与销毁)

在容器启动的时候会执行对象的初始化方法,因为容器启动的时候会创建配置文件中的所有对象.当容器关闭的时候,会执行对象的销毁方法.

注意:ApplicationContext接口是没有关闭方法的.子接口ClassPathApplicationContext才有.

//实体类
public void init (){
		System.out.println("user对象被初始化了");
	}
	
	public void destory (){
		System.out.println("user对象被销毁了");
	}
	
//配置文件中	
<bean name="user" class="com.demo.pojo.User" init-method="init" destroy-method="destory"></bean>

//执行
@Test
	public void fun2() {
		// 创建容器对象
		ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		// 从容器中获取User对象
		User u = (User) ac.getBean("user");
		System.out.println(u);
		ac.close();
	}
复制代码
  1. 模块化

随着项目对象会越来越多,因此配置需要分模块,一个配置文件中可以引入其他配置文件

<import resource=""/>
复制代码

Spring(创建对象的三种方式)
1. 空参构造方式

因为我们使用的接口是applicationContext,因此配置文件中的对象会在容器启动的时候全部创建.

@Test
	public void fun1 (){
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	}
	
	<bean name="user" class="com.itheima.pojo.User"></bean>
复制代码
2. 静态工厂

我们希望由我们开发人员自己来创建对象,然后把对象交给spring容器来管理.当我们需要使用的时候也是从容器中获取

public static User createUser (){
		
		System.out.println("User对象被创建了");
		
		return new User ();
	}


<bean name="user2" 
	class="com.itheima.test.UserFactory" 
	factory-method="createUser"></bean>
复制代码
3. 实例工厂

由于方法不是静态,不能通过类名进行调用,因为我们必须创建对象才能进行调用方法,把所需要的对象创建出来.

@Test
public void fun1 (){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
User u = (User) ac.getBean("user3");

}


public User createUser2 (){

System.out.println("User对象被动态创建了");

return  new User ();
}

//配置文件
<bean name="userFactory" class="com.demo.test.UserFactory"></bean>
	<bean name="user3" 
	factory-method="createUser2"
	factory-bean="userFactory">
	</bean>
复制代码

Spring属性注入
  1. set方式注入
  • 属性注入
<bean name="user" class="com.demo.pojo.User">
     <property name="name" value="tom"></property>
     <property name="age" value="18"></property>
     </bean>
复制代码
  • 对象注入
<bean name="user" class="com.demo.pojo.User">
     <property name="name" value="tom"></property>
     <property name="age" value="18"></property>
     <property name="Car" ref="car"></property>
 </bean>
     
     <bean name="car" class="com.demo.pojo.Car">
      <property name="name" value="AE86"></property>
      <property name="color" value="白色"></property>
     </bean>

复制代码

注意:值类型使用value属性,引用类型使用ref属性.

  1. 构造函数注入

constructor-arg元素

属性

详解

name

对象的属性名

value


ref

引用什么对象

index

构造函数的参数列表的顺序

type

构造函数的参数类型.

<bean name="user" class="com.demo.pojo.User">
        <constructor-arg name="name" value="666" index="1" type="java.lang.Integer"></constructor-arg>
        <constructor-arg name="car" ref="car" index="0"></constructor-arg>
     </bean>
     
     //构造方法
     public User(String name, Car car) {
		this.name = name;
		this.car = car;
	}

	public User(Car car, Integer name) {
		this.name = name+"";
		this.car = car;
	}
复制代码
  1. p名称空间注入

前置工作:需要导入p命名空间

在根元素中添加以下的这段代码

xmlns:p="http://www.springframework.org/schema/p"  
复制代码

其实就是set注入方法

<bean name="user2" class="com.demo.pojo.User" p:name="tom"
		p:age="18" p:car-ref="car"></bean>
复制代码
  1. spel 注入
<!-- spring expression language -->
	<bean name="user3" class="com.demo.pojo.User">
		<property name="name" value="#{user.name}"></property>
		<property name="age" value="#{user1.age}"></property>
		<property name="car" ref="car"></property>
	</bean>
复制代码

注意:引用类型不能使用spel,跟之前的引用类型用法一样

  1. 复杂类型注入

数组,集合,Map集合,Properties

注意:数据与集合当值只有一个的时候,值可以写在property元素中的value属性中

<property name="arr" value="tom"></property>
 <property name="list" value="jerry"></property>
复制代码
<bean name="cb" class="com.demo.pojo.CollectionBean">
	    <property name="arr">
	       <array>
	           <value>tom</value>
	           <value>jerry</value>
	           <ref bean="car"/>
	       </array>
	    </property>
	    
	    <property name="list">
	       <list>
	         <value>#{user.name}</value>
	         <value>#{user.age}</value>
	         <ref bean="car"/>
	       </list>
	    </property>
	    
	    <property name="map">
	      <map>
	         <entry key="name" value="mama"></entry>
	         <entry key="uu" value-ref="user2"></entry>
	         <entry key-ref="user2" value-ref="user3"></entry>
	      </map>
	    </property>
	    
	    <property name="prop">
	       <props>
	           <prop key="name">tom</prop>
	           <prop key="age">18</prop>
	       </props>
	    </property>
	</bean>
复制代码