• Spring中构造注入详解


    目录

    一、构造注入是什么

    二、构造注入重载


    一、构造注入是什么

    书接上回,我们已经知道了setter注入是什么了,这里的构造注入也就很好理解了。构造注入也就是Spring通过调用类对象中的构造方法来进行注入。接下来利用代码演示构造注入

    1)先创建一个Student类,这里为了防止是setter注入,不写setter方法。但是一定要写构造方法,不然无法进行构造注入

    1. public class Student {
    2. private String name;
    3. private int age;
    4. public Student(String name, int age) {
    5. this.name = name;
    6. this.age = age;
    7. }
    8. @Override
    9. public String toString() {
    10. return "Student{" +
    11. "name='" + name + '\'' +
    12. ", age=" + age +
    13. '}';
    14. }
    15. }

    2)在Spring的配置文件中配置关于Student类的Bean标签,这里将使用constructor-arg标签为构造方法中的属性进行赋值。构造方法中有几个属性就有几个constructor-arg标签,比如这里的构造方法中有两个属性,就要设置两个constructor-arg标签。在constructor-arg标签中看类型去赋值,这里是8种基本类型,那就使用value标签就可以了,不同的类型选择不同的标签即可。

    1. <bean id="student" class="com.gl.demo.model.Student">
    2. <constructor-arg>
    3. <value>张三value>
    4. constructor-arg>
    5. <constructor-arg>
    6. <value>22value>
    7. constructor-arg>
    8. bean>

    3)利用 Spring提供的接口获取到student的类对象,根据打印结果可以知道这里的构造注入已经完成了

    1. public void test4() {
    2. ApplicationContext ctx =
    3. new ClassPathXmlApplicationContext("applicationContext.xml");
    4. Student student = (Student) ctx.getBean("student");
    5. System.out.println(student);
    6. }

    写到这里就会发现,构造方法有重载啊,要是重载过程中都是只有一个参数呢?这时候Spring怎么去区别呢?

    二、构造注入重载

    利用刚刚的Student类,加两个构造方法的重载

    1. public class Student {
    2. private String name;
    3. private int age;
    4. public Student(String name, int age) {
    5. this.name = name;
    6. this.age = age;
    7. }
    8. public Student(String name) {
    9. this.name = name;
    10. }
    11. public Student(int age) {
    12. this.age = age;
    13. }
    14. @Override
    15. public String toString() {
    16. return "Student{" +
    17. "name='" + name + '\'' +
    18. ", age=" + age +
    19. '}';
    20. }
    21. }

    这里我只想为name属性进行赋值,那我只需要在Bean标签中写一个constructor-arg标签即可

    1. <bean id="student" class="com.gl.demo.model.Student">
    2. <constructor-arg>
    3. <value>李四value>
    4. constructor-arg>
    5. bean>

    此时通过测试发现只对一个类属性赋值就成功了,其中没有对age赋值,所以这个就是默认值0 

    接下来,我只想对age进行赋值,使用刚刚的方式还可不可以呢?age是int类型,那这里的value值设置成数字就可以了。按照思路Student类中的age应该是21,接下来进行测试

    1. <bean id="student" class="com.gl.demo.model.Student">
    2. <constructor-arg>
    3. <value>21value>
    4. constructor-arg>
    5. bean>

    哦豁,这里就出现了问题了,age没有进行赋值,反倒是name变成了21。这是为什么呢? 

    出现上面的问题,也要体会一下Spring的难处,这里都是一个参数,Spring也不知道到底是为哪一个参数进行注入赋值,因为Spring也是通过constructor-arg标签来定位的。接下来就是用另一种方法来解决这个问题,在constructor-arg标签中加上一个type属性指定构造方法中的类型即可

    1. <bean id="student" class="com.gl.demo.model.Student">
    2. <constructor-arg type="int">
    3. <value>21value>
    4. constructor-arg>
    5. bean>

    同样的,如果是两个不同的参数,那就两个constructor-arg标签都写上type属性就可以了! 

  • 相关阅读:
    Linux搭建GitLab私有仓库,并内网穿透实现公网访问
    汉诺塔问题(java)
    齐次变换矩阵、欧拉角
    模块化之CJS, AMD, UMD 和 ESM
    见证国内人工智能与机器人技术的进步
    用HTTP服务的方式集成 learned cardinality estimate 方法进 Postgresql
    驱动开发:内核枚举IoTimer定时器
    TCP/IP网络协议详解
    Java 实现简单的《用户登录小程序》
    java基于微信小程序的师生答疑交流平台 uniAPP小程序
  • 原文地址:https://blog.csdn.net/x2656271356/article/details/133900785