gpt4 book ai didi

java - 如何限制 Spring IOC 容器使用私有(private)构造函数创建自定义对象

转载 作者:行者123 更新时间:2023-12-02 11:09:17 24 4
gpt4 key购买 nike

正如我们所知,spring ioc 可以创建一个类的对象,该类的构造函数甚至可以通过使用反射声明为私有(private)。如果 ioc 这样做,那么为什么 ioc 不能创建 java.util.Calendar 类的对象。它只会使用 getInstance() 方法创建。

<bean id="cal" class="java.util.Calendar" factory-method="getInstance" />

但它不会创建

  <bean id="cal" class="java.util.Calendar"/>

根据我的理解,原因是,在 getInstance() 方法中可能是日历类准备一些当前日期时间数据以返回等。这就是为什么 Calendar 类不允许使用构造函数创建 Calendar 类的对象[所以声明为私有(private)]。这只能通过 getInstance() 方法实现。

但是对于我自己的类,如果构造函数被声明为私有(private)

**case 1.** <bean id="s" class="bean.Student">  <!--want to restrict in this case like Calendar.class-->
**case-2.** <bean id="s" class="bean.Student" factory-method="getInstance">

Spring ICO 能够使用反射创建 Student.class 对象。现在我的问题是,我想限制spring ICO在情况1中创建一个Student.class的对象,就像Calendar.class一样。我怎样才能实现这个目标?请帮忙这是我的 Student.class 代码

package bean;
public class Student {

public static Student student = null;

private Student() {
System.out.println("default constructor");
}

public static Student getInstance() {
System.out.println("factory method called");
if(student == null) {
student = new Student();
}
return student;
}
}

最佳答案

您将无法阻止通过反射创建对象(即使类具有私有(private)构造函数)。

java.util.Calendar 是一个抽象类(参见 here )。因此,无法直接创建此类的对象,生成器方法 ( getInstance() ) 创建并返回具体的类对象。

考虑到上面的描述,您还可以使您的类抽象并提供对象生成器方法。这样 Spring 的 IOC 将无法创建你的类的实例。它只能创建具体类的实例(使用反射)。

关于java - 如何限制 Spring IOC 容器使用私有(private)构造函数创建自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50714807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com