zoukankan      html  css  js  c++  java
  • 轻松理解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框架

  • 相关阅读:
    Typescript中抽象类与接口详细对比与应用场景介绍
    html5手势操作与多指操作封装与Canvas图片裁切实战
    可编辑DIV与移动端软键盘兼容性问题汇总
    作业系统前端架构总结
    移动端滑屏全应用【四】移动端动画贞动画函数mTween封装
    移动端滑屏全应用【三】requestAnimationFrame的兼容与使用
    python2.7和python3.7的区别!
    通俗易懂地解释卷积
    傅里叶变换就是这么简单!
    大话傅里叶变换,通俗易懂!
  • 原文地址:https://www.cnblogs.com/1016882435AIDA/p/5895480.html
Copyright © 2011-2022 走看看