Конструктор с параметрами в Spring

386
18 июля 2017, 18:28

Здравствуйте. Подскажите, пожалуйста, как можно создавать бины через конструктор с параметрами. Например, есть такой класс (два конструктора - пустой и с параметрами; геттеры, сеттеры для краткости не приводятся):

import java.time.LocalDateTime;
public class Route {
    private LocalDateTime arrive;
    private LocalDateTime departure;
    private String from;
    private String to;
    public Route(){}
    public Route(LocalDateTime arrive, LocalDateTime departure, String from, String to) {
        this.arrive = arrive;
        this.departure = departure;
        this.from = from;
        this.to = to;
    }
    // геттеры, сеттеры
    public void printRoute(){
        System.out.println("Откуда: " + from +
        ", куда: " + to +
        ", прибытие: " + arrive +
        ", отбытие: " + departure);
    }
}

Основной класс:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
@SpringBootApplication
public class TrainScheduleApplication {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("app-context.xml");
        Route route = ctx.getBean("routeEmpty", Route.class);
        route.printRoute();
    }
}

Файл "app-context.xml":

<?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"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans [url]http://www.springframework.org/schema/beans/spring-beans.xsd[/url]
        [url]http://www.springframework.org/schema/context[/url] http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <bean id="routeEmpty" class="com.example.demo.Route">
    </bean>
</beans>

Собственно, вызывает затруднение следующее:

  • как создавать маршруты (Route) с помощью конструктора с параметрами для типа LocalDateTime;
  • как создавать разные маршруты (бины), передавая в конструктор необходимые параметры; то есть, чтобы параметры не прописывались в файле xml (тогда все маршруты создаются одинаковые), а можно было динамически передавать необходимые параметры из кода (аналог Route route = new Route(arrive, departure, from, to)).

Буду признателен за помощь.

Answer 1

Все классы, которые создаёт контекст Spring по умолчанию являются Singletone, что подразумевает, что они создаются один раз в единственном экземпляре при старте приложения и живут до его завершения. Если вы хотите иметь множество Route, то этот вариант вам не подходит. Просто не включайте Route в конфигурацию Spring, а создавайте и используйте его, как обычный объект в Java. Либо используйте scope prototype.

Добавлено: Самое простое использовать Java конфигурацию (на аннотациях), а не XML


@Configuration
public class Configuration{
   @Bean
   @Scope(value = "prototype")
   @Lazy(value = true)
   public Route getRoute(LocaldateTime arrive, LocalDateTime departure, String from, String to){
       return new Route(arrive, departure, from, to);
   }
}

Получение экземпляра класса:


public class TrainScheduleApplication {
   @Autowired
   private BeanFactory beanFactory;
   public void exampleMethod(){
      Route route = beanFactory.getBean(Route.class, arrive, departure, from, to);
   }
}

Если хотите использовать XML конфигурацию, то следует указать фиктивные параметры конструктора класса


<?bean id="routeEmpty" class="com.example.demo.Route" scope="prototype">
   <constructor-arg value="null"/> <!-- dummy value -->
   <constructor-arg value="null"/> <!-- dummy value -->
   <constructor-arg value="null"/> <!-- dummy value -->
   <constructor-arg value="null"/> <!-- dummy value -->
</bean>

А при инициализации бина в коде укажите реальные параметры.

READ ALSO
Остановка потока и вывод результата в консоль по нажатию ESC

Остановка потока и вывод результата в консоль по нажатию ESC

Есть консольное приложение, которое считает количество файлов в n-м количестве папок одновременноНеобходимо по нажатию ESC, остановить все...

212
Как указать User-Agent?

Как указать User-Agent?

ЗдравствуйтеИмеется код:

206
Получение значения из компонента JSF

Получение значения из компонента JSF

Как передать значение из одного компонента в другой?

201
Facebook messenger проблема с получением Postback

Facebook messenger проблема с получением Postback

Пишу чат бот для Facebook и столкнулся с проблемой при получении payload с нажатой кнопки юзером

184