控制反转、依赖注入

控制反转

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

 

 

扫描二维码关注公众号,回复: 5923195 查看本文章

猜你喜欢

转载自www.cnblogs.com/whatarewords/p/10723928.html