Spring依赖注入(DI)

  • 什么是依赖注入。

  • DI : 全称是 dependency Injection 翻译过来是依赖注入 本意是在实例化对象的时候,对它里面的成员属性进行值的注入。、
  • public class  UserServiceImpl{
    private String username;
    }

    通俗的说: 就是由于这个类的实例现在已经交给spring来创建了,我们要求,
    spring在创建该类实例的时候,顺便把这个username 也赋值了。具体是什么值,由我们来指定。 

给属性赋值的方式

  1. set方法赋值

  2. 有参构造。

 

1. 采用有参构造进行注入

要求提供有参构造方法 , 该方式使用比较少。 使用set方式比较多

public class UserServiceImpl implements UserService {
    private  String address;
    public UserServiceImpl(String address) {
            this.address =address;
        }
@Override
        public void save() {
            System.out.println("调用了UserServiceImpl的save方法~~!" +address);
        }
    
    }
xml:
 <bean id="us" class="com.itheima.service.impl.UserServiceImpl">
<!-- 指定走有参构造, name:构造方法的参数名称, value : 注入进去的值 -->
          <constructor-arg name="address" value="北京"/>
      </bean>

2. 采用set方法进行注入 【重点】

要求要提供set方法

public class UserServiceImpl implements UserService {
    private  String address;
    public void setAddress(String address) {
            this.address = address;
        }
    
        @Override
        public void save() {
            System.out.println("调用了UserServiceImpl的save方法~~!" +address);
        }
    
    }

xml:

      <bean id="us" class="com.itheima.service.impl.UserServiceImpl">
          <property name="address" value="深圳"></property> <!-- //背后会调用set方法进行注入 -->
      </bean>

注入数据类型

数组
private String [] address;
public void setAddress(String [] address) {
        this.address = address;
    }

xml:

     <property name="address">
        <array>
            <value>北京1</value>
            <value>北京2</value>
            <value>北京3</value>
            <value>北京天安门,我爱北京</value>
        </array>
    </property> 
list
private List  address;
public void setAddress(List  address) {
        this.address = address;
    }

xml:

    <property name="address">
        <list>
              <value>北京11</value>
              <value>北京22</value>
              <value>北京33</value>
              <value>北京天安门,我爱北京44</value>
          </list>
    </property>
map
private Map<String , Object>  address;
public void setAddress(Map<String , Object>  address) {
        this.address = address;
    }

xml:

    <!-- map集合 -->
    <property name="address">
            <map>
              <entry key="地址1" value="北京1"/>
              <entry key="地址2" value="北京2"/>
              <entry key="地址3" value="北京3"/>
              <entry key="地址4" value="北京4"/>
          </map>
    </property>

注入对象类型

public class UserServiceImpl implements UserService {
        
        private UserDao userDao;
        
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }

    }
public class UserDaoImpl implements UserDao {
@Override
        public void save() {
            System.out.println("调用了UserDaoImpl的save方法~~");
        }
    
    }
xml:
  <!-- 让spring创建UserDaoImpl的实例 -->
  <bean id="ud" class="com.itheima.dao.impl.UserDaoImpl"></bean>
    
    <!-- 让spring创建UserServiceImpl的实例 -->
  <bean id="us" class="com.itheima.service.impl.UserServiceImpl">
  
      <!-- 让spring调用UserServiceImpl里面的setUserDao 方法,并且要带参数 参数就是ud 对应的那个bean的实例对象 -->
      <property name="userDao" ref="ud"/>
  </bean>

运行顺序应该是这样:

1. 我们拿着us 找到spring工厂(IOC工厂 | IOC容器),spring工厂会创建UserServiceImpl的实例

2. 创建完实例,接着会调用这个类中的setUserDao方法。

3. 但是调用这个方法需要参数。参数怎么给呢? 看ref="ud" ,

4. 拿着ud 满世界的找bean , 询问是否有哪一个bean 的标识符也是 ud

5. 如果找到了就创建这个bean的实例对象。

6. 拿着这个实例对象当成上面 第二步  setUserDao的参数给注入进去。

 

注入的细节

该细节其实是spring想让程序员少写代码,在xml进行注入赋值的时候,提供了一些可选的方法而已。 它无法改变我们的set和有参的注入方式,只是简化了xml里面的代码而已。

p名称空间

匹配代码里面的set方式 property

<bean id="us" class="com.itheima.service.impl.UserServiceImpl" p:address="北京"></bean>

c名称空间

匹配的是代码里面的有参构造 construtor

  <bean id="us" class="com.itheima.service.impl.UserServiceImpl" c:address="北京"> </bean>

SPEL 属性注入

<bean id="us" class="com.itheima.service.impl.UserServiceImpl" >
     <property name="address"  value="#{1>2}"/>
   </bean>

posted @ 2017-12-04 20:13  Dear丶配角  阅读(282)  评论(0编辑  收藏  举报