Вызов перегруженных конструкторов - PullRequest
2 голосов
/ 27 февраля 2020

Я пытаюсь применить некоторый весенний загрузочный код к унаследованному проекту из моей работы, проблема в том, что некоторые классы имеют перегруженные конструкторы, и я не знаю, как их вызывать с помощью весенней загрузки:

Код выглядит следующим образом:

@Component
ClassA {

    public void doSomething() {
        int a;
        SomeObjectB b;

        ClassB classB = null;

        classB = new ClassB(a, ab, b);
    }

}

@Service
classB {

    @Autowired
    private ClassC classC;

    classB(int a, SomeObjectA a) {
        //Logic with parameters
    }

    classB(int a, SomeObjectB b) {
        //Some logic
        classC.someMethod(b)
        //More logic
    }

    classB(int a, SomeObjectC c) {
        //Logic with parameters
    }
}

@Component
ClassC {

    public void someMethod(SomeObjectB b) {

    }
}

Внутри класса ClassA создается экземпляр класса B, который я пытаюсь вызвать, выполняя classB = new ClassB(a, ab, b);, поэтому класс с автопроводкой Class C равен нулю, поскольку он вышел из пружины. контекст. Я попытался реализовать фабричный метод с областью действия прототипа для создания нового Бина при каждом вызове класса, однако он не работает должным образом.

Это то, что я получил до сих пор:

@Component
ClassA {

    @Autowired
    private Function<String, ClassB> myPrototypeFactory;

    public void doSomething() {
        int a;
        SomeObjectB b;

        Map myMap = new HashMap<>();
        myMap.put("a", a);
        myMap.put("b", b);

        myPrototypeFactory.apply(myMap);
    }

}

@Configuration
ConfigurationClass {

    @Bean
    public Function<Map<String, Object>, ClassB> myPrototypeFactory() {
        return map -> {
                return myObjectPrototype((int)map.get("a"), (SomeObjectB)map.get("b"));
        };
    }

    @Bean
    @Scope(value = "prototype")
    public ClassB myObjectPrototype(int a, SomeObjectB b) {
        return new ClassB(a, b);
    }

}

Итак, вопрос в том, как вызвать перегруженный конструктор из ClassB, чтобы избежать нулевых значений в полях @Autowired? Я впервые сталкиваюсь с подобной проблемой.

Любая помощь будет по достоинству оценена.

1 Ответ

0 голосов
/ 27 февраля 2020

Вы можете взять bean-компонент из контекста приложения, передав beanName, agruments ... Если имеется несколько конструкторов, вам нужно определить ClassB prototype, а не singleton ..

@Service
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
classB {

    @Autowired
    private ClassC classC;

    classB(int a, SomeObjectA a) {
        //Logic with parameters
    }

    classB(int a, SomeObjectB b) {
        //Some logic
        classC.someMethod(b)
        //More logic
    }

    classB(int a, SomeObjectC c) {
        //Logic with parameters
    }
}

@Component
ClassA {
    @Autowired
    private ApplicationContext applicationContext;
    public void doSomething() {
        int a;
        SomeObjectB b;

        ClassB classB = null;
        classB = (ClassB) applicationContext.getBean("classB", a, ab);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...