Spring-IOC(控制反转)Set注入实现--01 入门(控制反转基本实现原理)
目录
Set方法注入
在service层利用set方法给dao层接口进行赋值,把具体的dao层对象通过set方法赋值 给dao层接口。这也是IOC(控制反转)的基本实现方式,也是后面要分享的通过xml去对类进行实例化和赋值的基本原理。
配置文件(提前解密,这是下篇正式进入IOCxml配置文件方式使用的配置文件格式)
  
   - 
    
     
    
    
     
      <?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">
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
        <!--使用spring来创建对象,在spring这些都称为Bean-->
     
    
- 
    
     
    
    
         <bean id="hello" class="com.kuang.pojo.Hello" >
     
    
- 
    
     
    
    
             <property name="name" value="ksh"/> <!--给属性赋值-->
     
    
- 
    
     
    
    
         </bean>
     
    
- 
    
     
    
    
     
      </beans>
     
    
 可以从上面的配置文件里看到,每一个bean都是一个对象。 配置文件可以理解为IOC容器,每次加载配置文件的时候。系统会把这个配置文件里的所有bean给实例化成对象,方便后面从bean里拿指定的对象使用。 这种方式比较符合开闭原则,但是底层还是依赖set方法进行注入的。所以set方法注入是最基本和最原始的一种依赖注入方法(深刻体会这种方式),然后和xml这种配置文件的方式对比。
优点
对于子类的实现灵活替换,对于dao层方便扩展。只要增加一个实现类,在client(客户端)改变下具体的子类对象就可以了。
缺点
不符合开闭原则,因为dao层每次添加扩展类。client(客户端)端都要去类里修改具体的dao层的实现类,
能干什么
使用set注入可以灵活替换子类实现,下面以service业务类里替换dao层的数据持久层类为例。把dao层的接口关联到service类里,方便调用dao层的具体实现类。
并且在开始不赋值,在后面使用set方法对 dao层接口进行赋值。
怎么用
代码组织架构
    
使用set前代码
dao
UserDAO
  
   - 
    
     
    
    
     
      package com.kuang.dao;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      /**
     
    
- 
    
     
    
    
     
       * @program: spring
     
    
- 
    
     
    
    
     
       * @description: 测试dao
     
    
- 
    
     
    
    
     
       * @author: 康世行
     
    
- 
    
     
    
    
     
       * @create: 2021-04-22 10:59
     
    
- 
    
     
    
    
     
       */
     
    
- 
    
     
    
    
     
      public interface UserDao {
     
    
- 
    
     
    
    
         //获取信息
     
    
- 
    
     
    
    
         void getInforim();
     
    
- 
    
     
    
    
     
      }
     
    
 mysqlDAo
  
   - 
    
     
    
    
     
      package com.kuang.dao;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      /**
     
    
- 
    
     
    
    
     
       * @program: spring
     
    
- 
    
     
    
    
     
       * @description: mysql实现测试
     
    
- 
    
     
    
    
     
       * @author: 康世行
     
    
- 
    
     
    
    
     
       * @create: 2021-04-22 11:01
     
    
- 
    
     
    
    
     
       */
     
    
- 
    
     
    
    
     
      public class mysqlDao implements UserDao {
     
    
- 
    
     
    
    
         @Override
     
    
- 
    
     
    
    
         public void getInforim() {
     
    
- 
    
     
    
    
             System.out.println("mysql实现");
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
     
      }
     
    
 oracle
  
   - 
    
     
    
    
     
      package com.kuang.dao;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      /**
     
    
- 
    
     
    
    
     
       * @program: spring
     
    
- 
    
     
    
    
     
       * @description: 测试
     
    
- 
    
     
    
    
     
       * @author: 康世行
     
    
- 
    
     
    
    
     
       * @create: 2021-04-22 11:17
     
    
- 
    
     
    
    
     
       */
     
    
- 
    
     
    
    
     
      public class oracle implements UserDao {
     
    
- 
    
     
    
    
         @Override
     
    
- 
    
     
    
    
         public void getInforim() {
     
    
- 
    
     
    
    
             System.out.println("oracle实现");
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
     
      }
     
    
 sqlservDao
  
   - 
    
     
    
    
     
      package com.kuang.dao;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      /**
     
    
- 
    
     
    
    
     
       * @program: spring
     
    
- 
    
     
    
    
     
       * @description: sqlerver实现
     
    
- 
    
     
    
    
     
       * @author: 康世行
     
    
- 
    
     
    
    
     
       * @create: 2021-04-22 11:01
     
    
- 
    
     
    
    
     
       */
     
    
- 
    
     
    
    
     
      public class sqlservDao implements UserDao {
     
    
- 
    
     
    
    
         @Override
     
    
- 
    
     
    
    
         public void getInforim() {
     
    
- 
    
     
    
    
             System.out.println("sqlerver实现");
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
     
      }
     
    
 service
UserService
  
   - 
    
     
    
    
     
      package com.kuang.service;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      /**
     
    
- 
    
     
    
    
     
       * @program: spring
     
    
- 
    
     
    
    
     
       * @description: service测试
     
    
- 
    
     
    
    
     
       * @author: 康世行
     
    
- 
    
     
    
    
     
       * @create: 2021-04-22 11:02
     
    
- 
    
     
    
    
     
       */
     
    
- 
    
     
    
    
     
      public interface UserService {
     
    
- 
    
     
    
    
         //获取user信息
     
    
- 
    
     
    
    
         void getUer();
     
    
- 
    
     
    
    
     
      }
     
    
 UserServiceImpl
  
   - 
    
     
    
    
     
      package com.kuang.service;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      import com.kuang.dao.UserDao;
     
    
- 
    
     
    
    
     
      import com.kuang.dao.mysqlDao;
     
    
- 
    
     
    
    
     
      import com.kuang.dao.sqlservDao;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      /**
     
    
- 
    
     
    
    
     
       * @program: spring
     
    
- 
    
     
    
    
     
       * @description: userService实现类
     
    
- 
    
     
    
    
     
       * @author: 康世行
     
    
- 
    
     
    
    
     
       * @create: 2021-04-22 11:04
     
    
- 
    
     
    
    
     
       */
     
    
- 
    
     
    
    
     
      public class UserServiceImpl  implements UserService{
     
    
- 
    
     
    
    
         //注入dao依赖
     
    
- 
    
     
    
    
         private UserDao userDao=new sqlservDao();
     
    
- 
    
     
    
    
         @Override
     
    
- 
    
     
    
    
         public void getUer() {
     
    
- 
    
     
    
    
     
              userDao.getInforim();
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
     
      }
     
    
 
test
  
   - 
    
     
    
    
     
      import com.kuang.dao.mysqlDao;
     
    
- 
    
     
    
    
     
      import com.kuang.dao.oracle;
     
    
- 
    
     
    
    
     
      import com.kuang.dao.sqlservDao;
     
    
- 
    
     
    
    
     
      import com.kuang.service.UserService;
     
    
- 
    
     
    
    
     
      import com.kuang.service.UserServiceImpl;
     
    
- 
    
     
    
    
     
      import org.junit.Test;
     
    
- 
    
     
    
    
     
      import org.springframework.context.ApplicationContext;
     
    
- 
    
     
    
    
     
      import org.springframework.context.support.ClassPathXmlApplicationContext;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      /**
     
    
- 
    
     
    
    
     
       * @program: spring
     
    
- 
    
     
    
    
     
       * @description: 测试程序
     
    
- 
    
     
    
    
     
       * @author: 康世行
     
    
- 
    
     
    
    
     
       * @create: 2021-04-22 11:06
     
    
- 
    
     
    
    
     
       */
     
    
- 
    
     
    
    
     
      public class MyTest {
     
    
- 
    
     
    
    
         public static void main(String[] args) {
     
    
- 
    
     
    
    
             //实例化业务类
     
    
- 
    
     
    
    
            UserService userService=new UserServiceImpl();
     
    
- 
    
     
    
    
     
              userService.getUer();
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
     
      }
     
    
 result

使用set后代码
service
UserServiceImpl
  
   - 
    
     
    
    
     
      /**
     
    
- 
    
     
    
    
     
       * @program: spring
     
    
- 
    
     
    
    
     
       * @description: userService实现类
     
    
- 
    
     
    
    
     
       * @author: 康世行
     
    
- 
    
     
    
    
     
       * @create: 2021-04-22 11:04
     
    
- 
    
     
    
    
     
       */
     
    
- 
    
     
    
    
     
      public class UserServiceImpl  implements UserService{
     
    
- 
    
     
    
    
         //注入dao依赖
     
    
- 
    
     
    
    
         private UserDao userDao;
     
    
- 
    
     
    
    
         //实现动态创建对象,不用提前把对象写死,根据客户端的需求去实例化对您的对象。
     
    
- 
    
     
    
    
         public void setUserDao(UserDao userDao) {
     
    
- 
    
     
    
    
             this.userDao = userDao;
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
         @Override
     
    
- 
    
     
    
    
         public void getUer() {
     
    
- 
    
     
    
    
     
              userDao.getInforim();
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
     
      }
     
    
 test
  
   - 
    
     
    
    
     
      import com.kuang.dao.mysqlDao;
     
    
- 
    
     
    
    
     
      import com.kuang.dao.oracle;
     
    
- 
    
     
    
    
     
      import com.kuang.dao.sqlservDao;
     
    
- 
    
     
    
    
     
      import com.kuang.service.UserService;
     
    
- 
    
     
    
    
     
      import com.kuang.service.UserServiceImpl;
     
    
- 
    
     
    
    
     
      import org.junit.Test;
     
    
- 
    
     
    
    
     
      import org.springframework.context.ApplicationContext;
     
    
- 
    
     
    
    
     
      import org.springframework.context.support.ClassPathXmlApplicationContext;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      /**
     
    
- 
    
     
    
    
     
       * @program: spring
     
    
- 
    
     
    
    
     
       * @description: 测试程序
     
    
- 
    
     
    
    
     
       * @author: 康世行
     
    
- 
    
     
    
    
     
       * @create: 2021-04-22 11:06
     
    
- 
    
     
    
    
     
       */
     
    
- 
    
     
    
    
     
      public class MyTest {
     
    
- 
    
     
    
    
         public static void main(String[] args) {
     
    
- 
    
     
    
    
             //实例化业务类
     
    
- 
    
     
    
    
             UserService userService=new UserServiceImpl();
     
    
- 
    
     
    
    
             //把userServicve转换为子类类型,并给业务类set方法赋值
     
    
- 
    
     
    
    
     
             ((UserServiceImpl) userService).setUserDao(new oracle());
     
    
- 
    
     
    
    
              
     
    
- 
    
     
    
    
             //调用具体的方法
     
    
- 
    
     
    
    
     
              userService.getUer();
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
     
      }
     
    
 result
     
对比总结
从上面的两个实例可以看出,使用set方法后对于dao层具体实现类的替换,相对比较灵活。 还可以看出来,使用set前和使用set后,对于dao层是不用动的。只是把service层和test层就只修改了一点点。仅仅是这点修改,可以让客户端灵活替换不同的dao层的具体实现类。这也是IOC最原始的注入方法,IOC容器注入分为:使用xml文件和注解两种常用的方式。并且这两种方式还分为:手动注入和自动注入,具体的大家可以继续深入了解下这两种的不同实现方法。
个人把spring核心分为三类;
IOC
代理模式
AOP
尤其是在学完IOC 之后,一定要先把代理模式整明白(静态代理,动态代理),静态代理比较好理解,重点是动态代理比较稍微难点。把动态代理整明白之后再学习AOP就会很轻松,因为AOP底层实现使用的就是动态代理,还可以顺便了解下反射这对AOP和动态代理的学习有非常大的帮助。
文章来源: kangshihang.blog.csdn.net,作者:康世行,版权归原作者所有,如需转载,请联系作者。
原文链接:kangshihang.blog.csdn.net/article/details/116202161
- 点赞
- 收藏
- 关注作者
 
             
           
评论(0)