2016-07-23 78 views
0

在Spring中使用no参数构造函数时,是否可以确保在初始化bean之前设置了一些属性?我想在创建bean之后使用InitializingBean来验证设置。例如,我想要做什么:Spring在使用无参数构造函数时确保已设置Bean属性

public class HelloWorld implements InitializingBean{ 
    private String message; 

    public HelloWorld() 
    { 
     //Only no-args constructor must be used 
     //How do we make sure 'message' was ever set before the Bean is used? 
    } 

    public void setMessage(String message){ 
     this.message = message; 
    } 

    public void getMessage(){ 
     System.out.println("Your Message : " + message); 
    } 

    public void afterPropertiesSet(){ 
     //Validate object, requires message to be set! 
    } 
} 

public class MainApp { 
    public static void main(String[] args) { 

     AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); 

     //Bean is instantiated 
     HelloWorld obj = (HelloWorld) context.getBean("helloWorld"); 
     //Bean is initialized and thus afterPropertiesSet() is called here. It will fail because it requires 'message' to be set. 

     //Right after the bean is instantiated we set the 'message', but it's already to late. afterPropertiesSet() was already called. 
     obj.setMessage("Hello World!"); 

    } 
} 
+0

我不明白。你有'afterPropertiesSet',只是抛出一个异常或其他指标,它没有被正确初始化。 –

+0

可以将消息注入到该类中,因为如果没有注入它的依赖项(至少默认情况下),则无法创建该bean。基本上,容器将为您完成整件事。 – mszymborski

+0

@SotiriosDelimanolis那么你会如何建议在给定的MainApp示例中创建Bean?在创建bean之前,我无法使用context.getBean调用obj.setMessage,该bean在创建bean的过程中执行afterPropertiesSet()。例外情况总是会发生。在给出的例子中,我没有看到如何正确初始化bean。 – masi

回答

0

要注入在运行时确定的东西,请考虑使用FactoryBean。它基本上是工厂模式,而是由春原生支持:

public class SomeWeirdMessageFactoryBean implements AbstractFactoryBean { 
     public Class<?> getObjectType() { 
      return String.class; 
     } 

     protected Object createInstance() throws Exception { 
      String message; 
      // magic: 
      [...] 
      return message; 
     } 
    } 

magic部分显然是什么必须弄清楚什么返回。然后你必须注入它作为你班级的财产,而Spring将会发现它是一家工厂,并且为你做了肮脏的工作。

+0

谢谢你的重播,但我不明白这将如何帮助。 createInstance()方法没有使用任何参数,在howtodoinjava.com的例子中,你发布了很清楚,这些属性仍然使用预先配置的xml文件注入。工厂将采用一系列的bean配置并构建多个bean。目前还不清楚如何动态地提供配置,以便在bean初始化之前在运行时设置属性。我想我在这里采取错误的方式,并会尝试重新考虑设计本身。 – masi

+0

@masi:你能否提供你正在寻找的用例? createInstance可以使用任何想要获取当前配置的方法 - 从数据库,网络,您提供的缓存中获取数据。当然,如果你不想对它进行硬编码,你也必须在工厂的构造函数中将它们作为bean来提供,并在稍后对它们进行初始化 - 关键是参数是在你请求bean的那一刻计算出来的'原型'或懒惰'单身'范围) – mszymborski

相关问题