Рубрики
Без рубрики

Современная разработка Java происходит быстро

Первоначально опубликовано на return.co.de Разработка Java – это быстро и весело. Хотите верьте, хотите нет. Я слышу… Помечено как java, весна, тестирование, новички.

Первоначально опубликовано на Первоначально опубликовано на

Разработка Java – это быстро и весело. Хотите верьте, хотите нет.

Я слышу много критики Java в подкастах, в основном от разработчиков, которые никогда не занимались профессиональной разработкой Java и думают о Java как о дрянном плагине браузера Java или уродливых кроссплатформенных настольных приложениях.

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

В следующем разделе немного о моем прошлом и проблемах, которые у меня были с Java в прошлом. Но не стесняйтесь пропустить это и перейти к “Новой надежде”.

Но не стесняйтесь пропустить это и перейти к “Новой надежде”. Пару лет назад я почти закончил с Java. Но не стесняйтесь пропустить это и перейти к “Новой надежде”. Пару лет назад я почти закончил с Java. Я много лет занимался разработкой с Java ME (используя Java 1.3, что совсем не весело), а также разработкой бэкэнда в Java SE с Spring 2. Но не стесняйтесь пропустить это и перейти к “Новой надежде”. Пару лет назад я почти закончил с Java. Я много лет занимался разработкой с Java ME (используя Java 1.3, что совсем не весело), а также разработкой бэкэнда Плюс, были некоторые устаревшие системы, которые мне приходилось поддерживать в рабочем состоянии для внешнего интерфейса. ent в Java SE с Spring 2.





   
      
   

Но не стесняйтесь пропустить это и перейти к “Новой надежде”. Пару лет назад я почти закончил с Java. Я много лет занимался разработкой с Java ME (используя Java 1.3, что совсем не весело), а также разработкой бэкэнда Плюс, были некоторые устаревшие системы, которые мне приходилось поддерживать в рабочем состоянии для внешнего интерфейса. ent в Java SE с Spring 2. Настоящая красота, не так ли?

Но не стесняйтесь пропустить это и перейти к “Новой надежде”. Пару лет назад я почти закончил с Java. Я много лет занимался разработкой с Java ME (используя Java 1.3, что совсем не весело), а также разработкой бэкэнда Плюс, были некоторые устаревшие системы, которые мне приходилось поддерживать в рабочем состоянии для внешнего интерфейса. ent в Java SE с Spring 2. Настоящая красота, не так ли?В основном меня тошнило от Spring 2 и Struts с их кучей XML, которые превращали рефакторинг в ад и которые было трудно читать.

Но не стесняйтесь пропустить это и перейти к “Новой надежде”. Пару лет назад я почти закончил с Java. Я много лет занимался разработкой с Java ME (используя Java 1.3, что совсем не весело), а также разработкой бэкэнда Плюс, были некоторые устаревшие системы, которые мне приходилось поддерживать в рабочем состоянии для внешнего интерфейса. ent в Java SE с Spring 2. Настоящая красота, не так ли?В основном меня тошнило от Spring 2 и Struts с их кучей XML, поэтому я начал следующий бэкэнд-проект с простой Java SE. это превратило рефакторинг в ад, и его было трудно читать. Я сделал это полностью на основе тестов. Я был довольно быстр, используя IntelliJ для генерации всего шаблонного кода. Я действительно очень серьезно отнесся к этой “штуке” с ДИ и перестроил ее. У меня был интерфейс почти для каждого класса, даже если была только одна реализация. Я не использовал никаких фреймворков для насмешек, потому что у меня тоже был неудачный опыт – с EasyMock и даже PowerMock (не используйте это!) И написал все насмешки, реализовав интерфейс в тесте, если мне это было нужно. У меня также был огромный мастер-класс начальной загрузки, который фактически создавал производственные экземпляры и выполнял фактическую инъекцию. Это был монстр на 500 локтей.

MyConfiguration config = loadConfiguration();
FirstClass firstClass = new FirstClass(config);
SecondClass secondClass = new SecondClass(config, "someParam");
ThirdClass thirdClass = new ThirdClass(firstClass, secondClass);

(...)

OneHundredTwelfthClass oneHundredTwelfthClass = (...)

Благодаря очень хорошему тестовому охвату это приложение работало с первого момента после запуска в производство. Единственное место, которое я не охватил и в котором, следовательно, были ошибки, – это SQL-запросы, которые, как вы уже догадались, я написал с использованием простого JDBC.

Все вручную. И все потому, что в прошлом у меня был такой неудачный опыт использования любых фреймворков.

Я многому научился но я не хотел заниматься этим всю оставшуюся жизнь. Поэтому я искал какую-нибудь нишевую работу, например, разработчика серверной части Erlang (я все еще люблю этот язык). На самом деле я отклонил довольно хорошее предложение на должность разработчика Java, потому что они сказали мне в интервью, что они делают Spring. Наконец, меня наняла крупная компания, работавшая на Яве.

Я был частью новой команды, которая могла выбирать технологии, с которыми мы хотели работать. Мы экспериментировали с простой Java, Camel, Java EE, vert.x, а затем появились Spring 4 и Spring Boot и некоторые другие удобства, которые открыли мне глаза.

Весна – Волшебство происходит

Весна – Волшебство происходит Весной.

Spring – Волшебство происходит Spring Core С Spring ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его @Autowire магией и, самое главное, без какого-либо необходимого XML:

@Service
public class FooService {

    private final FooRepository repository;

    @Autowired
    public FooService(FooRepository repository) {
        this.repository = repository
    }
}

Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимый: Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимое: Это практически дворецкий, который приносит вам все, что вам нужно, на серебряной тарелке. Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который доставит вам все необходимое на серебряной тарелочке – вам просто нужно позвонить за этим. Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимое: Это практически дворецкий, который доставляет вам все, что вам нужно, на серебряной тарелке: вам просто нужно позвонить за этим. Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который доставляет вам все необходимое на блюдечке с голубой каемочкой. С Ломбоком это становится еще лучше, см. Ниже. Спойлер: Вам просто нужно позвонить для этого.

Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который доставляет вам все, что вам нужно, на блюдечке с голубой каемочкой, я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одной реализации. С Ломбоком это становится еще лучше, см. Ниже. Спойлер: Вам просто нужно позвонить для этого.

Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который доставляет вам все, что вам нужно, на блюдечке с голубой каемочкой, я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного внедрения Impspring Web MVC. С Ломбоком это становится еще лучше, см. Ниже. Спойлер: Вам просто нужно позвонить для этого. Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который доставляет вам все, что вам нужно, на блюдечке с голубой каемочкой, я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного впечатляющего веб-MVC-приложения REST Spring. С Ломбоком это становится еще лучше, см. Ниже. Спойлер: Вам просто нужно позвонить для этого.

Spring – Волшебство происходит Ядро Spring С Spring ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его

@Controller
@RequestMapping("/appointments")
public class AppointmentsController {

    private final AppointmentBook appointmentBook;

    @Autowired
    public AppointmentsController(AppointmentBook appointmentBook) {
        this.appointmentBook = appointmentBook;
    }

    @GetMapping
    public Map get() {
        return appointmentBook.getAppointmentsForToday();
    }

    @GetMapping("/{day}")
    public Map getForDay(@PathVariable @DateTimeFormat(iso=ISO.DATE) Date day, Model model) {
        return appointmentBook.getAppointmentsForDay(day);
    }

    @PostMapping
    public String add(@Valid Appointment appointment) {
        appointmentBook.addAppointment(appointment);
        return "redirect:/appointments";
    }
}

Spring – Волшебство происходит Ядро Spring С Spring ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его @Autowire магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который дает вам все, что вам нужно, на серебряной тарелке Я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного impI, не требовалось никакой настройки или конфигурации веб-сервера, я мог легко написать @Controller , который возвращает экземпляр класса Java, который получает код выше, публикует новую конечную точку rest, сериализованную как JSON, код не требуется. Немного ОТДОХНИТЕ от весеннего веб-MVC – Дайте мне пояснение. С Ломбоком это становится еще лучше, см. Ниже. Спойлер: Вам просто нужно позвонить для этого. Spring – Волшебство происходит Ядро Spring С Spring ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его

Spring – Волшебство происходит Ядро Spring С Spring ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его

Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который дает вам все, что вам нужно, на серебряной тарелке Я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного IMPI, не требовалось никакой настройки или конфигурации веб-сервера, я мог легко написать || @Controller ||, который возвращает экземпляр класса Java, который получает код выше публикует новую конечную точку rest, сериализованную как данные JSSpring, См. || здесь || для справки. Никакого дополнительного кода не требуется. Вы получите переменные пути, правильно декодированные и переданные в параметры метода типов. Назначение || на самом деле может быть сохраняемой сущностью, которая автоматически сериализуется как JSON. Класс || ПОЛУЧИТЬ || конечные точки для получения всех встреч и всех встреч за день, а также || ОПУБЛИКОВАТЬ || конечную точку для создания новой встречи. || а также две |||//назначенные встречи, код не требуется. Немного ОТДОХНИТЕ от весеннего веб-MVC – Дайте мне пояснение. С Ломбоком это становится еще лучше, см. Ниже. Спойлер: Вам просто нужно позвонить для этого.

Spring – Волшебство происходит Ядро Spring С Spring ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его @Autowire магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который дает вам все, что вам нужно, на серебряной тарелке Я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного impI, не требовалось никакой настройки или конфигурации веб-сервера, я мог легко написать

public interface OrderRepository extends CrudRepository { }

Spring – Волшебство происходит Ядро Spring С Spring ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его @Autowire магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который доставляет вам все, что вам нужно, на серебряной тарелке Я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного impI, не требовалось никакой настройки или конфигурации веб-сервера, я мог легко написать

* Spring – Волшебство происходит Ядро Spring С Spring ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его

Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который дает вам все, что вам нужно, на серебряной тарелке Я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного IMPI, не требовалось никакой настройки или конфигурации веб-сервера, я мог легко написать || @Controller ||, который возвращает экземпляр класса Java, который получает код выше, публикует новую конечную точку rest, сериализованную как JSAgain, много магии, но, тем не менее, довольно круто. Смотрите || здесь || для справки. Он также предоставляет ресурс элемента для каждого из элементов, управляемых репозиторием, в соответствии с шаблоном URI ||/заказы/{идентификатор} || . Путь является производным от некапитализированного, множественного, простого имени класса управляемого класса домена. Для этого репозитория Spring Data REST предоставляет ресурс коллекции в ||/заказывает Spring Data || репозитории и даже || Spring Data REST || для непосредственного создания интерфейса REST для моих сущностей. Для очень простых интерфейсов CRUD я мог бы использовать || Данные Spring, См. || здесь || для справки. Никакого дополнительного кода не требуется. Вы получите переменные пути, правильно декодированные и переданные в параметры метода типов. Назначение || на самом деле может быть сохраняемой сущностью, которая автоматически сериализуется как JSON. Класс || ПОЛУЧИТЬ || конечные точки для получения всех встреч и всех встреч за день, а также || ОПУБЛИКОВАТЬ || конечную точку для создания новой встречи. || а также две |||//назначенные встречи, код не требуется. Немного ОТДОХНИТЕ от весеннего веб-MVC – Дайте мне пояснение. С Ломбоком это становится еще лучше, см. Ниже. Спойлер: Вам просто нужно позвонить для этого. Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который дает вам все, что вам нужно, на серебряной тарелке Я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного IMPI, не требовалось никакой настройки или конфигурации веб-сервера, я мог бы легко написать || @Controller ||, который возвращает экземпляр класса Java, который получает приведенный выше код, публикует новую конечную точку rest, сериализованную как jswвремя сканирования пути к классам для управляемых классов Spring, он находит интерфейс и создает реализацию для репозитория на лету, который вы фактически используете для извлечения сущностей из базы данных (а также для всех операций CRUD), плюс он создаст контроллер REST, который будет обслуживать запросы в это хранилище. Опять же, много магии, но все же довольно круто. Смотрите || здесь || для справки. Он также предоставляет ресурс элемента для каждого из элементов, управляемых репозиторием, в соответствии с шаблоном URI ||/заказы/{идентификатор} || . Путь является производным от некапитализированного, множественного, простого имени класса управляемого класса домена. Для этого репозитория Spring Data REST предоставляет ресурс коллекции в ||/заказывает Spring Data || репозитории и даже || Spring Data REST || для непосредственного создания интерфейса REST для моих сущностей. Для очень простых интерфейсов CRUD я мог бы использовать || Данные Spring, См. || здесь || для справки. Никакого дополнительного кода не требуется. Вы получите переменные пути, правильно декодированные и переданные в параметры метода типов. Назначение || на самом деле может быть сохраняемой сущностью, которая автоматически сериализуется как JSON. Класс || ПОЛУЧИТЬ || конечные точки для получения всех встреч и всех встреч за день, а также || ОПУБЛИКОВАТЬ || конечную точку для создания новой встречи. || а также две |||//назначенные встречи, код не требуется. Немного ОТДОХНИТЕ от весеннего веб-MVC – Дайте мне пояснение. С Ломбоком это становится еще лучше, см. Ниже. Спойлер: Вам просто нужно позвонить для этого.

Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который дает вам все, что вам нужно, на серебряной тарелке Я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного IMPI, не требовалось никакой настройки или конфигурации веб-сервера, я мог легко написать || @ Controller ||, который возвращает экземпляр класса Java, который получает код выше, публикует новую конечную точку rest, сериализованную как интеграционные тесты JSSpring, сканируя путь к классам для управляемых классов Spring, он находит интерфейс и создает реализацию для репозитория на лету, который вы фактически используете для извлечения сущностей из базы данных (а также для всех операций CRUD), плюс он создаст контроллер REST, который будет обслуживать запросы в это хранилище. Опять же, много магии, но все же довольно круто. Смотрите || здесь || для справки. Он также предоставляет ресурс элемента для каждого из элементов, управляемых репозиторием, в соответствии с шаблоном URI ||/заказы/{идентификатор} || . Путь является производным от некапитализированного, множественного, простого имени класса управляемого класса домена. Для этого репозитория Spring Data REST предоставляет ресурс коллекции в ||/заказывает Spring Data || репозитории и даже || Spring Data REST || для непосредственного создания интерфейса REST для моих сущностей. Для очень простых интерфейсов CRUD я мог бы использовать || Данные Spring, См. || здесь || для справки. Никакого дополнительного кода не требуется. Вы получите переменные пути, правильно декодированные и переданные в параметры метода типов. Назначение || на самом деле может быть сохраняемой сущностью, которая автоматически сериализуется как JSON. Класс || ПОЛУЧИТЬ || конечные точки для получения всех встреч и всех встреч за день, а также || ОПУБЛИКОВАТЬ || конечную точку для создания новой встречи. || а также две |||//назначенные встречи, код не требуется. Немного ОТДОХНИТЕ от весеннего веб-MVC – Дайте мне пояснение. С Ломбоком это становится еще лучше, см. Ниже. Спойлер: Вам просто нужно позвонить для этого.

Spring – Волшебство происходит Ядро Spring С Spring ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его @Autowire магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который дает вам все, что вам нужно, на серебряной тарелке Я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного impI, не требовалось никакой настройки или конфигурации веб-сервера, я мог легко написать @Controller , который возвращает экземпляр класса Java, который получает код выше, публикует новую конечную точку rest, сериализованную как JS, используя

@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTests {

    @MockBean
    private RemoteService remoteService;

    @Autowired
    private MyService service;

    @Autowired
    private MockRestServiceServer remoteServer;

    @Test
    public void exampleTest() {
        this.remoteServer.expect(requestTo("/greet/details"))
                .andRespond(withSuccess("hello", MediaType.TEXT_PLAIN));
        given(this.remoteService.someCall()).willReturn("world");

        String greeting = this.service.callRestService();

        assertThat(greeting).isEqualTo("hello world");
    }
}

Spring – Волшебство происходит Ядро Spring С Spring ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его @Autowire магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который дает вам все, что вам нужно, на серебряной тарелке Я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного impI, не требовалось никакой настройки или конфигурации веб-сервера, я мог бы легко написать @Controller , который возвращает экземпляр класса Java, который получает код выше, публикует новую конечную точку rest, сериализованную как JS. Как видите, в этом коде много чего происходит. Использование Mockito для макета объектов в тестах работает как шарм, AssertJ для тестовых утверждений и даже для интеграционных тестов с полной настройкой с использованием @SpringBootTest с реальными серверами HTTP-макетов и базами данных в памяти, выполняющими полный тест приложения без каких-либо внешних ресурсов. Тесты интеграции Spring При сканировании пути к классам для управляемых классов Spring он находит интерфейс и создает реализацию для репозитория “на лету”, которую вы фактически используете для извлечения сущностей из базы данных (и всех операций CRUD), а также создаст контроллер REST, который будет обслуживать запросы в этот репозиторий. Опять же, много магии, но все же довольно круто. Смотрите

Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который дает вам все, что вам нужно, на серебряной тарелке Я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного IMPI, не требовалось никакой настройки или конфигурации веб-сервера, я мог легко написать || @Controller ||, который возвращает экземпляр класса Java, который получает код выше, публикует новую конечную точку rest, сериализованную как безопасность JSSpring В конце, проверка с использованием || AssertJ || выполнена. Вызывается someCall ||, он вернет “мир”. Когда метод |||/MyService || . Удаленная служба || вашего приложения издевается, которая, как предполагается, вызывается тестируемым классом, затем запрашивается служба ||, которая ответит один раз ||/приветствие/подробности ||. Во-первых, запускается реальный веб-сервер с вызовом || MockRestServiceServer Как вы видите, в этом коде многое происходит. Использование || Mockito || для макета объектов в тестах работает как шарм, || AssertJ || для тестовых утверждений и даже для интеграционных тестов с полной настройкой с использованием || @SpringBootTest || с реальными серверами HTTP-макетов и базами данных в памяти, выполняющими полный тест приложения без каких-либо внешних ресурсов. Тесты интеграции Spring При сканировании пути к классам для управляемых классов Spring он находит интерфейс и создает реализацию для репозитория “на лету”, которую вы фактически используете для извлечения сущностей из базы данных (и всех операций CRUD), а также создаст контроллер REST, который будет обслуживать запросы в этот репозиторий. Опять же, много магии, но все же довольно круто. Смотрите || здесь || для справки. Он также предоставляет ресурс элемента для каждого из элементов, управляемых репозиторием, в соответствии с шаблоном URI ||/заказы/{идентификатор} || . Путь является производным от некапитализированного, множественного, простого имени класса управляемого класса домена. Для этого репозитория Spring Data REST предоставляет ресурс коллекции в ||/заказывает Spring Data || репозитории и даже || Spring Data REST || для непосредственного создания интерфейса REST для моих сущностей. Для очень простых интерфейсов CRUD я мог бы использовать || Данные Spring, См. || здесь || для справки. Никакого дополнительного кода не требуется. Вы получите переменные пути, правильно декодированные и переданные в параметры метода типов. Назначение || на самом деле может быть сохраняемой сущностью, которая автоматически сериализуется как JSON. Класс || ПОЛУЧИТЬ || конечные точки для получения всех встреч и всех встреч за день, а также || ОПУБЛИКОВАТЬ || конечную точку для создания новой встречи. || а также две |||//назначенные встречи, код не требуется. Немного ОТДОХНИТЕ от весеннего веб-MVC – Дайте мне пояснение. С Ломбоком это становится еще лучше, см. Ниже. Спойлер: Вам просто нужно позвонить для этого.

Spring – Волшебство происходит Ядро Spring С Spring ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его @Autowire магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который дает вам все, что вам нужно, на серебряной тарелке Я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного IMPI, не требовалось никакой настройки или конфигурации веб-сервера, я мог легко написать

Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который дает вам все, что вам нужно, на серебряной тарелке Я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного IMPI, не требовалось никакой настройки или конфигурации веб-сервера, я мог бы легко написать || @ Controller ||, который возвращает экземпляр класса Java, который получает код выше, публикует новую конечную точку rest, сериализованную как загрузка JSSpring, надеюсь, скоро будет проведен капитальный ремонт. Проще говоря, Spring security большую часть времени отстой. Как только вы начнете его хоть немного настраивать, он никогда не будет работать так, как вы ожидали, и в конечном итоге вы потратите часы и дни на его исправление методом проб и ошибок. К сожалению, ИМХО, он плохо спроектирован (с точки зрения удобства использования) и еще хуже документирован. Поставщик аутентификации || . Он поставляется с множеством готовых к использованию реализаций, а также возможностью написать свой собственный || Единственным недостатком было использование || Spring Security ||, который выполняет аутентификацию и авторизацию. Безопасность пружины В конце выполняется проверка с использованием || AssertJ ||. Вызывается someCall ||, он вернет “мир”. Когда метод |||/MyService || . Удаленная служба || вашего приложения издевается, которая, как предполагается, вызывается тестируемым классом, затем запрашивается служба ||, которая ответит один раз ||/приветствие/подробности ||. Во-первых, запускается реальный веб-сервер с вызовом || MockRestServiceServer Как вы видите, в этом коде многое происходит. Использование || Mockito || для макета объектов в тестах работает как шарм, || AssertJ || для тестовых утверждений и даже для интеграционных тестов с полной настройкой с использованием || @SpringBootTest || с реальными серверами HTTP-макетов и базами данных в памяти, выполняющими полный тест приложения без каких-либо внешних ресурсов. Тесты интеграции Spring При сканировании пути к классам для управляемых классов Spring он находит интерфейс и создает реализацию для репозитория “на лету”, которую вы фактически используете для извлечения сущностей из базы данных (и всех операций CRUD), а также создаст контроллер REST, который будет обслуживать запросы в этот репозиторий. Опять же, много магии, но все же довольно круто. Смотрите || здесь || для справки. Он также предоставляет ресурс элемента для каждого из элементов, управляемых репозиторием, в соответствии с шаблоном URI ||/заказы/{идентификатор} || . Путь является производным от некапитализированного, множественного, простого имени класса управляемого класса домена. Для этого репозитория Spring Data REST предоставляет ресурс коллекции в ||/заказывает Spring Data || репозитории и даже || Spring Data REST || для непосредственного создания интерфейса REST для моих сущностей. Для очень простых интерфейсов CRUD я мог бы использовать || Данные Spring, См. || здесь || для справки. Никакого дополнительного кода не требуется. Вы получите переменные пути, правильно декодированные и переданные в параметры метода типов. Назначение || на самом деле может быть сохраняемой сущностью, которая автоматически сериализуется как JSON. Класс || ПОЛУЧИТЬ || конечные точки для получения всех встреч и всех встреч за день, а также || ОПУБЛИКОВАТЬ || конечную точку для создания новой встречи. || а также две |||//назначенные встречи, код не требуется. Немного ОТДОХНИТЕ от весеннего веб-MVC – Дайте мне пояснение. С Ломбоком это становится еще лучше, см. Ниже. Спойлер: Вам просто нужно позвонить для этого.

Spring – Волшебство происходит Ядро Spring С || Spring || ядром, я, очевидно, смог заменить такой уродливый класс начальной загрузки его || @Autowire || магией и, самое главное, без какого-либо XML Nэто ядро Spring: Внедрение зависимостей. необходимо: Это практически дворецкий, который дает вам все, что вам нужно, на серебряной тарелке Я фактически полностью отказался от шаблона “интерфейс для каждого класса”, за исключением мест, где мне требовалось более одного IMPI, не нуждался в настройке или настройке веб-сервера, я мог легко написать || @ Controller ||, который возвращает экземпляр класса Java, который получает код выше, публикует новую конечную точку rest, сериализованную как загрузка JSSpring, позволяет легко создавать автономные приложения на основе Spring, которые вы можете “просто запустить”. Весенний ботинок Я надеюсь, что скоро будет сделан какой-то капитальный ремонт. Проще говоря, Spring security большую часть времени отстой. Как только вы начнете его хоть немного настраивать, он никогда не будет работать так, как вы ожидали, и в конечном итоге вы потратите часы и дни на его исправление методом проб и ошибок. К сожалению, ИМХО, он плохо спроектирован (с точки зрения удобства использования) и еще хуже документирован. Поставщик аутентификации || . Он поставляется с множеством готовых к использованию реализаций, а также возможностью написать свой собственный || Единственным недостатком было использование || Spring Security ||, который выполняет аутентификацию и авторизацию. Безопасность пружины В конце выполняется проверка с использованием || AssertJ ||. Вызывается someCall ||, он вернет “мир”. Когда метод |||/MyService || . Удаленная служба || вашего приложения издевается, которая, как предполагается, вызывается тестируемым классом, затем запрашивается служба ||, которая ответит один раз ||/приветствие/подробности ||. Во-первых, запускается реальный веб-сервер с вызовом || MockRestServiceServer Как вы видите, в этом коде многое происходит. Использование || Mockito || для макета объектов в тестах работает как шарм, || AssertJ || для тестовых утверждений и даже для интеграционных тестов с полной настройкой с использованием || @SpringBootTest || с реальными серверами HTTP-макетов и базами данных в памяти, выполняющими полный тест приложения без каких-либо внешних ресурсов. Тесты интеграции Spring При сканировании пути к классам для управляемых классов Spring он находит интерфейс и создает реализацию для репозитория “на лету”, которую вы фактически используете для извлечения сущностей из базы данных (и всех операций CRUD), а также создаст контроллер REST, который будет обслуживать запросы в этот репозиторий. Опять же, много магии, но все же довольно круто. Смотрите || здесь || для справки. Он также предоставляет ресурс элемента для каждого из элементов, управляемых репозиторием, в соответствии с шаблоном URI ||/заказы/{идентификатор} || . Путь является производным от некапитализированного, множественного, простого имени класса управляемого класса домена. Для этого репозитория Spring Data REST предоставляет ресурс коллекции в ||/заказывает Spring Data || репозитории и даже || Spring Data REST || для непосредственного создания интерфейса REST для моих сущностей. Для очень простых интерфейсов CRUD я мог бы использовать || Данные Spring, См. || здесь || для справки. Никакого дополнительного кода не требуется. Вы получите переменные пути, правильно декодированные и переданные в параметры метода типов. Назначение || на самом деле может быть сохраняемой сущностью, которая автоматически сериализуется как JSON. Класс || ПОЛУЧИТЬ || конечные точки для получения всех встреч и всех встреч за день, а также || ОПУБЛИКОВАТЬ || конечную точку для создания новой встречи. || а также две |||//назначенные встречи, код не требуется. Немного ОТДОХНИТЕ от весеннего веб-MVC – Дайте мне пояснение. С Ломбоком это становится еще лучше, см. Ниже. Спойлер: Вам просто нужно позвонить для этого. Мы придерживаемся самоуверенного взгляда на платформу Spring и сторонние библиотеки, чтобы вы могли начать работу с минимальной суетой. Большинству приложений Spring Boot требуется очень небольшая конфигурация Spring.

  • Смотрите здесь для справки.

Spring boot собирает воедино все кусочки, применяет разумную конфигурацию по умолчанию, и все готово.

Если вам нужен очень забавный и очень хороший пример живого кодирования, я настоятельно рекомендую видео Джоша Лонга Приложения “Bootiful” с Spring Boot – Ух ты, такой классный!

JPA/Переход в спящий режим

Когда я однажды использовал Hibernate много лет назад, там также был этот ад конфигурации XML Я описал это ранее. Но с недавним JPA вы просто делаете

@Entity
public class Customer {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  private String firstname;
  private String lastname;

  // … methods omitted or replaced by Lombok
} 

Смотрите здесь для справки.

а вместе с хранилищами данных Spring вы можете легко получить доступ к своим сущностям. Это означает, что вы просто описываете данные, с которыми работаете, и вам не нужно думать о том, как их получить.

Самое лучшее, что вам не нужно писать никакого SQL. Hibernate очень хорош в создании оптимизированных запросов. Он извлекет данные из базы данных и сопоставит их с классом @Entity . Если у вас есть какие-то уродливые имена для таблиц или столбцов, вы можете просто аннотировать поля. Вышеуказанный класс ожидает таблицу КЛИЕНТ со столбцами ID , ИМЯ и ФАМИЛИЯ`. Вы можете настроить все, что захотите, если вам нужно получить доступ к устаревшей базе данных, например.

Ломбок – Больше Никаких Добытчиков

Когда вышла Java 8, я был очень впечатлен тем, как этот старый язык смог развиваться. Однако, с моей точки зрения, не хватало двух вещей: сопоставления с образцом и способа избавиться от геттеров и сеттеров.

У нас все еще нет сопоставления с образцом (как, например, в Erlang), но – и это действительно удивительно – мы можем избавиться от геттеров и сеттеров с помощью библиотеки. Многие фреймворки полагаются на существование геттеров и сеттеров, гибернации, Джексона и самой весны.

Когда я впервые увидел Ломбок Я подумал, что это, должно быть, какая-то магия генерации кода или – что еще хуже – какой-то трюк с отражением времени выполнения. Кроме того, сайт выглядел так, как будто он был из 90-х годов. Но когда я проверил это, оказалось, что я был совершенно неправ. Они используют функцию javac , аннотации во время компиляции. Таким образом, во время компиляции выполняется код Lombok и генерирует дополнительный байтовый код, который не создает дополнительных накладных расходов во время выполнения (по сравнению с написанием геттеров и сеттеров вручную) и без промежуточного кода Java.

Вспомните Службу общественного питания сверху. Используя @Allargsconstructor , Ломбок создает конструктор для всех участников.

`java @Сервис @AllArgsConstructor @Sl4j общедоступный класс FooService {

private final FooRepository repository;
private final MyProperties properties;

public getUri(String path) {
    log.debug("Building uri from base Url {} and path {}", properties.getSomeUrl(), path)
    return properties.getSomeUrl() + path;
}

} `

Использование @Sl4j , мы получаем бесплатный регистратор (вместо того, чтобы делать Logger.getLogger(...) ) , и есть больше хороших вещей, таких как генерация @В строку и @Equals и хэш- код .

С Spring 4.3 вы даже можете полностью отказаться от @Autowire .

`java @Конфигурация ) @Получатель @Мои свойства публичного класса сеттера {

private String someUrl;
private Integer someTimeout;

} `

Приведенный выше код можно использовать в качестве свойств spring для настройки приложения. Вы можете возразить, что в этом фрагменте больше аннотаций, чем кода, и это правда. Но я бы все равно предпочел это написанию всего шаблонного кода самостоятельно.

Это позволяет вам записать файл YAML, подобный следующему, и поместить его рядом с jar, чтобы изменить конфигурацию:

ямл мой.приложение: некоторые-url: http://foo.bar некоторое время ожидания: 5000

Да, это автоматически позволит вам использовать правильные имена, такие как некоторый тайм-аут все еще знаете, как сопоставить это с некоторым тайм-аутом . Вы получите типобезопасную конфигурацию для своего приложения бесплатно. Вы даже можете добавить @Validated вместе, например, с @Max(1000) .

Знаток

Maven – это инструмент управления библиотеками. Хорошо, Maven – это много XML, хорошо но это просто работает как заклинание. Я работал с Ant, и мне было так больно получать тот же результат.

Я с нетерпением ждал возможности использовать Gradle в проекте Android и, боже мой, это действительно плохо. Вам нужно будет написать исполняемые сценарии, которые могут делать что угодно (и делать что угодно, особенно в тех случаях, когда вы этого не хотите). Вы никогда не знаете, вызываете ли вы этот метод или его конфигурацию. В итоге я потратил часы и дни на отладку своего сценария сборки, пока он не сделал то, что я хотел.

Просто из-за XML Maven четко определен, и вы почти не можете ломать вещи так, как это не было задумано. Maven – это библиотечные зависимости, выполненные правильно, особенно если сравнивать их с другими “менеджерами пакетов”, которые загружают код, создают его (XCODE, Erlang) или такое дерьмо, как NPM и Bower. Maven – это просто интегрированная часть вашего процесса сборки, нет необходимости загружать библиотеку заранее, как в пип (Python), вы всегда получите точную версию этой библиотеки для того самого проекта, который вы создаете.

Ява

Как упоминалось выше, Java 8 поставляется с некоторыми функциональными функциями, и лямбды довольно удобны, хотя они не обязательно функциональны. Поначалу потоки выглядят великолепно, но в большинстве случаев вы получите спагетти-код, который никто (даже вы через неделю) не сможет прочитать. Чаще всего вам лучше использовать старый добрый цикл for.

Но, как правило, он старается писать функциональный код (что было возможно с первой версии Java) как можно больше. Это означает, что метод всегда должен возвращать значение (не пустое), и он всегда должен возвращать одно и то же значение для одних и тех же параметров. Для этого необходимо

  • Не использовать системные вызовы (например, currentTimeMillis() )
  • Никакого взаимодействия с файлами, базами данных и т.д.
  • Используйте переменные класса

Очевидно, что если вы сделаете это на 100%, ваше приложение совершенно бесполезно, потому что у вас нет ни способа контролировать его, ни получить какой-либо результат. Поэтому я стараюсь сохранить свою основную бизнес-логику как можно более чистой и вывести побочные эффекты как можно дальше за пределы. Это приносит большую пользу тестированию.

интегрированная среда разработки

В прошлом я действительно перешел через множество IDE, начиная с QBasic, Turbo Pascal, Visual Studio, Eclipse, NetBeans, XCODE и даже vim . Но я потерял свое сердце из-за IntelliJ IDEA , которая является единственной лучшей IDE, которую я когда-либо использовал. Все начинается с того, что оно красивое и быстрое, поддерживает очень хорошие и интуитивно понятные сочетания клавиш, вы можете автоматически набирать текст и автоматически фильтровать все меню, даже контекстные меню. Это позволяет использовать мощные рефакторинги и генерировать код для вас. Я поддерживаю очень хорошую отладку, а также показываю покрытие кода в строке.

Возможно, вы сейчас довольны своей ИДЕЕЙ, но вам следовало бы хотя бы раз попробовать ИДЕЮ и посмотреть видео об ее функциях.

Особенно когда я использовал XCode для своего проекта приложения, я чувствовал себя как в каменном веке по сравнению с IntelliJ. К сожалению, даже код приложения JetBrains по-прежнему требует XCODE для некоторых вещей.

Это экосистема

Так что дело не в языке. Дело не в СТОРОНЕ или инструменте сборки. Это все вместе взятое делает разработку Java быстрой и увлекательной.

Оригинал: “https://dev.to/stealthmusic/modern-java-development-is-fast”