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

Что нового весной 4.3?

Быстрое и практичное руководство по новому и прохладному дополнительному выпуску Spring 4.3.

Автор оригинала: baeldung.

Что нового весной 4.3?

1. Обзор

Весенний релиз 4.3 принес некоторые приятные уточнения в основной контейнер, кэширование, JMS, Web MVC и тестирование подмодулей фреймворка.

В этой должности, мы обсудим некоторые из этих улучшений, включая:

  • Неявная инъекция конструктора
  • Поддержка методов интерфейса Java 8 по умолчанию
  • Улучшенное разрешение зависимостей
  • Уточнение абстракции кэша
  • Составной @RequestMapping Варианты
  • @Requestscope, @Sessionscope, @Applicationscope Аннотации
  • @RequestAttribute и @SessionAttribute Аннотации
  • Поддержка библиотек/серверов приложений
  • ИнъекцияПойнт класс

2. Неявная инъекция конструктора

Рассмотрим следующий класс обслуживания:

@Service
public class FooService {

    private final FooRepository repository;

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

Довольно распространенный случай использования, но если вы забыли @Autowired аннотация на конструкторе, контейнер будет бросать исключение ищет конструктора по умолчанию, если вы явно не делаете проводки.

Таким образом, по данным 4.3, вам больше не нужно указывать явную аннотацию впрыска в таком сценарии с одним конструктором. Это особенно элегантно для классов, которые не несут никаких аннотаций на всех:

public class FooService {

    private final FooRepository repository;

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

Весной 4.2 и ниже следующая конфигурация для этого боба не будет работать, потому что Spring не сможет найти конструктора по умолчанию для FooService . Весна 4.3 умнее и автоматически переключит конструктора:


    
    

Аналогичным образом, вы, возможно, заметили, что @Configuration классы исторически не поддерживают впрыск конструктора. По 4,3, они делают, и они, естественно, позволяют @Autowired в сценарии с одним конструктором:

@Configuration
public class FooConfiguration {

    private final FooRepository repository;

    public FooConfiguration(FooRepository repository) {
        this.repository = repository;
    }

    @Bean
    public FooService fooService() {
        return new FooService(this.repository);
    }
}

3. Поддержка методов интерфейса Java 8 по умолчанию

До весны 4.3 методы интерфейса по умолчанию не поддерживались.

Это было нелегко реализовать, потому что даже интроспектор JavaBean JDK не обнаружил методы по умолчанию в качестве аксессуаров. С весны 4.3, getters и setters с реализованные как методы интерфейса значения по умолчанию определены во время впрыска, который позволяет использовать их for instance как общие preprocessors для доступных свойств, как в этом примере:

public interface IDateHolder {

    void setLocalDate(LocalDate localDate);

    LocalDate getLocalDate();

    default void setStringDate(String stringDate) {
        setLocalDate(LocalDate.parse(stringDate, 
          DateTimeFormatter.ofPattern("dd.MM.yyyy")));
    }

}

Эта фасоль теперь может иметь строкаDate имущество вводили:


    

То же самое касается использования тестовых аннотаций, таких как @BeforeTransaction и @AfterTransaction по методу интерфейса по умолчанию. JUnit 5 уже поддерживает свои тестовые аннотации по методам интерфейса по умолчанию, и Весна 4.3 следует примеру. Теперь вы можете абстрагировать общую логику тестирования в интерфейсе и реализовать ее в тестовых классах. Вот интерфейс для тестовых случаев, который регистрирует сообщения до и после транзакций в тестах:

public interface ITransactionalTest {

    Logger log = LoggerFactory.getLogger(ITransactionalTest.class);

    @BeforeTransaction
    default void beforeTransaction() {
        log.info("Before opening transaction");
    }

    @AfterTransaction
    default void afterTransaction() {
        log.info("After closing transaction");
    }

}

Еще одно улучшение, касающееся аннотации @BeforeTransaction, @AfterTransaction и @Transactional является ослабление требования о том, что аннотированные методы должны быть общественные – теперь они могут иметь любой уровень видимости.

4. Улучшенное разрешение зависимостей

Новейшая версия также представляет ОбъектПровиндер , расширение существующего ОбъектФактория интерфейс с удобными сигнатурами, такими как getIfДоступный и getIfUnique для получения фасоли только в том случае, если она существует или если может быть определен один кандидат (в частности: основной кандидат в случае нескольких соответствующих бобов).

@Service
public class FooService {

    private final FooRepository repository;

    public FooService(ObjectProvider repositoryProvider) {
        this.repository = repositoryProvider.getIfUnique();
    }
}

Вы можете использовать такие ОбъектПровиндер ручка для пользовательских целей разрешения во время инициализации, как показано выше, или хранить ручку в поле для позднего разрешения по требованию (как вы обычно делаете с ОбъектФактория ).

5. Уточнение абстракции кэша

Абстракция кэша в основном используется для кэширования значений, которые потребляют процессор и IO. В частности, в случаях использования данный ключ может быть запрошен несколькими потоками (т.е. клиентами) параллельно, особенно при запуске. Синхронизированная поддержка кэша — это давно запрошенная функция, которая уже реализована. Предположим, что следующее:

@Service
public class FooService {

    @Cacheable(cacheNames = "foos", sync = true)
    public Foo getFoo(String id) { ... }

}

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

Весна 4.3 также улучшает кэширование абстракции следующим образом:

  • Выражения SpEL в аннотациях, связанных с кэшем, теперь могут относиться к бобам (т.е. @beanName.method() ).
  • ПараллельноMapCacheManager и ПараллельноМапкаш теперь поддержка сериализации записей кэша с помощью нового магазинByValue атрибут.
  • @Cacheable , @CacheEvict , @CachePut , и @Caching теперь могут использоваться в качестве мета-аннотации для создания пользовательских составленных аннотаций с переопределениями атрибутов.

6. Составные @RequestMapping варианты

Spring Framework 4.3 представляет следующие методы уровня, составленные варианты @RequestMapping аннотация, которая помогает упростить отображение общих методов HTTP и лучше выразить семантику аннотированного метода обработчика.

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

Например, @GetMapping является более короткой формой высказывания @RequestMapping (метод. GET) . В следующем примере показан контроллер MVC, упрощенный с помощью составленного @GetMapping аннотация.

@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();
    }
}

7. @RequestScope, @SessionScope, @ApplicationScope Аннотации

При использовании компонентов, управляемых аннотацией, или Java Config, @RequestScope , @SessionScope и @ApplicationScope аннотации могут быть использованы для назначения компонента в требуемую область. Эти аннотации не только устанавливают область действия фасоли, но и устанавливают режим прокси-сервера с прицелом ScopedProxyMode.TARGET_CLASS.

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

@RequestScope
@Component
public class LoginAction {
    // ...
}
@SessionScope
@Component
public class UserPreferences {
    // ...
}
@ApplicationScope
@Component
public class AppPreferences {
    // ...
}

8. @RequestAttribute и @SessionAttribute Аннотации

Еще две аннотации для введения параметров запроса HTTP в Контроллер появились методы, а именно @RequestAttribute и @SessionAttribute . Они позволяют получить доступ к некоторым уже существующим атрибутам, управляемым по всему миру (т.е. за пределами Контроллер ). Значения для этих атрибутов могут быть предоставлены, например, зарегистрированными экземплярами javax.servlet.Фильтр или org.springframework.web.servlet.HandlerInterceptor .

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

public class ParamInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, 
      HttpServletResponse response, Object handler) throws Exception {
        request.getSession().setAttribute("login", "john");
        request.setAttribute("query", "invoices");
        return super.preHandle(request, response, handler);
    }

}

Такие параметры могут вводиться в Контроллер экземпляр с соответствующими аннотациями к аргументам метода:

@GetMapping
public String get(@SessionAttribute String login, 
  @RequestAttribute String query) {
    return String.format("login = %s, query = %s", login, query);
}

9. Поддержка библиотек/серверов приложений

Spring 4.3 поддерживает следующие библиотечные версии и поколения серверов:

  • Hibernate ORM 5.2 (по-прежнему поддерживает 4.2/4.3 и 5.0/5.1 также, с 3.6 deprecated теперь)
  • Джексон 2,8 (минимум поднялся до Джексона 2,6 “по данным на весну 4,3)
  • OkHttp 3.x (по-прежнему поддерживает OkHttp 2.x бок о бок)
  • Нетти 4.1
  • Откат 1.4
  • Tomcat 8.5.2, а также 9.0 M6

Кроме того, Spring 4.3 встраивает обновленный ASM 5.1 и Objenesis 2.4 в весеннего ядра.jar .

10. Точек инъекций

ИнъекцияПойнт класс новый класс, введенный весной 4.3, который предоставляет информацию о местах, где тот или иной боб вводится , будь то параметр метода/конструктора или поле.

Типы информации, которую вы можете найти с помощью этого класса:

  • Полевые объект – вы можете получить точку инъекции, завернутые в Полевые объект с помощью getField () метод, если фасоль вводится в поле
  • МетодПараметр – Вы можете позвонить getMethodParameter() метод для получения точки инъекции, завернутый в МетодПараметр объект, если фасоль вводится в параметр
  • Член – вызов getMember () метод вернет сущность, содержащую впрыснутую фасоль, завернутую в Член объект
  • Класс – получить заявленный тип параметра или поля, где фасоль в вводили, используя getDeclaredType()
  • Аннотация – с помощью getAnnotations () метод, вы можете получить массив аннотации объектов, которые представляют аннотации, связанные с полем или параметром
  • АннотированныйЭлемент – позвоните getAnnotatedЭлемент () чтобы получить точку инъекции, завернутые в качестве АннотированныйЭлемент объект

Случай, когда этот класс очень полезен, это когда мы хотим создать Логгер бобов на основе класса, к которому они принадлежат:

@Bean
@Scope("prototype")
public Logger logger(InjectionPoint injectionPoint) {
    return Logger.getLogger(
      injectionPoint.getMethodParameter().getContainingClass());
}

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

Затем мы можем ввести фасоль в нашу НазначенияКонтроллер :

@Autowired
private Logger logger;

11. Заключение

В этой статье мы обсудили некоторые из новых функций, представленных с Spring 4.3.

Мы рассмотрели полезные аннотации, которые устраняют шаблонные, новые полезные методы обнаружения и инъекций зависимости и несколько существенных улучшений в Сети и кэширования объектов.

Вы можете найти исходный код для статьи на GitHub .