您现在的位置是:网站首页>javajava

spring中的IOC

deling2019年7月11日java93人已围观

简介Spring中的IOC简介和DI简介:

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>

是不是这样就简便太多!


Tags: spring

很赞哦! (6)

留言

来说点儿什么吧...

您的姓名: *

选择头像: *

留言内容:

    2019年2月25日 13:35嘿嘿

    2019年2月26日 13:20ok

    可以可以!

    2019年3月18日 09:2311

    1

    2019年3月28日 09:24www.ikeguang.com

    可以可以

    2019年5月29日 18:47qwe

    666

    2019年5月30日 16:52BlankYk

    he,tui~

    2019年5月30日 17:04123

    321

    2019年6月26日 10:02周树人

    厉害厉害

    2019年6月26日 10:34sdlakrj

    sdaag

    2019年6月29日 15:31sdagafdbaf

    dgafdgdfh

    站长回复:你这是什么什么高级语言,我表示看不懂哈哈

    2019年7月6日 16:37啦啦

    写的真好!谢谢博主

    站长回复:谢谢!

    2019年8月14日 12:35傻傻

    厉害 小林