Создать объект весной с аннотациями (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..
Внедрение зависимостей очень эффективно при связывании слабосвязанных компонентов и при настройке этих компонентов. Особенно, если связь между компонентами продолжается в течение всего срока службы компонентов.
Более конкретно, внедрение зависимостей эффективно в следующих ситуациях:
- Вам необходимо ввести данные конфигурации в один или несколько компонентов.
- Вам нужно внедрить одну и ту же зависимость в несколько компонентов. Вы
- Вам нужно внедрить разные реализации одной и той же зависимости. Вы
- Вам нужно внедрить одну и ту же реализацию в разные конфигурации.
- Вам нужны некоторые из услуг, предоставляемых контейнером.
Определение DI помогает вам легко изменять базовые реализации, не беспокоясь о тех, кто использует эту реализацию.
И если это все еще оставляет вас озадаченным, вы можете найти десятки причин для использования DI в Google