Конструктор Springframework-arg

#java #spring #dependency-injection #constructor-injection

#java #весна #внедрение зависимостей #конструктор-инъекция

Вопрос:

У меня есть основной класс, в котором есть 2 переменные. Я хотел бы передать эти 2 значения в класс компонента springframework «Test». как мне определить это в applicationContext.xml а также как мне передать эти 2 значения переменных в компонент «Test».

Пример:

 class MainClass {
       public int var1;
      public int var2;
      public Test test;

   public void setVar1(int var11) {
    var1 = var11;
   }

    public void setVar2(int var22) {
        var2 = var22;
    }

   public static void main(String args[]) {

       ApplicationContext context = 
           new FileSystemXmlApplicationContext("applicationContext.xml");
      Test = context.getBean("test");
   }
  }
  

———— ТЕСТОВЫЙ класс ————

 public class Test {

 public Test (int var1, int var2) {}
}
  

————- applicationContext.xml ————-

    <bean id="test" class="com.path.test">
       <constructor-arg index="0" type="int" value="????"/>
       <constructor-arg index="1" type="int" value="????"/>
   </bean>
  

Комментарии:

1. Это немного странная вещь, но вы могли бы использовать PropertyPlaceholderConfigurer . Что-то вроде этого: forum.springsource.org /…

Ответ №1:

Вы можете передавать значения следующим образом:

 <bean id="test" class="com.path.test.Test">
   <constructor-arg index="0" type="int" value="123"/>
   <constructor-arg index="1" type="int" value="456"/>
</bean>
  

Вы должны не забыть указать свое полное имя класса в качестве значения class атрибута.

Тем не менее, ваш Test класс не сохраняет свое состояние. Если вы хотите получить доступ к значениям, указанным вами в вашем applicationContext.xml , вы должны создать некоторые члены Test :

 public class Test {
    private int v1;
    private int v2;

    public Test (int var1, int var2) {v1 = var1; v2 = var2;}

    public int getVOne() {
        return v1;
    }

    public int getVTwo() {
        return v2;
    }
}
  

Затем вы должны иметь доступ к ним в своем main методе следующим образом:

 public static void main(String args[]) {

    ApplicationContext context = 
       new FileSystemXmlApplicationContext("applicationContext.xml");
    Test test = context.getBean("test");
    int v1 = test.getVOne();
    int v2 = test.getVTwo();

    System.out.println("V1: "   v1   " V2: "   v2); //output: V1: 123 V2: 456
}
  

Комментарии:

1. значения var1 и var2 должны передаваться из основного класса. Это не постоянные значения. Могу ли я настроить это в applicationContext.xml досье?

2. Это не то, для чего вы используете Spring. Внедрение зависимостей заключается в настройке ваших зависимостей вне кода. Что вы пытаетесь сделать?

3. класс «Main» определяет 2 переменные. Класс «Test» создается из класса «Main» и должен передавать эти 2 переменные в класс «Test». Как я могу достичь этого, используя Spring. Например: основной класс: int var1 = getValueFromDatabase(1); int var2 = getValueFromDatabase(2); Тестовый тест = новый тест (var1, var2);

4. Я понимаю ваш пример, но Test в этом случае нет необходимости создавать экземпляр Spring. Здесь вы должны создать Test с помощью new оператора так, как вы показали: Test test = new Test(var1, var2);

Ответ №2:

Как говорит Николас, это немного странная вещь, но вы могли бы добиться этого с помощью PropertyPlaceholderConfigurer .

Что-то вроде этого:

  public static void main(String args[]) {
        PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
        Properties properties = new Properties();
        properties.setProperty("var1", Integer.toString(var1));
        properties.setProperty("var2", Integer.toString(var2));
        configurer.setProperties(properties);

        FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext();
        context.addBeanFactoryPostProcessor(configurer);

        context.setConfigLocation("applicationContext.xml");
        context.refresh();
        Test test = (Test) context.getBean("test");
 }
  

ПРИМЕЧАНИЕ: var1 и var2 должны быть статическими, если вы хотите ссылаться на них из main()

Затем ссылайтесь на заполнители следующим образом:

 <bean id="test" class="com.path.test">
   <constructor-arg index="0" type="int" value="${var1}"/>
   <constructor-arg index="1" type="int" value="${var2}"/>
</bean>
  

Смотрите также эту тему форума: http://forum.springsource.org/showthread.php?71815-Passing-Bean-properties-using-java.util .Свойства

Документ API: http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html

HTH

Комментарии:

1. Я также использую «PropertyPlaceHolders» в моем applicationContext.xml файл, который извлекает значения из файлов «нескольких свойств». Когда я использовал ваш подход, он не использует свойства из applicationContext.xml досье. Пожалуйста, помогите.

2. Ну, я думаю, что PropertyPlaceholderConfigurer предназначен для использования только один раз для каждого ApplicationContex. Итак, возможно, попробуйте другой подход!

3. например, вызов, если вы получаете значения из базы данных, источник данных должен быть настроен в ApplicationContext xml, а затем вы можете использовать MethodInvokingFactoryBean для вызова getValueFromDatabase(1) … static.springsource.org/spring/docs/3.0.x/javadoc-api/org /…