Создать объект весной с аннотациями (Inject, Autowired) или с getBean

Я пытаюсь понять DI весной. Где я должен использовать объект с context.getBean и где с аннотацией @inject?

public class App {
    public static void main(String[] args) {
        new Controller().iniController();

    }
}

public class Controller {

    public void iniController() {       

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("com/beans/beans.xml");
        Address address = context.getBean("address", Address.class);
        Person person = context.getBean("person", Person.class);
        Employee employee = context.getBean("employee", Employee.class);

        address.setCity("my city");
        person.setName("my name");

        System.out.println(employee);

        context.close();
    }

}

Правильно ли получить объекты адреса, персоны и сотрудника с методом context.getBean?


@Component
public class Employee {

    @Inject
    private Person person;
    @Inject
    private Address address;

    @Override
    public String toString() {
        return "Employee: "+ person.getName() +" from "+ address.getCity();
    }
}

Здесь я получил объекты person и address с помощью Inject. Могу ли я получить их также методом getBean?


@Component
public class Address {

    private String city;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

}

@Component
public class Person {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">


    <context:annotation-config></context:annotation-config>
    <context:component-scan base-package="com.model"></context:component-scan>
</beans>

1 ответ

Решение

Вы всегда должны предпочитать внедрение зависимостей, а не getBean, или я должен сказать вообще избегать использования getBean..

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

Более конкретно, внедрение зависимостей эффективно в следующих ситуациях:

  1. Вам необходимо ввести данные конфигурации в один или несколько компонентов.
  2. Вам нужно внедрить одну и ту же зависимость в несколько компонентов. Вы
  3. Вам нужно внедрить разные реализации одной и той же зависимости. Вы
  4. Вам нужно внедрить одну и ту же реализацию в разные конфигурации.
  5. Вам нужны некоторые из услуг, предоставляемых контейнером.

Определение DI помогает вам легко изменять базовые реализации, не беспокоясь о тех, кто использует эту реализацию.

И если это все еще оставляет вас озадаченным, вы можете найти десятки причин для использования DI в Google

Другие вопросы по тегам