轻松理解spring IOC
spring IOC(Inversion of control)即控制反转
概念:一,spring框架的核心之一
二,控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系
接下来我们以一个数据库连接的案列来阐述IOC的工作原理,下图为该项目的结构体系
本例中我们着重关注util(获取数据库连接对象)以及dao(数据库访问层)的依赖关系解析
本例需求:dao层可以自由,简洁操作mysql和sqlserver数据库
第一步:我们先定义了获取连接对象的接口
1 package util; 2 3 import java.sql.Connection; 4 5 public interface MyConnection { 6 public Connection getConnection(); 7 }
第二步:mysql和sqlserver对上一接口的具体实现(以sqlserver为例)
1 package util; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 6 public class MyConnection_sqlserver implements MyConnection { 7 9 // 第一步:获取数据连接,让appliction server能够与db server进行交互 10 private String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; 11 private String url = "jdbc:sqlserver://localhost:1433;DatabaseName=CardDB"; 12 private String name = "sa"; 13 private String pwd = "123456"; 14 private Connection conn = null; 15 16 @Override 17 public Connection getConnection() { 18 try { 19 Class.forName(driver); 20 } catch (ClassNotFoundException e) { 21 System.out.println( e.getMessage() ); 22 } 23 try{ 24 conn = DriverManager.getConnection(url, name, pwd); 25 } 26 catch(Exception e){ 27 System.out.println("获取数据库连接时有异常:"+e.getMessage()); 28 } 29 return conn; 30 } 31 32 }
第三步:dao获取连接对象
1 package dao; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.util.ArrayList; 7 import java.util.List; 8 9 import entity.BookCard; 10 import util.MyConnection; 11 12 public class BookCardDaoImpl implements BookCardDao { 13 14 private MyConnection c; 15 16 public void setC(MyConnection c) { 17 this.c = c; 18 }
解析:一,在dao中我们只定义了一个连接对象的属性,我们并不用知道具体是哪一个数据库的连接,只需要利用这个对象进行数据库操作即可
二,需要在本类中提供一个公共的set方法以便spring将这个连接对象注入进来
我们可以对照面向对象编程的写法来进一步了解IOC的长处
1 public class BookCardDaoImpl implements BookCardDao { 2 3 MyConnection c = new MyConnection_sqlserver();
解析:在传统面向对象的编程中我们层层级之间的关系紧密耦合在一起这就可能会引起这样一个问题,如果某一层出现问题,则可能影响到其他层,所以迫使其它层也需要作出调整
关键--》spring注入
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:p="http://www.springframework.org/schema/p" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xmlns:context="http://www.springframework.org/schema/context" 7 xmlns:jee="http://www.springframework.org/schema/jee" 8 xmlns:tx="http://www.springframework.org/schema/tx" 9 xsi:schemaLocation=" 10 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 11 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 12 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd 13 http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd 14 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd"> 15 20 <bean id="myDao1" class="dao.BookCardDaoImpl" scope="prototype"> 21 <property name="c" ref="myConnection1"></property> 22 </bean> 23 28 <bean id="myConnection1" class="util.MyConnection_mysql" scope="prototype"></bean> 29 30 <bean id="myConnection2" class="util.MyConnection_sqlserver" scope="prototype"></bean> 31 32 </beans> 33
解析:一,以上为部分spring的配置文件
二,回到本例的需求上来分析,如果我们需要操作mysql数据库只需要在dao这个bean中引用bean_id为myConnection1的bean,同理SqlServer则引用myConnection2
本篇博客到此结束,如果想继续深入理解IOC的朋友欢迎大家阅读下篇自己动手写spring IOC框架