Пытаюсь начать изучать 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?
По 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");
}
}
Как и обычно создают экземпляры класса.
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());
}
}
дам кусочек отсюда
Аннотации представляют из себя дескрипторы, включаемые в текст программы, и используются для хранения метаданных программного кода, необходимых на разных этапах жизненного цикла программы. Информация, хранимая в аннотациях, может использоваться соответствующими обработчиками для создания необходимых вспомогательных файлов или для маркировки классов, полей и т.д.
Подскажите пожалуйста почему выполняется второй метод (хотя он стринговый), и при компиляции ругается на преобразование:
Как переписать начальные настройки Gradle для нового Android проекта? Я установил новое Android API и удалил старыеНо при создании нового проекта Gradle...
Есть класс "Parser", который берёт загруженный файл через get запрос и заносит данные в базу данных H2Если использовать его в классе со SpringApplication