spring--配置详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccnuacmhdu/article/details/84990753

本博文参考传智播客、黑马程序员视频讲座

IoC(控制反转)

Inverse of Control
控制反转,把本来由程序员创建对象和依赖注入的工作转交给spring完成。

DI(依赖注入)

Dependency Injection

注入方式:set方法注入+构造方法注入+字段注入(相当于类成员是public,可以直接调用赋值)

注入类型:值类型注入(8种基本数据类型)+引用类型注入

spring容器

在这里插入图片描述

BeanFactory接口(每次获取对象时才会创建对象)
ApplicationContext接口:(每次容器启动时就会创建容器中配置的所有对象),一般从类路径下加载配置文件ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");也可以从硬盘绝对路径加载配置文件ApplicationContext ac = new FileSystemXmlApplicationContext("硬盘上的绝对路径");

由于BeanFactory接口是在获取对象的时候才创建对象,而ApplicationContext在容器启动的时候就把配置文件中配置的对象都创建出来了,那就比较耗费资源了,又由于硬件发展的比较好了,一般直接用ApplicationContext容器,因为其功能比原始的BeanFactory强大的多。除非是硬件资源非常匮乏的情况下,才会考虑用BeanFactory。

spring配置详解—Bean元素

<!-- 把User对象交给spring容器管理 -->
<!-- Bean元素:spring容器所管理的对象的信息
			 class属性:被管理对象的全限定名
			 name属性:被管理对象的名字,可重复,可使用特殊字符,(建议用name而不是id)
			 id属性:与name属性类似,不可重复,不可使用特殊字符
 -->
<bean name="user" class="cn.ccnuacmhdu.bean.User"></bean>

Bean的scope属性

常用的两个值:singleton(默认)和prototype

singleton:在spring容器中只有一个对象实例
prototype:多例,每次获得都会创建一个新的实例

在这里插入图片描述
在这里插入图片描述

另外还有request属性值和session属性值,在web环境下,对象与request或session生命周期一致。

Bean的生命周期属性

init-method方法:spring在创建对象之后立即调用
destroy-method方法:spring在销毁所有容器对象之前调用

<bean name="user" class="cn.ccnuacmhdu.bean.User" init-method="init" destroy-method="destroy"></bean>

在这里插入图片描述

在这里插入图片描述

spring配置详解—创建对象的方式

工程依旧使用原来的工程:https://blog.csdn.net/ccnuacmhdu/article/details/84988785

空参构造

为User对象提供空参构造方法,证明spring默认使用空参构造创建对象。

public User() {
		System.out.println("空参构造方法。。。");
	}

在这里插入图片描述

其他方式还有静态工厂方式(调用静态工厂的某个静态方法创建对象)和实例工厂模式(调用实例工厂中的某个非静态方法创建对象),了解下即可,具体配置方式略。

spring配置详解—模块化配置

主配置文件中引入其他spring配置文件:
<import resource="去掉src之前的路径后剩下的路径/applicationContext.xml"/>

spring配置详解—属性注入方式

set方法注入

<bean name="user" class="cn.ccnuacmhdu.bean.User">
		<!-- 为User对象的属性注入值 -->
		<property name="name" value="Tom"></property>
		<property name="age" value="19"></property>
	</bean>

在这里插入图片描述

构造方法注入

提供构造方法:

public User(String name, Car car) {
		super();
		this.name = name;
		this.car = car;
	}

书写配置文件:

<bean name="car" class="cn.ccnuacmhdu.bean.Car">
		<property name="name" value="大众"></property>
		<property name="price" value="120"></property>
	</bean>
	
	<!-- 构造方法注入  -->
	<bean name="user2" class="cn.ccnuacmhdu.bean.User">
		<constructor-arg name="name" value="Lucy"></constructor-arg>
		<constructor-arg name="car" ref="car"></constructor-arg>
	</bean>

注意:如果配置文件中还存在刚才的user配置,并且user仅仅提供了一个构造方法,没有提供空参构造。由于只要在配置文件中配置了user,spring容器就会去创建他,必定要通过空参构造,但是找不到空参构造,报错!!!

变态情况1

user有下面两个构造方法

public User(String name, Car car) {
		super();
		this.name = name;
		this.car = car;
	}
	public User(Car car, String name) {
		super();
		this.name = name;
		this.car = car;
	}

用index属性指定形参顺序,确定使用哪个构造方法:
在这里插入图片描述

变态情况2

在这里插入图片描述
指定每个参数的类型:
在这里插入图片描述

复杂类型注入

package cn.ccnuacmhdu.bean;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class Collection {
	private Object[] arr;
	private List list;
	private Map map;
	private Properties props;
	public Object[] getArr() {
		return arr;
	}
	public void setArr(Object[] arr) {
		this.arr = arr;
	}
	public List getList() {
		return list;
	}
	public void setList(List list) {
		this.list = list;
	}
	public Map getMap() {
		return map;
	}
	public void setMap(Map map) {
		this.map = map;
	}
	public Properties getProps() {
		return props;
	}
	public void setProps(Properties props) {
		this.props = props;
	}
	@Override
	public String toString() {
		return "Collection [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", props=" + props + "]";
	}
	
}

<!-- 复杂类型注入 -->
	<!-- 数组 -->
	<bean name="collection" class="cn.ccnuacmhdu.bean.Collection">
		<!-- 数组只有一个元素的时候可以用下面这一句代码 -->
		<!-- <property name="arr" value="Tom"></property> -->

		<!-- 多个元素注入 -->
		<property name="arr">
			<array>
				<value>lucy</value>
				<value>jack</value>
				<ref bean="car" />
			</array>
		</property>
		
		<!-- list只有一个元素的时候可以用下面这一句代码 -->
		<!-- <property name="list" value="jack"></property> -->
		
		<property name="list">
			<list>
				<value>lucy</value>
				<value>jack</value>
				<ref bean="car" />
			</list>
		</property>
		
		<property name="map">
			<map>
				<entry key="key1" value="value1"></entry>
				<entry key="key1" value-ref="car"></entry>
				<entry key-ref="car" value-ref="car"></entry>
			</map>
		</property>
		
		<property name="props">
			<props>
				<prop key="name">name</prop>
				<prop key="password">password</prop>
			</props>
		</property>
		
	</bean>

在这里插入图片描述
另外还有p名称空间注入和spel方式注入,具体略。

注解配置代替XML

略。

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/84990753