• 控制反转、依赖注入


    控制反转

    应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转,即控制反转是指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> 

     

     

  • 相关阅读:
    技巧和诀窍;在VS 2005里优化ASP.NET 2.0Web项目的Build性能(转)
    去噪:用于验证码图片识别的类续(C#代码)
    快速申请QQ号码的技巧(图文介绍)
    vs2005中调试js
    "Take the Internet Back“挂机程序(读信息挣美元)
    javascript的编写、调试
    硬盘速度和Visual Studio性能
    Java Swing的DragAndDrop机制
    Rails 的 SNS 准备
    学习,编译ffmpeg tutorial
  • 原文地址:https://www.cnblogs.com/whatarewords/p/10723928.html
Copyright © 2020-2023  润新知