• Spring框架构造注入的顺序问题index属性


    还是使用上一个demo,现在我们探讨一下构造注入的顺序问题,下面只截取关键代码。

     1 package service.impl;
     2 
     3 import service.UserService;
     4 import dao.UserDao;
     5 import entity.User;
     6 
     7 /**
     8  * 用户业务类,实现对User功能的业务管理
     9  */
    10 public class UserServiceImpl implements UserService {
    11 
    12     // 声明接口类型的引用,和具体实现类解耦合
    13     private UserDao dao;
    14     private String s1;
    15     private String s2;
    16     
    17 
    18     // 生成无参构造方法
    19     public UserServiceImpl() {
    20 
    21     }
    22 
    23     // 带参数构造方法   为dao进行赋值
    24     public UserServiceImpl(UserDao dao) {
    25         this.dao = dao;
    26     }
    27     public UserServiceImpl(UserDao dao,String s1) {
    28         this.dao = dao;
    29         this.s1=s1;
    30     }
    31     public UserServiceImpl(String s2,UserDao dao) {
    32         this.dao = dao;
    33         this.s2=s2;
    34     }
    35 
    36 
    37     public UserDao getDao() {
    38         return dao;
    39     }
    40 
    41     // dao 属性的setter访问器,会被Spring调用,实现设值注入
    42     public void setDao(UserDao dao) {
    43         this.dao = dao;
    44     }
    45 
    46     public void addNewUser(User user) {
    47         // 调用用户DAO的方法保存用户信息
    48         dao.save(user);
    49         System.out.println("s1="+s1);
    50         System.out.println("s2="+s2);
    51     }
    52 }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
        <!--以上是Spring框架的头信息 -->
        <!--放置要被管理的对象实例 -->
        <!-- 使用构造注入的方式 -->
        <bean id="userDao" class="dao.impl.UserDaoImpl"></bean>
        <bean id="UserService" class="service.impl.UserServiceImpl">
            <!--通过构造函数的方式,实现构造注入 -->
            <constructor-arg>
                <ref bean="userDao" />
            </constructor-arg>
                <constructor-arg>
                <value>123</value>
            </constructor-arg>
        </bean>
    
    </beans>

    运行结果:

    -Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@73ad2d6: defining beans [userDao,UserService]; root of factory hierarchy
    保存用户信息到数据库
    s1=null
    s2=123

    由此可以看出,spring框架是按照impl类中的顺序执行的。第二个构造方法把第一个构造方法给覆盖掉了

    怎样才能不覆盖:使用index属性

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
        <!--以上是Spring框架的头信息 -->
        <!--放置要被管理的对象实例 -->
        <!-- 使用构造注入的方式 -->
        <bean id="userDao" class="dao.impl.UserDaoImpl"></bean>
        <bean id="UserService" class="service.impl.UserServiceImpl">
            <!--通过构造函数的方式,实现构造注入 -->
            <constructor-arg>
                <ref bean="userDao" />
            </constructor-arg>
            <constructor-arg index="1">
                <value>123</value>
            </constructor-arg>
        </bean>
    
    </beans>

    运行结果:

    保存用户信息到数据库
    s1=123
    s2=null

  • 相关阅读:
    描述一下 JVM 加载 class 文件的原理机制?
    Java 中会存在内存泄漏吗,请简单描述
    关于同步机制的一些见解
    Mybatis 一对一,一对多,多对一,多对多的理解
    关于JavaBean实现Serializable接口的见解
    Python 文件I/O
    Python 模块
    Python 函数
    Python time tzset()方法
    Python time time()方法
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/12115443.html
Copyright © 2020-2023  润新知