Создание объектов в Spring

249
26 апреля 2022, 09:10

Пытаюсь начать изучать Spring. Но не могу понять как создать элементарный объект, передав в конструктор значения.

Вот класс People, который имеет несколько полей. Я его помечаю аннотацией @Component, чтобы из него дальше создать бин.

@Component
public class People {
    private int id;
    private String fam;
    private String im;
    private String ot;
    private Date bdate;
    private String note;
    public People() {
    }
    public People(String fam, String im, String ot, Date bdate, String note) {
        this.fam = fam;
        this.im = im;
        this.ot = ot;
        this.bdate = bdate;
        this.note = note;
    }
    public People(String fam, String im, String ot) {
        this.fam = fam;
        this.im = im;
        this.ot = ot;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getFam() {
        return fam;
    }
    public void setFam(String fam) {
        this.fam = fam;
    }
    public String getIm() {
        return im;
    }
    public void setIm(String im) {
        this.im = im;
    }
    public String getOt() {
        return ot;
    }
    public void setOt(String ot) {
        this.ot = ot;
    }
    public Date getBdate() {
        return bdate;
    }
    public void setBdate(Date bdate) {
        this.bdate = bdate;
    }
    public String getNote() {
        return note;
    }
    public void setNote(String note) {
        this.note = note;
    }
}

Как в классе MainApp я могу создать объект People передав в конструктор People(String fam, String im, String ot) значения?

Мой класс MainApp

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext("test.entities");
        People people1 = context.getBean(People.class);
        System.out.println(people1.getFam());
    }
}

Создаю дополнительный класс MyConfig

@Configuration
public class MyConfig {
    
    @Bean
    public People getPeopleAndrew() {
        return new People("Test", "Andrew", "Testovich");
    }
    @Bean
    public People getPeopleIgor() {
        return new People("Test", "Igor", "Testovich");
    }
}

Метод в MainApp

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        People people1 = context.getBean(People.class);
        System.out.println(people1.getFam());
        People people2 = context.getBean(People.class);
        System.out.println(people2.getFam());
    }
}

Тут получается что спринг нашел два одинаковых бина как я понимаю и не знает какой из них создать. Как тут например получить бин getPeopleIgor?

Answer 1

По 1 вопросу:

Как в классе MainApp я могу создать объект People передав в конструктор People(String fam, String im, String ot) значения?

Да можете, только нужно изменить MyConfig

@Configuration
public class MyConfig {
    
    @Bean
    @Scope(value = "prototype")
    public People getConsrtuctedUser(String fam, String im, String ot) {
        return new People(String fam, String im, String ot);
    }
}  

@Scope(value = "prototype") - с помощью данного вида scope, спринг не будет инициализировать бин на старте, а будет создавать только при вызове(в главном классе MyApp).

B MainApp вызываете:

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        People people = context.getBean(People.class, "fam", "asda", "asdasd");
        System.out.println(people1.getFam());
    }
}

По поводу 2 вопроса:

Тут получается что спринг нашел два одинаковых бина как я понимаю и не знает какой из них создать. Как тут например получить бин getPeopleIgor?

Берем ваш конфиг(не меняем):

@Configuration
public class MyConfig {
    
    @Bean
    public People getPeopleAndrew() {
        return new People("Test", "Andrew", "Testovich");
    }
    @Bean
    public People getPeopleIgor() {
        return new People("Test", "Igor", "Testovich");
    }
}  

Если вы явно не указываете название бина(Например @Bean("customBeanName")), то спринг сам по умолчанию называет его по названию метода(для Andrew это будет бин с названием "getPeopleAndrew", а для Igor - "getPeopleIgor").

MainApp:

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext("test.entities");
        People peopleAndrew = context.getBean(People.class, "getPeopleAndrew");
        People peopleIgor = context.getBean(People.class, "getPeopleIgor");

    }
}
Answer 2

Как и обычно создают экземпляры класса.

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext("test.entities");
        People people1 = new People("fam", "asda", "asdasd");
        System.out.println(people1.getFam());
    }
}

дам кусочек отсюда

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

READ ALSO
перегрузка метода, что будет выполняться

перегрузка метода, что будет выполняться

Подскажите пожалуйста почему выполняется второй метод (хотя он стринговый), и при компиляции ругается на преобразование:

205
Android Studio и Gradle: настройки по умолчанию для нового проекта

Android Studio и Gradle: настройки по умолчанию для нового проекта

Как переписать начальные настройки Gradle для нового Android проекта? Я установил новое Android API и удалил старыеНо при создании нового проекта Gradle...

248
Как внедрить или передать JPARepository в контроллер?

Как внедрить или передать JPARepository в контроллер?

Есть класс "Parser", который берёт загруженный файл через get запрос и заносит данные в базу данных H2Если использовать его в классе со SpringApplication

133
Как сделать плавный динамический выпадающий список?

Как сделать плавный динамический выпадающий список?

Я хочу сделать плавный выпадающий список

366