spring中的IOC

一个努力向上爬的搬运工 2020年04月03日 102次浏览

Spring中的IOC简介和DI简介:

IOC:

控制反转,将创建对象、属性值从new、setxxx 翻转了为从springIOC容器getBean();

DI :

依赖注入:IOC也可以称为DI,将属性值注入给属性,将属性注入bean,将bean注入给SpringIOC容器

无论要什么对象,都可以直接去SpringIOC容器中获取,而不需要自己new,setxxx,所以SpringIOC分为两步:

1、先给SpringIOC存放对象并赋值,

2、再拿

IOC赋值:如果是简单类型(8个基本类型+String) 就用value,
如果是对象类型,就用ref="需要引用的id值",因此实现了对象与对象之间的依赖关系

依赖注入的三种方式

1.set方式注入:例如setxxx()

赋值:默认使用的是set方法();

依赖注入底层是通过反射实现的

例如:

Person类

package cn.delingw.Connection;
public class Person {
	// 名字
	private String name;
	// 年龄
	private int age;
	private Car car;

	public Person() {

	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Car getCar() {
		return car;
	}

	public void setCar(Car car) {
		this.car = car;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
	}

}

Car类

package cn.delingw.Connection;
public class Car {
	// 名字
	private String name;
	// 地点
	private String corp;
	// 价格
	private double price;
	// 速度
	private int speed;

	public Car() {

	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getCorp() {
		return corp;
	}

	public void setCorp(String corp) {
		this.corp = corp;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public int getSpeed() {
		return speed;
	}

	public void setSpeed(int speed) {
		this.speed = speed;
	}

	@Override
	public String toString() {
		return "Car [name=" + name + ", corp=" + corp + ", price=" + price + ", speed=" + speed + "]";
	}

}

a.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
	<!-- 声明Car对象 -->
	<bean id="car" class="cn.delingw.Connection.Car">
		<!-- set方法注入 -->
		<property name="name" value="大众"></property>
		<property name="corp" value="四川"></property>
		<property name="price" value="150000"></property>
		<property name="speed" value="1300"></property>
	</bean>
	<!-- 声明Person对象 -->
	<bean id="p" class="cn.delingw.Connection.Person">
		<!-- set方法注入 -->
		<property name="name" value="张三"></property>
		<property name="age" value="19"></property>
		<!-- 注入对象则需要ref,而不是再用value,value是用来普通值的 -->
		<property name="car" ref="car"></property>
	</bean>
</beans>

测试

package cn.delingw.Test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.delingw.Connection.Car;
import cn.delingw.Connection.Person;

public class Test {
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "a.xml" });
		Person p = (Person) context.getBean("p");
		System.out.println(p);

	}

}

2.构造器注入: 通过构造方法赋值,则需要在Person类中添加构造方法,修改配置文件a.xml

<constructor-arg value="name" name="name" index="0" type="String"></constructor-arg>

如果<constructor-arg>的顺序与构造方法参数的顺序不一致,则需要用name和type和index来指定

例如:

<bean id="car" class="cn.delingw.Connection.Car">
	<constructor-arg value="大众"></constructor-arg>
	<constructor-arg value="上海"></constructor-arg>
	<constructor-arg value="130000"></constructor-arg>
	<constructor-arg value="113131"></constructor-arg>
	
</bean>

3、通过p命名空间注入

P:属性名="属性值"
引用类型(除String之外)
p:属性名-ref="引用的id"
多个p赋值的时候,需要有空格

顺序无所谓

在<beans>中添加
引入p命名空间
xmlns:p="http://www.springframework.org/schema/p"

然后

<bean id="car" class="cn.delingw.Connection.Car" p:name="大众"
	p:corp="四川" p:price="18" p:speed="121145">
</bean>

注意:

IOC赋值:如果是简单类型(8个基本类型+String) 就用value,
如果是对象类型,就用ref="需要引用的id值",因此实现了对象与对象之间的依赖关系

集合的使用

需要修改person类和xml配置文件

package cn.delingw.Connection;

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

public class Person {
	// 名字
	private String name;
	// 年龄
	private int age;
	private Car car;
	private List<Car> cars;
	private Map<Car, String> map;
	private Set<Car> set;
	private Properties peProperties;

	public Person() {

	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Car getCar() {
		return car;
	}

	public void setCar(Car car) {
		this.car = car;
	}

	public List<Car> getCars() {
		return cars;
	}

	public void setCars(List<Car> cars) {
		this.cars = cars;
	}

	public Map<Car, String> getMap() {
		return map;
	}

	public void setMap(Map<Car, String> map) {
		this.map = map;
	}

	public Set<Car> getSet() {
		return set;
	}

	public void setSet(Set<Car> set) {
		this.set = set;
	}

	public Properties getPeProperties() {
		return peProperties;
	}

	public void setPeProperties(Properties peProperties) {
		this.peProperties = peProperties;
	}
	//重写toSting方法
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", car=" + car + ", cars=" + cars + ", map=" + map + ", set="
				+ set + ", peProperties=" + peProperties + "]";
	}

}

a.xml

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
	<!-- 声明Car对象 -->
	<bean id="car" class="cn.delingw.Connection.Car">
		<!-- set方法注入 -->
		<property name="name" value="大众"></property>
		<property name="corp" value="四川"></property>
		<property name="price" value="150000"></property>
		<property name="speed" value="1300"></property>
	</bean>
	<!-- 声明Car2对象 -->
	<bean id="car2" class="cn.delingw.Connection.Car">
		<!-- set方法注入 -->
		<property name="name" value="大众"></property>
		<property name="corp" value="成都"></property>
		<property name="price" value="150000"></property>
		<property name="speed" value="1300"></property>
	</bean>
	<!-- 声明Person对象 -->
	<bean id="p" class="cn.delingw.Connection.Person">
		<!-- set方法注入 -->
		<property name="name" value="张三"></property>
		<property name="age" value="19"></property>
		<!-- 注入对象则需要ref,而不是再用value,value是用来普通值的 -->
		<property name="car" ref="car"></property>
		<!-- list集合注入 -->
		<property name="cars">
			<list>
				<!-- 这里的list集合里面是一个car对象,所以需要用ref元素,如果是普通类型则用value -->
				<!-- 例如: <value>car</value> <value>car2</value> -->
				<ref bean="car" />
				<ref bean="car2" />
			</list>
		</property>
		<!-- Map集合注入 -->
		<property name="map">
			<map>
				<!-- 我们知道map底层是由entry数组组成的 -->
				<!-- 这里的Map集合里面key是一个car对象,所以需要用ref元素,如果是普通类型则用value -->
				<entry key-ref="car" value="小车"></entry>
			</map>

		</property>
		<!-- set集合注入 -->
		<property name="set">
			<set>
				<!-- 这里的set集合里面是一个car对象,所以需要用ref元素,如果是普通类型则用value -->
				<!-- 例如: <value>car</value> <value>car2</value> -->
				<ref bean="car" />
				<ref bean="car2" />
			</set>
		</property>
		<!-- peProperties注入 -->
		<property name="peProperties">
			<props>
				<prop key="java">java真好!</prop>
				<prop key="python">python真好!</prop>
			</props>
		</property>
	</bean>

</beans>

是不是觉得这样很代码对吧,我们还可以用单例解决

首先先导入util命名标签

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
	<!-- 声明Car对象 -->
	<bean id="car" class="cn.delingw.Connection.Car">
		<!-- set方法注入 -->
		<property name="name" value="大众"></property>
		<property name="corp" value="四川"></property>
		<property name="price" value="150000"></property>
		<property name="speed" value="1300"></property>
	</bean>
	<!-- 声明Car2对象 -->
	<bean id="car2" class="cn.delingw.Connection.Car">
		<!-- set方法注入 -->
		<property name="name" value="大众"></property>
		<property name="corp" value="成都"></property>
		<property name="price" value="150000"></property>
		<property name="speed" value="1300"></property>
	</bean>
	<!-- list集合 -->
	<util:list id="cars">
		<ref bean="car" />
		<ref bean="car2" />
	</util:list>
	<!-- map -->
	<util:map id="map">
		<entry key-ref="car" value="java真好玩"></entry>
	</util:map>
	<!-- set -->
	<util:set id="set">
		<ref bean="car" />
		<ref bean="car2" />
	</util:set>
	<!-- peProperties -->
	<util:properties id="peProperties">
		<prop key="java">java真好!</prop>
		<prop key="python">python真好!</prop>
	</util:properties>

	<!-- 声明Person对象 -->
	<bean id="p" class="cn.delingw.Connection.Person">
		<property name="name" value="张三"></property>
		<property name="age" value="19"></property>
		<property name="car" ref="car"></property>
		<property name="cars" ref="cars"></property>
		<property name="map" ref="map"></property>
		<property name="set" ref="set"></property>
		<property name="peProperties" ref="peProperties"></property>

	</bean>

</beans>

是不是这样就简便太多!