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 { @Override public 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; } @Override public 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; } @Override public 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;
}
@Override
public 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.xsd http://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.xsd http://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");
-
1804

被折叠的 条评论
为什么被折叠?



