zoukankan      html  css  js  c++  java
  • spring依赖注入方法

      依赖注入就是在程序运行时期,由外部容器动态的将依赖对象注入到组件中,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做。

      spring有多种依赖注入的形式,下面仅介绍spring通过xml进行IOC配置的方式:

    1.set注入

      这是最简单的注入方式,假设有一个PersonServiceBean,类中需要实例化一个PersonDao对象,那么就可以定义一个private的PersonDao成员变量,然后创建PersonDao的set方法(这是ioc的注入入口):

     1 public Class PersonServiceBean{
     2     //注入对象PersonDao
     3     private PersonDao personDao;
     4     //注入对象的setter方法
     5     public void setPersonDao(PersonDao personDao){
     6         this.personDao = personDao;
     7     }
     8     public void save(Person person){
     9         personDao.save(person);
    10     }
    11 }

      随后编写spring的xml文件,<bean>中的name属性是class属性的一个别名,class属性指类的全名,因为在PersonServiceBean中有一个公共属性PersonDao,所以要在<bean>标签中创建一个<property>标签指定PersonDao。<property>标签中的name就是PersonServiceBean类中的PersonDao属性名,ref指下面<bean name="personDao"...>,这样其实是spring将PersonDaoImpl对象实例化并且调用PersonServiceBean的setPersonDao方法将PersonDao注入

    beans.xml配置:

    1 <!--配置bean,配置后该类由spring管理-->
    2 <bean name="personDao" class="cn.itcast.dao.impl.SpringDaoBean"></bean>
    3 <bean name="personService" class="cn.itcast.service.impl.PersonServiceBean">
    4     <!--(1)依赖注入,配置当前类中相应的属性-->
    5     <property name="personDao" ref="personDao"></property>
    6 </bean>

    2.构造器注入

    这种方式的注入是指带有参数的构造函数注入,看下面的例子,我创建了两个成员变量PersonDao和User,但是并未设置对象的set方法,所以就不能支持第一种注入方式,这里的注入方式是在PersonServiceBean的构造函数中注入,也就是说在创建PersonServiceBean对象时要将PersonDao和User两个参数值传进来:

     1 public class PersonServiceBean{
     2     private PersonDao personDao;
     3     private User user;
     4     public PersonServiceBean(PersonDao personDao,User user){
     5         this.personDao = personDao;
     6         this.user = user;
     7         system.out.println("构造方法调用personDao,user对象");
     8     }  
     9     public void save(){
    10         user.setName("哈哈");
    11         personDao.save(user);
    12     }
    13 }

     在XML文件中同样不用<property>的形式,而是使用<constructor-arg>标签,ref属性同样指向其它<bean>标签的name属性:

    1 <!--配置bean,配置后该类由spring管理-->
    2     <bean name="personService" class="cn.itcast.service.impl.PersonServiceBean">
    3         <!--(2)创建构造器注入,如果主类有带参的构造方法则需添加此配置-->
    4         <constructor-arg index="0" type="cn.itcast.dao.personDao" ref="personDao"></constructor-arg>
    5         <constructor-arg index="1" ref="user"></constructor-arg>
    6     </bean>
    7     <bean name="personDao" class="cn.itcast.dao.impl.personDaoBean"/>
    8     <bean name="user" class="cn.itcast.vo.User"/>

      解决构造方法参数的不确定性,你可能会遇到构造方法传入的两参数都是同类型的,为了分清哪个该赋对应值,则需要进行一些小处理:

      下面是设置index,就是参数位置:

    1 <bean name="personService" class="cn.itcast.service.impl.PersonServiceBean">
    2     <constructor-arg index="0" ref="personDao"></constructor-arg>
    3     <constructor-arg index="1" ref="user"></constructor-arg>
    4 </bean>

    另一种是设置参数类型:

    1 <constructor-arg type="java.lang.String" ref=""/>

    静态工厂方法和实例化工厂方法

    或者参见此链接

    肆虐的海水
  • 相关阅读:
    python检索特定内容的文本文件2
    windows dll函数的导出
    python检索特定内容的文本文件
    python 建立ftp共享文件夹
    gitbook制作电子书
    MFC程序框架
    Python 中文文档下载(附下载链接)
    基于tensorflow的手写数字识别代码
    MySQL
    vue项目更新数组对象里面的属性值,实现UI界面重新渲染---$set
  • 原文地址:https://www.cnblogs.com/ckysea/p/4528033.html
Copyright © 2011-2022 走看看