1、什么是IoC
- IoC—Inverse of Control,控制反转,将对象的创建权力反转给Spring框架
- 控制反转是为了降低程序耦合度,提高程序扩展力,达到OCP原则,达到DIP原则
- OCP开闭原则:在软件开发过程中应当对扩展开放,对修改关闭
-
DIP依赖倒置原则:主要倡导面向抽象编程,面向接口编程,不要面向具体编程
- 所谓的反转,是指?
- 将对象的创建权利交出去,交给第三方容器负责
- 将对象和对象之间关系的维护权交出去,交给第三方容器负责
- 如何实现IoC
-
DI(Dependency Injection):依赖注入
-
2、DI——依赖注入
-
Spring是通过依赖注入的方式来完成Bean管理的(Bean管理说的是:Bean对象的创建,以及Bean对象中属性的赋值或者叫做Bean对象之间关系的维护)
-
什么是DI
-
依赖指的是对象和对象之间的关联关系
-
注入指的是一种数据传递行为,通过注入行为来让对象和对象产生关系
-
- DI的常见方式
- set方法注入
- 构造方法注入
- set方法注入:
- set注入,显然,是基于set方法来完成的,底层会通过反射机制调用属性对应的set方法然后给属性赋值。这种方式要求属性必须对外提供set方法。
- 请看下例:
-
//持久层 public class OrderDaoImpl implements OrderDao {@Overridepublic void saveOrder() {System.out.println("持久层:保存订单...");} } //业务逻辑层 public class OrderServiceImpl implements OrderService {// 编写成员属性,一定需要提供该属性的set方法private OrderDao orderDao;// 一定需要提供该属性的set方法,IOC容器底层就通过属性的set方法方式注入值public void setOrderDao(OrderDao orderDao) {this.orderDao = orderDao;}// 消息private String msg;// 年龄private int age;public void setMsg(String msg) {this.msg = msg;}public void setAge(int age) {this.age = age;}@Overridepublic void saveOrder() {System.out.println("业务层:保存订单..."+msg+" - "+age);// 调用orderDao.saveOrder();} } <!--spring的配置文件--> <!--DI:依赖注入--> <bean id="os" class="cn.tx.service.OrderServiceImpl"><property name="orderDao" ref="od" /><property name="msg" value="你好" /><property name="age" value="30" /> </bean> <bean id="od" class="cn.tx.dao.OrderDaoImpl"></bean>
- 实现原理:
- 通过property标签获取到属性名:orderDao、msg、age
- property标签的name是属性名。
- ref是要注入的bean对象的id,是引用
- 通过属性名推断出set方法名:setOrderDao、setMsg、setAge(这里读者可以去测试一下,当我们把set方法注释掉后会报错,指出没有setter方法)
- 通过反射机制调用setOrderDao()、setMsg()、setAge()方法给属性赋值
- 通过property标签获取到属性名:orderDao、msg、age
-
- 构造方法注入
-
通过调用构造方法来给属性赋值。
-
如下例:
-
public class Car {// 名称private String cname;// 金额private Double money;public Car(String cname, Double money) {this.cname = cname;this.money = money;}@Overridepublic String toString() {return "Car{" +"cname='" + cname + '\'' +", money=" + money +'}';} }//核心配置文件 <bean id="car" class="cn.tx.demo2.Car"><constructor-arg name="cname" value="大奔" /><constructor-arg name="money" value="400000" /></bean>
-
-
3、数组,集合(List,Set,Map),Properties等的注入
这里直接上代码,首先我们先创建一个CollectionBean的对象,用来完成该案例
public class CollectionBean {// 数组private String [] strs;public void setStrs(String[] strs) {this.strs = strs;}private List<String> list;public void setList(List<String> list) {this.list = list;}private Map<String,String> map;public void setMap(Map<String, String> map) {this.map = map;}private Properties properties;public void setProperties(Properties properties) {this.properties = properties;}@Overridepublic String toString() {return "CollectionBean{" +"strs=" + Arrays.toString(strs) +", list=" + list +", map=" + map +", properties=" + properties +'}';}
}
spring的配置文件
<!--给集合属性注入值--><bean id="collectionBean" class="cn.tx.demo3.CollectionBean"><property name="strs"><array><value>美美</value><value>小凤</value></array></property><property name="list"><list><value>熊大</value><value>熊二</value></list></property><property name="map"><map><entry key="aaa" value="老王"/><entry key="bbb" value="小王"/></map></property><property name="properties"><props><prop key="username">root</prop><prop key="password">123456</prop></props></property></bean>
4、关于Spring的配置文件
-
Spring引入外部属性配置文件
-
我们这里以jdbc的信息为例,在类路径下新建jdbc.properties文件
-
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/spring username=root password=root123
-
- 在spring配置文件中引入context命名空间。
-
<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"></beans>
-
-
在spring中配置使用jdbc.properties文件。
-
<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:property-placeholder location="jdbc.properties"/><bean id="dataSource" class="com.powernode.spring6.beans.MyDataSource"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></bean> </beans>
-
-
- 配置多个spring的配置文件
-
主配置文件中包含其他的配置文件: <import resource="applicationContext2.xml"/>工厂创建的时候直接加载多个配置文件: ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml","applicationContext2.xml");
-