zoukankan      html  css  js  c++  java
  • 控制反转、依赖注入

    控制反转

    应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转,即控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。

    依赖注入原理

    理解依赖注入的机制,关键是理解容器的实现方式

    1、Set注入:(常用)

    public class SpringAction { 
      //注入对象springDao 
      private SpringDao springDao; 
      //一定要写被注入对象的set方法 
      public void setSpringDao(SpringDao springDao) { 
        this.springDao = springDao; 
      }   
       public void ok(){ 
           springDao.ok(); 
       } 
    }
    
    --------------------------------------
    
    <!--配置bean,配置后该类由spring管理--> 
    <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
        <!--(1)依赖注入,配置当前类中相应的属性--> 
        <property name="springDao" ref="springDao"></property> 
    </bean> 
    <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>  

    2、构造器注入:(常用)

    public class SpringAction { 
            //注入对象springDao 
            private SpringDao springDao; 
            private User user; 
            
            public SpringAction(SpringDao springDao,User user){ 
                this.springDao = springDao; 
                this.user = user; 
                System.out.println("构造方法调用springDao和user"); 
            }             
    
                public void save(){ 
                user.setName("卡卡"); 
                springDao.save(user); 
            } 
        } 
    
    ----------------------------------------------------
    
    <!--配置bean,配置后该类由spring管理--> 
    <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
        <!--(1)依赖注入,配置当前类中相应的属性--> 
        <property name="springDao" ref="springDao"></property> 
    </bean> 
    <bean name="springDao" class="com.bless.springdemo.dao.impl.SpringDaoImpl"></bean>
    解决构造方法参数的不确定性,你可能会遇到构造方法传入的两参数都是同类型的,为了分清哪个该赋对应值,则需要进行一些小处理:
    //法一:设置参数位置: 
    <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
        <constructor-arg index="0" ref="springDao"></constructor-arg> 
        <constructor-arg index="1" ref="user"></constructor-arg> 
    </bean> 
    //法二:设置参数类型
    <constructor-arg type="java.lang.String" ref=""/>

    3、静态工厂方法注入:

    public class DaoFactory { 
      //静态工厂 
       public static final FactoryDao getStaticFactoryDaoImpl(){ 
         return new StaticFacotryDaoImpl(); 
       } 
    } 
    
    --------------------------------------------------
    
    public class SpringAction { 
      //注入对象 
       private FactoryDao staticFactoryDao;         
       public void staticFactoryOk(){ 
         staticFactoryDao.saveFactory(); 
       } 
       //注入对象的set方法 
       public void setStaticFactoryDao(FactoryDao staticFactoryDao) { 
         this.staticFactoryDao = staticFactoryDao; 
       } 
    } 
    
    -----------------------------------------------------------------
    
    <!--配置bean,配置后该类由spring管理--> 
    <bean name="springAction" class="com.bless.springdemo.action.SpringAction" > 
        <!--使用静态工厂的方法注入对象,对应下面的配置文件(3)--> 
        <property name="staticFactoryDao" ref="staticFactoryDao"></property> 
    </bean> 
    
    <!--此处获取对象的方式是从工厂类中获取静态方法--> 
    <bean name="staticFactoryDao" class="com.bless.springdemo.factory.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean> 

    4、实例工厂的方法注入:

    public class DaoFactory { 
      //实例工厂 
      public FactoryDao getFactoryDaoImpl(){ 
        return new FactoryDaoImpl(); 
      } 
    } 
    
    ---------------------------------------------
    
    public class SpringAction { 
      //注入对象 
      private FactoryDao factoryDao; 
      public void factoryOk(){ 
        factoryDao.saveFactory(); 
      } 
      public void setFactoryDao(FactoryDao factoryDao) { 
        this.factoryDao = factoryDao; 
      } 
    } 
    
    -----------------------------------------------
    
    <!--配置bean,配置后该类由spring管理--> 
    <bean name="springAction" class="com.bless.springdemo.action.SpringAction"> 
        <!--使用实例工厂的方法注入对象,对应下面的配置文件(4)--> 
        <property name="factoryDao" ref="factoryDao"></property> 
    </bean> 
       
    <!--此处获取对象的方式是从工厂类中获取实例方法--> 
    <bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory"></bean> 
    <bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean> 

     

     

  • 相关阅读:
    紫微斗数诸星分级及分类
    n次独立重复试验暨伯努利试验
    信息系统项目管理师上午综合知识试题解析: 项目集治理
    三点估算和PERT技术
    自己写操作系统---bootsector篇
    硬盘分区表知识—详解硬盘MBR
    如何在自定义端口上运行 Spring Boot 应用程序?
    查询所有同学的学号、姓名、选课数、总成绩
    查询平均成绩大于60分的同学的学号和平均成绩
    查询“001”课程比“002”课程成绩高的所有学生的学号;
  • 原文地址:https://www.cnblogs.com/whatarewords/p/10723928.html
Copyright © 2011-2022 走看看