Spring 4 @Autowire не работает правильно?

1

Я пытаюсь Autowire bean к реализации, но он возвращает null-указатель Exception.

package org.com.api;

public interface Multiply {
    public int multipler(int a, int b);
}

package org.com.core;
import org.com.api.Multiply;

public class MultiplyImpA implements Multiply {
    public int multipler(int a, int b){
        return a*b;
    }
}

package org.com.core;
import org.com.api.Multiply;
public class MultiplyImpB implements Multiply {
    public int multipler(int a, int b){
        int total = 0;
        for(int i = 1; i <=b; i++){
            total += a;
        }
        return total;
    }
}

package org.com.Service;
import org.com.api.Multiply;
public Calculator {
    @Autowire
    private Multiply multiply;
    public int calcMultiply(int a, int b){
        return multiply.multipler(a,b);
    }
}

В моем applicationContext.xml я добавил следующее

<bean id="multiply" class="org.com.core.MultiplyImpA" scope="prototype"/>

Теперь во время выполнения я получаю NullPointerExpection. умножить - null.

для тестирования я пробовал это. Он работает, я понимаю, что я явно получаю Bean. Значит, это означает, что autwire не работает? есть что-то, что я не вижу?

Multiply m = (Multiply)factory.getBean("multiply");
System.out.println(m.multiplier(2,4);
  • 0
    Разместите свой spring.xml.
  • 0
    Да, spring.xml, пожалуйста. Как вы создаете экземпляр Calculator ?
Показать ещё 2 комментария
Теги:
spring
annotations

2 ответа

0
Лучший ответ

Кажется, у вас есть опечатка в вашем bean файле.

Вместо

<bean id="multiply" class="package org.com.core.MultiplyImpA" scope="prototype"/>

он должен быть (используя только полное имя класса)

<bean id="multiply" class="org.com.core.MultiplyImpA" scope="prototype"/>

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

Возможная ошибка может заключаться в том, что класс Calculator не управляется весной. Создание экземпляра класса с использованием new оператора завершится неудачно, потому что нет никакой возможности, чтобы весна получала ссылку на инъекцию соавтора:

Calculator calculator = new Calculator();
calculator.calcMultiply(1, 2); // would throw a NPE because the 'Multiply' instance (in your case 'MultiplyImpA') has not been injected.

Поэтому вместо этого создайте экземпляр класса Calculator используя весну:

<bean id="calculator" class="org.com.service.Calculator"/>
<bean id="multiply" class="org.com.core.MultiplyImpA"/> 

Получите его через контекст приложения:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application-context.xml");
Calculator calculator = ctx.getBean(Calculator.class);

Spring затем управляет зависимостями, просматривая аннотацию @Autowired, глядя на тип поля и пытаясь найти квалифицированный компонент из контекста приложения.

  • 0
    Опечатка только здесь не в моей реальной программе. спасибо за указание на это.
  • 0
    Это не сработало. ApplocationContext жаловался на то, что у него есть два типа реализаций. Затем я удалил bean-компонент ImplemntationB из applicationContext, подумал, что он будет работать, но все равно не будет работать.
Показать ещё 3 комментария
1

Autowiring разрешается по типу, так как есть два разных имплантата, вам нужно использовать квалификатор, чтобы сузить его. Попробуйте ниже.

public Calculator {
@Autowire
@Qualifier("multiply")
private Multiply multiply ;
public int calcMultiply(int a, int b){
    return multiply.multipler(a,b);
}
}
  • 0
    Я уже пробовал это. Это не помогло. Я не могу понять, почему умножение все еще равно нулю?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню