Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,30 @@
# spring-core-template
# Шаблон для практической работы по теме Spring Core

### Задание
1. В `pom.xml` добавьте зависимость `org.springframework:spring-context:5.2.1.RELEASE`.

1. В методе main создайте новый экземпляр класса `AnnotationConfigApplicationContext` - контейнер, в котором
будут храниться ваши бины. На вход ему будет передаваться класс `MainConfiguration`. В конфигурации используйте такие
аннотации, как `@Configuration` и `@Bean`.

1. В классе `MainConfiguration` сделайте импорт двух других классов-конфигураций:
* В классе `RepositoryConfiguration` сделайте описание бинов `ArrayListItemRepository` и `LinkedListItemRepository`
1. В `ArrayListItemRepository` объекты `Item` должны храниться в `ArrayList` и `initialSequence` считываться из пропертей.
1. В `ArrayListItemRepository` объекты `Item` должны храниться в `LinkedList` и `initialSequence` генерироваться случайно.
* В классе `InitializerConfiguration` реализуйте factory-bean `ColorFactory`, который умеет выдавать сущности
бинов `Color` по запросу `getColor`. Бин `Color` обязан создаваться каждый раз заново.

1. Имплементируйте `SimpleItemService` - сделайте так, чтобы необходимые зависимости добавлялись к нему через метод `set..`
и конструктор. В чём разница этих подходов?

1. Сделайте так, чтобы бин `ColorFactory` создавался не на этапе создания контекста, а при первом обращении к нему.

1. Сделайте так, чтобы используемая реализация `ItemRepository` выбиралась исходя из проперти `item.repository.implementation`
из значений `array` или `linked`. При отсутствии проперти необходимо использовать `ArrayListItemRepository`.

1. В классе `SpringCoreTemplate` в методе `main` создайте экземпляр `ApplicationContext` и передайте ему на вход
созданный экземпляр `AnnotationConfigApplicationContext`. Сделайте парочку вызовов метода `getBean`, чтобы убедиться,
что все бины создались и корректно работают.

1. Подключите зависимость `org.springframework:spring-test:jar:5.2.1.RELEASE`. Напишите тесты, которые проверяют основную
бизнес-логику и то, что ваш контекст загружается успешно.
129 changes: 90 additions & 39 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,43 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.epam.edu</groupId>
<artifactId>spring-core-template</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-core-template</name>
<description>Demo project for Spring Boot</description>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<properties>
<java.version>1.8</java.version>
</properties>
<groupId>com.EvDroid</groupId>
<artifactId>spring-core-template</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<!-- spring-->
<spring-context.version>5.3.29</spring-context.version>
<spring-test-version>5.3.29</spring-test-version>
<!-- junit-->
<junit-bom.version>5.10.0</junit-bom.version>
<junit-platform-launcher.version>1.10.0</junit-platform-launcher.version>
<!-- build-->
<maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
<!-- reporting-->
<maven-surefire-report-plugin.version>3.1.2</maven-surefire-report-plugin.version>
</properties>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-context.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-test-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>${junit-platform-launcher.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>${junit-bom.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
<properties>
<configurationParameters>
junit.platform.output.capture.stdout=true
junit.platform.output.capture.stderr=true
junit.platform.output.capture.maxBuffer=8192
</configurationParameters>
</properties>
</configuration>
</plugin>
</plugins>
</build>
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>${maven-surefire-report-plugin.version}</version>
</plugin>
</plugins>
</reporting>
</project>
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package com.epam.edu.spring.core.template;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.epam.edu.spring.core.template.configuration.MainConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

@SpringBootApplication
public class SpringCoreTemplate {

public static void main(String[] args) {
SpringApplication.run(SpringCoreTemplate.class, args);
//TODO get service bean and do some business logic with DTO`s
}

public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(MainConfiguration.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.epam.edu.spring.core.template.configuration;

import com.epam.edu.spring.core.template.factory.ColorFactoryBean;
import com.epam.edu.spring.core.template.entity.Color;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;

@Configuration
public class InitializerConfiguration {

@Bean
@Lazy
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public Color colorBean(ColorFactoryBean colorFactoryBean) {
return colorFactoryBean.getObject();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.epam.edu.spring.core.template.configuration;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@ComponentScan(basePackages = {"com.epam.edu.spring.core.template"})
@Import({RepositoryConfiguration.class, InitializerConfiguration.class})
public class MainConfiguration {}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.epam.edu.spring.core.template.configuration;

import com.epam.edu.spring.core.template.repository.ArrayListItemRepository;
import com.epam.edu.spring.core.template.repository.ItemRepository;
import com.epam.edu.spring.core.template.repository.LinkedListItemRepository;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:application.properties")
public class RepositoryConfiguration {

@Bean
public ItemRepository itemRepository(
@Value("${item.repository.implementation}") String repository) {
ItemRepository itemRepository;
if ("link".equalsIgnoreCase(repository)) {
itemRepository = new LinkedListItemRepository();
} else {
itemRepository = new ArrayListItemRepository();
}
return itemRepository;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.epam.edu.spring.core.template.entity;

public enum Color {
THIS_COLOR,
THAT_COLOR,
SOME_COLOR,
MORE_COLOR
}
62 changes: 62 additions & 0 deletions src/main/java/com/epam/edu/spring/core/template/entity/Item.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.epam.edu.spring.core.template.entity;

public class Item {
private long id;
private String name;
private double price;
private Color color;

public Item(long id, String name, double price, Color color) {
this.id = id;
this.name = name;
this.price = price;
this.color = color;
}

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public String getName() {
return name;
}

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

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}

public Color getColor() {
return color;
}

public void setColor(Color color) {
this.color = color;
}

@Override
public String toString() {
return "Item{"
+ "id="
+ id
+ ", name='"
+ name
+ '\''
+ ", price="
+ price
+ ", color="
+ color
+ '}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.epam.edu.spring.core.template.factory;

import com.epam.edu.spring.core.template.entity.Color;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

import java.util.Random;
import java.util.stream.Stream;

@Component
public class ColorFactoryBean implements FactoryBean<Color> {

private final Random random = new Random();

@Override
public Color getObject() {
return Stream.of(Color.values())
.filter(color -> color.ordinal() == random.nextInt(Color.values().length))
.findAny()
.orElseThrow(IllegalStateException::new);
}

@Override
public Class<?> getObjectType() {
return Color.class;
}

@Override
public boolean isSingleton() {
return FactoryBean.super.isSingleton();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.epam.edu.spring.core.template.repository;

import java.util.List;

/**
* Абстрактный класс для хранения сущностей. ID сущности генерируется, исходя из initialSequence
*
* @param <T>
*/
public abstract class AbstractRepository<T> {

protected long initialSequence = 0;

protected List<T> holder;

abstract void setInitialSequence(int val);

abstract void setHolder();
}
Loading