轻松理解spring IOC

spring IOC概念

spring IOC(Inversion of control)即控制反转,spring框架的核心之一。控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系。

接下来我们以一个数据库连接的案列来阐述IOC的工作原理,下图为该项目的结构体系

解析:action层为我们的控制层,service层为业务逻辑层,dao为数据访问层,util包为提供数据库连接对象的辅助层,entity为本例的实例层。
关键dao层可以自由,便捷操作mysql和sqlserver数据库

第一步:我们先定义获取连接对象的接口

1
2
3
4
5
6
7
package util;

import java.sql.Connection;

public interface MyConnection {
public Connection getConnection();
}

第二步:提供mysql和sqlserver连接对象(以sqlserver为例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package util;

import java.sql.Connection;
import java.sql.DriverManager;

public class MyConnection_sqlserver implements MyConnection {
9 // 第一步:获取数据连接,让appliction server能够与db server进行交互
private String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private String url = "jdbc:sqlserver://localhost:1433;DatabaseName=CardDB";
private String name = "sa";
private String pwd = "123456";
private Connection conn = null;

@Override
public Connection getConnection() {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
System.out.println( e.getMessage() );
}
try{
conn = DriverManager.getConnection(url, name, pwd);
}
catch(Exception e){
System.out.println("获取数据库连接时有异常:"+e.getMessage());
}
return conn;
}

}

第三步 dao层获取连接对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import entity.BookCard;
import util.MyConnection;

public class BookCardDaoImpl implements BookCardDao {

private MyConnection c;

public void setC(MyConnection c) {
this.c = c;
}

解析:一,在dao中我们只定义了一个连接对象的属性,我们并不用知道具体是哪一个数据库的连接,只需要利用这个对象进行数据库操作即可
 二,需要在本类中提供一个公共的set方法以便spring将这个连接对象注入进来我们可以对照面向对象编程的写法来进一步了解IOC的长处

1
2
3
public class BookCardDaoImpl implements BookCardDao {

MyConnection c = new MyConnection_sqlserver();

解析:在传统面向对象的编程中我们层层级之间的关系紧密耦合在一起这就可能会引起这样一个问题,如果某一层出现问题,则可能影响到其他层,所以迫使其它层也需要作出调整

第四步 spring注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">

<bean id="myDao1" class="dao.BookCardDaoImpl" scope="prototype">
<property name="c" ref="myConnection1"></property>
</bean>

<bean id="myConnection1" class="util.MyConnection_mysql" scope="prototype"></bean>

<bean id="myConnection2" class="util.MyConnection_sqlserver" scope="prototype"></bean>

</beans>

解析:一,以上为部分spring的配置文件
 二,回到本例的需求上来分析,如果我们需要操作mysql数据库只需要在dao这个bean中引用bean_id为myConnection1的bean,同理SqlServer则引用myConnection2
  本篇博客到此结束,如果想继续深入理解IOC的朋友欢迎大家阅读下篇自己动手写spring IOC框架

坚持原创技术分享,您的支持将鼓励我继续创作!