# 7IoC在实际项目中的用途
如何通过IOC将对象之间解耦,进而让我们软件团队协作之间出现解耦,
如下代码模拟了:张三、李四开发,张三负责dao层(也就是对数据库的增删改查),李四负责service层(也就是业务逻辑层),前期项目使用的mysql数据库,后期又修改成了oracle数据库的场景,代码如下:
# 创建maven工程
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.torey.spring.ioc</groupId>
<artifactId>book-shop</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
</dependency>
</dependencies>
</project>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建java代码
package com.torey.spring.ioc.dao;
/**
* @Author http://torey611.gitee.io/li-tao-feng/
* @Email torey6061@qq.com
* @Date 2021/4/28 22:17
* @描述:
*/
public interface BookDao {
public void insert();
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
package com.torey.spring.ioc.dao;
/**
* @Author http://torey611.gitee.io/li-tao-feng/
* @Email torey6061@qq.com
* @Date 2021/4/28 22:17
* @描述:
*/
public class BookDaoMySqlImpl implements BookDao {
public void insert() {
System.out.println("添加了一条数据");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.torey.spring.ioc.dao;
/**
* @Author http://torey611.gitee.io/li-tao-feng/
* @Email torey6061@qq.com
* @Date 2021/4/28 22:17
* @描述:
*/
public class BookDaoOracleImpl implements BookDao {
public void insert() {
System.out.println("模拟oracle数据库:添加了一条数据");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.torey.spring.ioc.server;
import com.torey.spring.ioc.dao.BookDao;
import lombok.Data;
/**
* @Author http://torey611.gitee.io/li-tao-feng/
* @Email torey6061@qq.com
* @Date 2021/4/29 16:39
* @描述:
*/
@Data
public class BookServer {
private BookDao bookDao;
public void purchase(){
System.out.println("正在执行图书采购计划");
bookDao.insert();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 创建两个config.xml文件
写两个配置文件,是为了项目管理的考量,因为在一个团队中有一些技术好,有一些技术差一些,作为dao,它实现数据库的增删改查,没有多少技术含量,可以交给初级的程序员,但是对于service,这是在系统中最核心的代码,肯定是要让技术好,能力强的人进行开发,不同的人使用不同的xml文件,防止写的时候遇到工作上的交叉。
# applicationContext-dao.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--<bean id="bookDao" class="com.torey.spring.ioc.dao.BookDaoMySqlImpllImpl"></bean>-->
<!--如果后续底层修改使用了oracle数据库,只需要再次新建一个类,继承BookDao接口,然后改这里就可以了,server层是无感知的-->
<bean id="bookDao" class="com.torey.spring.ioc.dao.BookDaoOracleImpl"></bean>
</beans>
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# applicationContext-service.xml
用于保存所有的服务类,也就是service
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="bookServer" class="com.torey.spring.ioc.server.BookServer">
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 测试运行使用
package com.torey.spring.ioc;
import com.torey.spring.ioc.server.BookServer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Author http://torey611.gitee.io/li-tao-feng/
* @Email torey6061@qq.com
* @Date 2021/4/29 16:48
* @描述:
*/
public class BookShopApplication {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext("classpath:applicationContext-*.xml");
BookServer bookServer = applicationContext.getBean("bookServer", BookServer.class);
bookServer.purchase();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 导航,上一页,下一页
6SpringIoc路径表达式用法
8利用构造方法实现对象依赖注入