Бин Autowired в двух классах не обновляется после доступа к нему из второго класса - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть следующий сценарий:

Бин Автоматическая связь в двух классах, я заполняю бин в одном классе, затем проверяю бин во втором классе, он не заполняется.Принимая во внимание, что когда я добавляю получатель в класс, где я заполнил компонент, и вызываю получатель, он возвращает заполненный компонент.Почему я не могу получить доступ к этому bean-компоненту напрямую в другом классе, если он не заполнен, поскольку он действует как одиночный элемент в весеннем контексте?

Тестовый класс JUnit4, загружающий весенний контекст из xml-файла:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/spring/test-main-context.xml" })
public class MyTests {

    @Autowired
    MyObject myObject;

    @Autowired
    MyUtils myUtils;

    @Test
    public void testingContext() {
        myUtils.setMyObjectFromDB();
        System.out.println(myUtils.getMyObject().getId());
        System.out.println(myObject.getId());
    }
}

MyUtils:

public class MyUtils {

    @Autowired MyObject myObject;

    public void setMyObjectFromDB() {
        MyObject myDBObject = new MyObject();
        //
        // getting myObjectFromDB;
        //
        myObject = myDBObject;
    }

    public MyObject getMyObject() {
        return myObject;
    }
}

В тестовом классе myUtils.getMyObject().getId() возвращает правильный идентификатор, но во второй строке myObject.getId() возвращает ноль.

ПочемуMyObject, который установлен в классе MyUtils и @Autowired в обоих классах, не обновляется, когда я обращаюсь к нему напрямую в тестовом классе.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Глядя на код, MyObject не вводится ни в один из двух классов.У вас сложилось впечатление, что он был внедрен в класс MyUtils, потому что вы фактически создали его вручную в методе setter.

В связи с этим возникает вопрос, почему MyObject не вводится, и может быть много причин, одна из которых заключается в том, что у вас нет @Component, определенного в классе MyObject, или нетв пути сканирования компонентов, добавив @ComponentScan(basePackages = "put-your-base-package-name") в класс приложения Spring.

0 голосов
/ 18 декабря 2018

При переназначении myObject = myDBObject; в методе setMyObjectFromDB вы создаете новый объект и сохраняете его референ в переменной myObject, которая отличается от переменной, созданной с помощью Autowired.

* 1006.* Когда вы используете Autowired, он назначит ссылку на созданный компонент в переменной.Но если вы переназначите эту переменную, она будет указывать на новый объект.

РЕДАКТИРОВАТЬ:

Если вам действительно нужно обновить все переменные myObject с инициализированными Autowired, этоЛучше создать контейнерный класс, в котором будет храниться переменная myObject.

public class MyObjectContainer {
     @Autowired
     MyObject myObject;

     // Getters & Setters
}

Во всех классах, где вы автоматически подключаете myObject, используйте вместо этого объект класса MyObjectContainer.А когда вы хотите обновить myObject значение, просто обновите его в myObjectContainer объекте с его установщиком.Таким образом, ваш MyUtils будет выглядеть так:

public class MyUtils {

    @Autowired MyObjectContainer myObjectContainer;

    public void setMyObjectFromDB() {
        MyObject myDBObject = new MyObject();
        //
        // getting myObjectFromDB;
        //
        myObjectContainer.setMyObject(myDBObject);
    }

    public MyObjectContainer getMyObjectContainer() {
        return myObjectContainer;
    }
}
...