JAVA框架——Spring(一)IOC和DI,Spring的xml配置文件详解,Spring对象创建方式,属性注入,

一、 Spring概述

Spring是一个分层的JavaSE或一站式轻量级开源框架。Spring是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理AOP变成支持。并且提供面向切面编程,可以方便的实现程序进行权限拦截,运行监控等功能声明式事务的支持。只需要通过配置就可以完成事务的管理,而无需手动编程方便程序的测试。

二、 IOC和DI

  • IOC:控制反转,将对象的创建权以及依赖关系交给Spring创建以及注入。反转控制就是反转了对象的创建方式,从我们自己创建到给程序创建
  • DI:依赖注入。实现了IOC思想。
    其注入方式有set方法注入,构造方法注入,字段注入
    注入类型分为:
    • 值类型注入(8大基本数据类型)
    • 引用类型注入(将依赖对象注入)

三、 applicationContext和BeanFactory

  • BeanFactory接口:是Spring原始接口,针对原始接口的实现类功能较为单一。BeanFactory接口实现类的容器,特点是每次在获得对象时才创建对象
  • ApplicationContext:每次容器启动时就会创建容器中配置的所有对象,并提交更多功能。从类路径下加载配置文件:ClassPathXmlApplicationContext。或者时从硬盘绝对路径下加载配置文件:FileSystemXmlApplicationContext(“d:/xxx/yyy/zzz”)

结论:web开发中,使用applicationContext,在资源匮乏的环境下可以使用BeanFactory

四、 快速入门Spring

第一步:导包

在这里插入图片描述
下载地址:
https://maven.springframework.org/release/org/springframework/spring/
开发Spring至少需要的jar包(5+1)个。

包名说明
Spring-aop.jar开发AOP特性时需要的jar。
Spring-beans.jar处理Bean的jar。
Spring-context.jar处理Spring上下文的jar。
Spring-core.jarSpring核心jar。
Spring-expression.jarSpring表达式。
三方提供的日志jar ,commons-logging.jar日志(直接复制,加上mvn 直接下载。1.1.1)

第二步:书写一个实体类(略)

第三步:书写配置文件

<?xml version="1.0" encoding="UTF-8"?>
<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 ">
	<!-- 将User对象交给Spring容器管理 -->
	<!-- Bean元素:使用该元素描述需要spring容器管理的对象
			name属性:给被管理的对象起个名字,获得对象时根据该名称获取对象  可以重复,可以使用特殊字符
			class属性:被管理对象的完整类型
			id属性:与name属性一样,名称不重复,不能使用特殊字符
			结论:尽量使用name属性	
	 -->
	<bean name="user" class="com.aiit.bean.User"></bean>
</beans>
<!-- Bean元素:使用该元素描述需要spring容器管理的对象
		name属性:给被管理的对象起个名字,获得对象时根据该名称获取对象  可以重复,可以使用特殊字符
		class属性:被管理对象的完整类型
		id属性:与name属性一样,名称不重复,不能使用特殊字符
		结论:尽量使用name属性	
 -->

第四步:测试代码

public class Demo {
	@Test
	public void fun1() {
		//1.创建容器对象
		ApplicationContext ac   = new ClassPathXmlApplicationContext("applicationContext.xml");
		//2。向容器索取对象
		User u = (User) ac.getBean("user");
		//3.打印user对象
		System.out.println(u);
	}
}

五、 Spring的Scheme配置文件提示

找到winddows->xml的catalog

在这里插入图片描述

切换xml文件到design层

在这里插入图片描述

六、 Spring的xml配置文件详解——Bean元素

1.基本属性:name属性和class属性以及id属性

<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.aiit.bean.User"></bean>
</beans>
<!-- 将User对象交给Spring容器管理 -->
<!-- Bean元素:使用该元素描述需要spring容器管理的对象
		name属性:给被管理的对象起个名字,获得对象时根据该名称获取对象  可以重复,可以使用特殊字符
		class属性:被管理对象的完整类型
		id属性:与name属性一样,名称不重复,不能使用特殊字符
		结论:尽量使用name属性	
 -->

2.Scope属性:singleton,prototype,request,session

  • singleton:单例对象,被标识为单例的对象,在spring容器中只会存在一个实例对象

  • prototype:多例对象,每次在获取才会创建,且每次创建都会创建一个新的实例对象(如果使用Struts2必须配置该属性,因为Action每次创建都创建一个新的对象)

  • request:web环境下,对象与request生命周期一致

  • session:web环境下,对象与session生命周期一致

案例:

<bean name="user" class="com.aiit.bean.User" scope="singleton"></bean>

在这里插入图片描述

3.生命周期属性

  • 配置一个方法作为生命周期初始化方法,spring会在对象创建之后立即调用。init-method

  • 配置一个方法作为生命周期销毁方法,spring会在关闭并销毁容器中的对象之前调用,做后处理工作。destroy-method

案例:

applicationContext.xml文件

<bean name="user" class="com.aiit.bean.User" init-method="init" destroy-method="destory"></bean>

在User对象中定义方法

public class User {
	private String name;
	private Integer age;
	
	public void init() {
		System.out.println("我是创建方法");
	}
	public void destory() {
		System.out.println("我是销毁方法");
	}
}

此时我们运行测试代码,生成对象并打印

ClassPathXmlApplicationContext ac   = new ClassPathXmlApplicationContext("com/aiit/injection/applicationContext.xml");		
		User u = ac.getBean(User.class);
		System.out.println(u);
	ac.close();
			
	}

七、 Spring创建对象的方式

方式一:空参构造方式

此时我们在User对象中空参构造函数中,书写一个输出语句

public class User {
//省略getter/setter方法
	private String name;
	private Integer age;
	public User(){
		System.out.println("user对象空参构造创建对象");
	}
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<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.aiit.bean.User"></bean>
</beans>

测试代码

public class Demo {
	@Test
	public void fun1() {
		//1.创建容器对象
		ApplicationContext ac   = new ClassPathXmlApplicationContext("com/aiit/create/applicationContext.xml");
		//2。向容器索取对象
		User u = (User) ac.getBean("user");
		//3.打印user对象
		System.out.println(u);
	}
}

运行结果如下:
在这里插入图片描述

方式二:静态对象工厂

首先写一个工厂类

public class UserFactory {
	public static User  createUser() {
		System.out.println("静态工厂创建User");
		
		return new User();
	}
}

其次配置xml文件

<!-- 创建方式二:静态工厂创建
		调用工厂方法的create方法创建名为user2的的对象放入容器
	 -->
	<bean name="user2" class="com.aiit.create.UserFactory"  factory-method="createUser"></bean>

方式三:实例工厂创建

注意://不是静态方法(必须创建UserFactory对象 才能调用该方法)

public class UserFactory {
	//不是静态方法(必须创建UserFactory对象 才能调用该方法)
	public  User  createUser2() {
		System.out.println("实例工厂创建User");
		return new User();
	}
}

其次书写配置文件

<!-- 创建方式三:实例工厂创建
		调用UserFactory对象的createUser2方法创建名为user3的对象,放入容器
	 -->
	<bean name="user3" factory-bean="userFactory" factory-method="createUser2"></bean>
	<!-- 首先配置userFactory -->
	<bean name="userFactory" class="com.aiit.create.UserFactory"  ></bean>

八、 Spring属性注入

方式一:set方法注入

第一步:为了测试方便,我们书写一个Car类(省去getter/setter方法)

public class Car {
	private String name;
	private String color;
}

第二步:在User对象中进行引用

public class User {
	private String name;
	private Integer age;
	private Car car;
}

第三步:书写配置文件(根据上文显示,注入方式主要有值类型注入和引用类型注入)

<?xml version="1.0" encoding="UTF-8"?>
<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 ">
	<!-- set方式注入: -->
	<bean name="user" class="com.aiit.bean.User">
	<!-- 值类型注入:为user对象中名为name的属性注入tom作为值 -->
		<property name="name" value="tom"></property>
		<property name="age" value="18"></property>
	<!--引用类型注入:为car属性注入下方配置的car对象 -->
		<property name="car" ref="car"></property>
	</bean>
	
	<!-- 将car对象配置 到容器中 -->
	<bean name="car" class="com.aiit.injection.Car">
	 	<property name="name" value="奥迪"></property>
	 	<property name="color" value="白色"></property>
	</bean>
</beans>

第四步:书写测试

//1.创建容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("com/aiit/injection/applicationContext.xml");
				//2。向容器索取对象
				User u = (User) ac.getBean("user");
				//3.打印user对象
				System.out.println(u);
	}

打印结果:
在这里插入图片描述

方式二:构造函数注入

第一步:构造函数注入首先得有构造方法(注意这三个构造方法

public class User {
	private String name;
	private Integer age;
	private Car car;

	public User(Integer name, Car car) {
		System.out.println("User(name and car)");
		this.name = name+“”;//加入空字符串
		this.car = car;
	}

	public User(String name, Car car) {
		System.out.println("User(name and car)");
		this.name = name;
		this.car = car;
	}
	public User(Car car,String name ) {
		System.out.println("User( car and name )");
		this.name = name;
		this.car = car;
	}

注意这三个构造函数,在xml文件中如何定义到这三个构造函数

第二步:书写xml配置文件

<!-- 构造函数注入 -->
<!-- name属性:构造函数的参数名 -->
<!-- index属性:构造函数的参数索引 -->
<!-- type属性:构造函数参数的类型 -->

<!-- public User(Integer name, Car car ) -->
<bean name="user2" class="com.aiit.bean.User">
	<constructor-arg name="name" value="1" index="0" type="java.lang.Integer"></constructor-arg>
	<constructor-arg name="car" ref="car" index="1"></constructor-arg>
</bean>
	<!-- public User(Car car,String name ) -->
<bean name="user3" class="com.aiit.bean.User">
	<constructor-arg name="name" value="张三" index="1" ></constructor-arg>
	<constructor-arg name="car" ref="car" index="0"></constructor-arg>
</bean>
  • 如果我们想要访问,是public User(Car car,String name ) 的构造方法,那么我们会把name的index设置为1,car的index设置为0

  • 如果我们想要访问,是public User(Integer name, Car car)的构造方法,那么我们会把name的type设置为type=“java.lang.Integer”

效果如下:
在这里插入图片描述

方式三:p名称空间注入

<!-- p名称空间注入,本质还是set方法,简化property
	1.导入名称空间 xmlns:p="http://www.springframework.org/schema/p" 
	2.使用p:属性,完成注入
		——值类型:p:属性名="值"
		——对象属性:p:属性名 -ref="bean名称"
 -->
<bean name="user3" class="com.aiit.bean.User" p:name="jack" p:age="20" p:car-ref="car">	</bean>
<!-- p名称空间注入,本质还是set方法,简化property
1.导入名称空间 xmlns:p="http://www.springframework.org/schema/p" 
2.使用p:属性,完成注入
	——值类型:p:属性名="值"
	——对象属性:p:属性名 -ref="bean名称" 
-->

方式四:spel名注入

<!-- spel名注入,本质还是set方法,简化property -->
<!-- spel注入:spring Expression Language spring -->
<bean name="user4" class="com.aiit.bean.User">
<property name="name" value="#{user.name}"></property>
<property name="age" value="#{user3.age}"></property>
<!-- 引用情况 spel本身不支持 -->
<property name="age" ref="car"></property>
</bean>

九、 复杂类型注入

先创建一个集合bean类

public class CollectionBean {
	private Object[] arr;// 数组类型注入
	private List list;//List/set类型注入
	private Map  map;//map类型注入
	private Properties prop;//properties类型注入
}

数组注入

<!-- array注入 -->
<bean name="collectionBean" class="com.aiit.injection.CollectionBean">
	<!-- 如果数组中只准备注入一个值 -->
	<property name="arr" value="tom"></property>
	<!-- 数组中注入多个值,多个元素注入 -->
	<property name="arr">
		<array>
			<value>timi</value>
			<value>jeryas</value>
			<!-- 存放对象 -->
			<ref bean="user4"/>
		</array>
	</property></bean>

集合注入

<!-- list注入 -->
	<!-- 如果集合中只准备注入一个值 -->
	<property name="list" value="123"></property>
	<!-- 集合中注入多个值,多个元素注入 -->
	<property name="list" >
		<list>
			<value>123</value>
			<value>345</value>
			<!-- 存放对象 -->
			<ref bean="user3"/>
		</list>
	</property>

map集合注入

<!-- map类型注入 -->
	<property name="map" >
		<map>
			<entry key="url" value="jdbc:mysql:///"></entry>
			<!-- 引入对象 键为字符串,值为对象-->
			<entry key="user" value-ref="user4"></entry>
			<!-- 引入对象 键为对象,值为字符串-->
			<entry key-ref="user4" value="user"></entry>
		</map>
	</property>

properties注入

<!-- properties类型注入 -->
	<property name="prop" >
		<props>
			<prop key="url">jdbc:mysql:///</prop>
			<prop key="root">root</prop>
		</props>
	</property>01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值