如果类具有私有构造函数,如何从Java配置而不是上下文bean创建bean?

时间:2018-08-02 08:31:19

标签: java spring spring-boot

<bean id="beanTest" class="com.test.BeanTest">
   <property name="param" value="test"/>
</bean>

@configuration
public class JavaConfig {

@Bean
public BeanTest beanTest() throws Exception {
    Constructor constructor = BeanTest.class
            .getDeclaredConstructor();
    constructor.setAccessible(true);
    BeanTest beanTest = (BeanTest) constructor
            .newInstance();
    beanTest.setParam("test");
    return beanTest;
  }

}

假设- 1)Bean测试在其他库中。 2)BeanTest具有用于参数的setter,但构造函数是私有的。

问题陈述- 我想删除applicationContext.xml文件,并想使用java config类来定义bean。

解决方案- 我尝试使用反射成功。

这是正确的解决方案还是我们可以解决此问题的其他方法?

谢谢。

1 个答案:

答案 0 :(得分:0)

出于某种原因,它具有私有构造函数。创建者没有实例化该类。

  • 用于实用程序类(带有静态方法),您可以在其中直接通过静态类使用它们(例如org.apache.commons.io.FileUtils.readFileToString)。您不需要将它们注册为bean。
  • 对于包含上下文/数据的类,应在您的应用程序中仅出现一次(Singleton模式)。在这种情况下,创建第二个实例将破坏该库或导致不可预测的行为。此类库通常提供检索此单例实例的方法: org.springframework.security.core.context.SecurityContextHolder.getContext()用于确保春季安全。您可以将该实例注册为bean:

    @Bean
    public SecurityContext securityContext() {
         return SecurityContextHolder.getContext();
    }
    

如果以上两种情况都不是您要使用的库的情况。我想问一下库是否设计合理,并且可能会在我的应用程序中尽量避免使用它。