Выборка бобов весной с помощью getBean - PullRequest
1 голос
/ 26 сентября 2019

Этот вопрос может показаться неубедительным, но у меня было сомнение, поэтому я хотел его прояснить.Я читаю Ashish Sarin «Начало работы с Spring Framework», и есть этот простой код, который выбирает пружинный бин класса FixedDepositService

package sample.spring.chapter06.bankapp;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import sample.spring.chapter06.bankapp.domain.FixedDepositDetails;
import sample.spring.chapter06.bankapp.service.FixedDepositService;

public class BankApp {
    public static void main(String args[]) throws Exception {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "classpath:META-INF/spring/applicationContext.xml");

        FixedDepositService fixedDepositService = context
                .getBean(FixedDepositService.class);
        fixedDepositService.createFixedDeposit(new FixedDepositDetails(1, 0,
                12, "someemail@somedomain.com"));
        fixedDepositService.createFixedDeposit(new FixedDepositDetails(1, 1000,
                12, "someemail@somedomain.com"));
    }
}

Теперь FixedDepositService - это интерфейс, а не конкретный класс.Он реализован другим классом с именем FixedDepositServiceImpl, подобным этому

....
@Service(value = "fixedDepositService")
public class FixedDepositServiceImpl implements FixedDepositService {
....
}

Мой вопрос: как работает этот код?Разве класс BankApp не должен извлекать bean-компонент класса FixedDepositServiceImpl вместо класса FixedDepositService, поскольку FixedDepositService является просто интерфейсом и не содержит определений методов, а FixedDepositServiceImpl является классом, который фактически его реализует, и в нем есть вся логика, определенная в нем?

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Весной это концепция, лежащая в основе отделения вашей фактической реализации / поведения от клиента и использования ее в качестве стратегии, зависит от ваших требований.

Как вы упомянули выше

Следуеткласс BankApp выбирает bean-компонент класса FixedDepositServiceImpl вместо класса FixedDepositService, поскольку FixedDepositService - это просто интерфейс

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

Если вам не нужно отделять вашу реализацию, как вы реализуете выше, вполне нормально сделать ваш FixedDepositService конкретным классом и использовать (используя @Component).

Но если у вас есть несколько реализаций, основанных на ваших требованиях, вы можете использовать @Qualifier, чтобы указать, какую реализацию вы собираетесь использовать на основе стратегии.

List<? extends FixedDepositService> fixedDepositServices; //use based on a strategy

Или

//inject single implementation if you know what you want
@Qualifier("diffrentFixedDepositService") FixedDepositService diffrentFixedDepositService; 

А также не нужно называть свой класс обслуживания как @Service(value = "fixedDepositService") beпотому что вы на самом деле не используете (другое имя или у вас есть только одна реализация) для класса обслуживания.

1 голос
/ 26 сентября 2019

В прямой вы можете использовать getClass().getName(), чтобы увидеть, какой это класс объекта

FixedDepositService service = (FixedDepositService) context.getBean("fixedDepositService");

System.out.println(service.getClass().getName());  //FixedDepositServiceImpl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...