Как автоматически подключить компонент внутри класса Spring @ConditionJAVA

Программисты JAVA общаются здесь
Anonymous
Как автоматически подключить компонент внутри класса Spring @Condition

Сообщение Anonymous »

У меня есть интерфейс IInterface.java, как показано ниже:

Код: Выделить всё

public interface IInterface {
void printIt();
}
И для этого есть два класса реализации: ImplementationA.java и ImplementationB.java

Код: Выделить всё

@Component
public class ImplementationA implements IInterface {
@Override
public void printIt() {
System.out.println("Inside ImplementationA");
}
}

Код: Выделить всё

@Component
public class ImplementationB implements IInterface {
@Override
public void printIt() {
System.out.println("Inside ImplementationB");
}
}

Теперь у меня есть класс прослушивателя, членом которого является этот IInterface:

Код: Выделить всё

@Component
@AllArgsConstructor
public class Listener {

IInterface iInterface;

public void doStuff(){
iInterface.printIt();
}
}

Теперь мне нужно внедрить либо ImplementationA.java, либо ImplementationB.java в элемент iInterface Listener.java > на основе определенного условия.
После некоторых исследований я начал использовать аннотацию @Conditional.
Я добавил два класса ConditionA.java и ConditionB. Java:

Код: Выделить всё

public class ConditionA implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return false;
}
}

Код: Выделить всё

public class ConditionB implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return true;
}
}
И я также изменил свои классы реализации, как показано ниже (добавил аннотацию Conditional):

Код: Выделить всё

@Component
@Conditional(ConditionA.class)
public class ImplementationA implements IInterface {
@Override
public void printIt() {
System.out.println("Inside ImplementationA");
}
}

Код: Выделить всё

@Component
@Conditional(ConditionB.class)
public class ImplementationB implements IInterface {
@Override
public void printIt() {
System.out.println("Inside ImplementationA");
}
}

Кажется, для меня это работает как шарм. Какой бы класс реализации мне ни нужно внедрить, я просто возвращаю true из соответствующего класса Condition и возвращаю false из остальной части класса Condition класса реализации.
Однако в следующей части я столкнулся с проблемой:
Итак, в приведенном выше решении я жестко запрограммировал возврат true или возврат false из совпадений > метода соответствующего класса Condition. Что делать, если мне нужно вернуть динамическое значение на основе другого компонента.
Предположим, у меня есть класс MyCustomConfig Spring Component, который имеет член customFlag и если для этого члена установлено значение true, нам нужно внедрить ImplementationA.class.
Я попробовал следующее (создал класс @Component, а также автоматически подключил MyCustomConfig):

Код: Выделить всё

@Component
public class ConditionA implements Condition {
@Autowired
MyCustomConfig myCustomConfig;

@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return myCustomConfig.getCustomFlag();
}
}

Однако это просто не работает. myCustomConfig не подключается автоматически, и я получаю исключение с нулевым указателем.
Кто-нибудь может мне помочь с этим.

Подробнее здесь: https://stackoverflow.com/questions/733 ... tion-class

Вернуться в «JAVA»