spring中的IOC说明
-
什么是IOC?
- 控制反转,把对象创建和对象之间的调用过程交给spring进行管理,为了降低耦合度
-
两种IOC接口
- BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
- ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用,加载配置文件时候就会把在配置文件对象进行创建。常用。
-
创建ApplicationContext接口实例通常采用ClassPathXmlApplicationContext创建
//初始化Spring容器,加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml"); //2、通过容器获取userDao实例 UserDao userDao = (UserDao) applicationContext.getBean("userDao");
-
spring配置文件的编写
// Spring文件创建Bean <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--让指定类配置给Spring,让Spring创建其对象的实例--> <bean id = "userDao" class="com.test.springTest.UserDaoImpl"/> </beans>
-
依赖注入
- DI(依赖注入)与控制反转(IOC)的具体实现,实现IOC思想需要DI做支持,就是在spring这个容器中,你需要将一些类交给spring容器进行管理,然后在你需要的时候,不是自己去定义,而是直接向spring容器索取,当spring容器知道你的需求之后,就会去它所管理的组件中进行查找,然后直接给你所需要的组件。依赖:bean对像的创建依赖与容器,注入:bean对象的所有属性,由容器来注入。
-
依赖注入的两种方式:set注入,构造方法注入
参考:https://blog.csdn.net/cold___play/article/details/100059134
-
构造函数注入
- user的有参构造
package com.test.bean; public class User { private String name; private Integer age; private Car car; public User(String name, Car car) { System.out.println("User(String name, Car car)!!"); this.name = name; this.car = car; } public User(Car car,String name) { System.out.println("User(Car car,String name)!!"); this.name = name; this.car = car; } public User(Integer name, Car car) { System.out.println("User(Integer name, Car car)!!"); this.name = name+""; this.car = car; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", car=" + car + "]"; } }
- applicationContext.xml配置:index:用于确定参数的位置,type:用于确定参数的类型,这两个属性可以完全确定一个构造函数。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- 将car对象配置到容器中 --> <bean name="car" class="com.test.bean.Car" > <property name="name" value="保时捷" ></property> <property name="color" value="红色" ></property> </bean> <!-- 构造函数注入 --> <bean name="user2" class="com.test.bean.User" > <!-- name属性: 构造函数的参数名 index属性: 构造函数的参数索引 type属性: 构造函数的参数类型 --> <constructor-arg name="name" value="24" index="0" type="java.lang.Integer"></constructor-arg> <constructor-arg name="car" ref="car" index="1" ></constructor-arg> </bean> </beans>
-
set方法注入
-
每一个实体类为其属性写上相应的set,get方法
-
applicationContext.xml中进行配置:
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" 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.test.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="pers.zhang.bean.Car" > <property name="name" value="保时捷" ></property> <property name="color" value="红色" ></property> </bean> </beans>
-
复杂类型的注入
- 创建一个CollectionBean类:
package com.test.bean; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Properties; public class CollectionBean { private Object[] arr;//数组类型注入 private List list;//list/set 类型注入 private Map map;//map类型注入 private Properties prop;//properties类型注入 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 getProp() { return prop; } public void setProp(Properties prop) { this.prop = prop; } @Override public String toString() { return "CollectionBean [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", prop=" + prop + "]"; } }
- applicationContext.xml中进行配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" 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.test.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> <bean name="car" class="pers.zhang.bean.Car" > <property name="name" value="保时捷" ></property> <property name="color" value="红色" ></property> </bean> <!-- 复杂类型注入 --> <bean name="cb" class="com.test.CollectionBean" > <!-- 数组类型注入 --> <property name="arr"> <!-- 元素顺序与注入顺序一致 --> <array> <value>tom</value> <value>jerry</value> <ref bean="user" /> </array> </property> </bean> <bean name="cb" class="com.test.CollectionBean" > <!-- list类型注入 --> <property name="list" > <list> <value>jack</value> <value>rose</value> <ref bean="user" /> </list> </property> </bean> <bean name="cb" class="com.test.CollectionBean" > <!-- map类型注入 --> <property name="map" > <map> <!-- 键为字符串,值为字符串 --> <entry key="url" value="jdbc:mysql ></entry> <!-- 键为字符串,值为对象 --> <entry key="user" value-ref="user" ></entry> <!-- 键为对象,值为对象 --> <entry key-ref="user2" value-ref="user2" ></entry> </map> </property> </bean> <bean name="cb" class="com.test.CollectionBean" > <!-- prperties 类型注入 --> <property name="prop" > <props> <prop key="driverClass">com.jdbc.mysql.Driver</prop> <prop key="userName">root</prop> <prop key="password">1234</prop> </props> </property> </bean> </beans>
-
扩展注入方式
- p命名空间注入:走set方法
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- 将car对象配置到容器中 --> <bean name="car" class="com.test.bean.Car" > <property name="name" value="保时捷" ></property> <property name="color" value="红色" ></property> </bean> <!-- p名称空间注入, 走set方法 1.导入P名称空间 xmlns:p="http://www.springframework.org/schema/p" 2.使用p:属性完成注入 |-值类型: p:属性名="值" |-对象类型: p:属性名-ref="bean名称" --> <bean name="user" class="com.test.bean.User" p:name="Jack" p:age="20" p:car-ref="car" ></bean> </beans>
-
c命名空间注入:走构造器方法
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- 将car对象配置到容器中 --> <bean name="car" class="com.test.bean.Car" > <property name="name" value="保时捷" ></property> <property name="color" value="红色" ></property> </bean> <!-- c名称空间注入, 走构造方法,要给定有参和无参的构造方法 导入c名称空间 xmlns:c="http://www.springframework.org/schema/c" --> <bean name="user" class="com.test.bean.User" c:name="Jack" c:age="20" ></bean> </beans>
-