Spring Core part 2 Flashcards

1
Q

Какие есть ограничения для auto-wiring ?

A

Какие есть ограничения для auto- wiring?

Overriding: Explicit dependencies in property and constructor-arg settings always override autowiring. You cannot autowire simple properties such as primitives, Strings, and Classes (and arrays of such simple properties). This limitation is by-design.

auto-wiring нельзя использовать для примитивов, строк и классов (Classes) если они не помечены как спринг компоненты.

{Для примитивов + строки надо использовать @Value аннотацию…

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Как сделать иньекцию null значения ? (не надо)

A

при помощи Java config = > используя аннотацию @Value через xml config

  1. Через конструктор:

  1. Через property: ​

ключевые слова constructor-arg

property name “…. “

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Что такое java-based конфигурация в Spring. Примеры ?

A

Что такое java-based конфигурация в Spring. Примеры ?

см аудио в телеграме

*****

Q13. What is the Spring Java-Based Configuration?

It’s one of the ways of configuring Spring-based applications in a type-safe manner. It’s an alternative to the XML-based configuration.

https://www.baeldung.com/spring-interview-questions#Q13

*******

@Configuration

@EnableWebSecurity public class MyWebSecurityConfiguration extends

WebSecurityConfigurerAdapter { @Override

public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers(“7 resources/**”); }

// Possibly more overridden methods … }

Дополнение:

@Override
protected void configure(HttpSecurity http) throws Exception { http
.authorizeRequests()
.antMatchers(“/”)
.permitAllO
.antMatchers(‘7dashboard/home/**”)
.hasAnyRole(“USER”, “ADMIN”) .antMatchers(‘7dashboard/users/**”)
.hasRole(“ADMIN”)
.antMatchers(“/rest/users/**”)
.hasRole(“ADMIN”)
.anyRequest()
.authenticated()
,and()
.formLoginO
.loginPage(‘7”)
.permitAllO;

Дополнение:

  1. Каковы различные способы настроить класс как Spring Bean?
    Существует несколько способов работы с классами в Spring:

XML конфигурация:

1

Java based конфигурация. Все настройки и указания бинов прописываются в java коде:

@Configuration
@ComponentScan(value="ru.javastudy.spring.main")
public class MyConfiguration {

@Bean
public MyService getService(){
return new MyService();
}
}
1
2
3
4
5
6
7
8
9
@Configuration
@ComponentScan(value=”ru.javastudy.spring.main”)
public class MyConfiguration {

@Bean
public MyService getService(){
return new MyService();
}
}
Для извлечения бина из контекста используется следующий подход:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
MyConfiguration.class);
MyService service = ctx.getBean(MyService.class);
1
2
3
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
MyConfiguration.class);
MyService service = ctx.getBean(MyService.class);
Annotation based конфигурация. Можно использовать внутри кода аннотации @Component, @Service, @Repository, @Controller для указания классов в качестве спринг бинов. Для их поиска и управления контейнером прописывается настройка в xml файле:

1

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Для чего используется аннотация Qualifier

A

Для чего используется аннотация Qualifier?

Используется вместе с Autowired когда нужно делать инъекции зависимости, а при этом у нас несколько реализаций этой зависимости совпадающих по типу( или имплиментирующих один интерфейс ) . Принимает String параметр.

*****

или например, у нас 2 бина dependent на 1 класс и спринг не знает какой из них заинжектить

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Для чего используется аннотация @Веаn

A

Для чего используется аннотация @Веаn? Аннотация @Веаn используется для указания того, что метод создает, настраивает и инициализирует новый объект, управляемый Spring IоС контейнером.

ключевое слово метод

******

The @Bean annotation is used to indicate that a method instantiates, configures, and initializes a new object to be managed by the Spring IoC container. For those familiar with Spring’s <beans></beans> XML configuration, the @Bean annotation plays the same role as the <bean></bean> element. You can use @Bean-annotated methods with any Spring @Component. However, they are most often used with @Configuration beans.

https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-java

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Для чего предназначена аннотация @Required

A

Для чего предназначена аннотация @Required?

Применяется к аргументу setter-метода в бине и указывает на то, что соответствующее поле бина должно быть установлено на момент конфигурирования всех бинов в IoC Contrainer. Если же значение не будет установлено, будет выброшено исключение. Использование аннотации позволит избежать NullPointerException в ран тайме. Используется например если мы не хотим вносить в аргумент конструктора те или иные поля.

Дополнение:

нужен для того чтобы в run time у нас не возникло null point - тер exception ( например когда у нас не дефолтный скоуп и мы используем autowiring )

https://www.mkyong.com/spring/spring-dependency-checking-with-required-annotation/

два способа как можно объявить required - > через xml обернуш таги бина в таги
class=”org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor”/> …

и второй способ через аннотации

*****

Spring’s dependency checking in bean configuration file is used to make sure all properties of a certain types (primitive, collection or object) have been set. In most scenarios, you just need to make sure a particular property has been set, but not all properties..

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Для чего предназначена аннотация @Component

A

Для чего предназначена аннотация @Component?

Аннотацией компонент помечаются классы которые будут инициализироваться и управляться через Spring IoC Container. Говорит нам о том, что внутри класса помеченного анн component или ее наследников ( скорее всего мы сможем найти такие аннотации как @Bean or @Autowiring. << @Autowiring не возможен без аннотации component или ее наследников >> ??? Общая аннотация для любого пользовательского компонента Spring приложения.

http://spring-projects.ru/guides/lessons/lesson-2/

В чём разница между @Bean и @Component?

@Bean используется в конфигурационных классах Spring. Он используется для непосредственного создания бина.

++++++++++++++++++++++++++++++++++++++++++++++++++++

Другой основной аннотацией является @Component, а также её наследники @Repository, @Service и @Controller. Все они являются общими шаблонами для любых компонентов, управляемыми контейнеером. @Repository, @Service и @Controller рекомендуется использовать в тех случаях, когда вы можете отнести аннотируемый класс к определенному слою, например DAO, либо когда вам необходима поддержка функциональности, которую предоставляет аннотация. Также эти аннотации могут иметь дополнительный смысл в будущих версиях Spring Framework. В остальных же случаях достаточно использовать аннотацию @Component.​

+++++++++

Все spring-бины помечаются одной из четырёх аннотаций:

Controller - бины, содержащие маппинг входящих http-запросов

Service - бины, реализующие бизнес-логику приложения

Repository - бины, работающие с БД

Component - все остальные бины

Component - наиболее обобщённая аннотация и три другие являются её частными случаями. По большому счёту, разницы между ними нет и почти любой бин будет работать с любой аннотацией, но с точки зрения логики приложения лучше придерживаться такого деления.

@Component используется со всеми классами, которыми должен управлять Spring. Когда Spring видит класс с @Component, Spring определяет этот класс как кандидата для создания bean.

******

We can use @Component across the application to mark the beans as Spring’s managed components. Spring only pick up and registers beans with @Component and doesn’t look for @Service and @Repository in general.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Какие есть наследники у аннотации @Component

A

Какие есть наследники у аннотации @Component?

@Service(Сервис-слой приложения)

@Repository (Доменный слой)

@Controller (Слой представления)

@RestController

@Configuration

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Какое предназначение аннотаций

Scope

postConstruct

PreDestroy

A

Какое предназначение аннотаций ©Scope, @ PostConstruct, @PreDestroy?

@Scope - Аннотация для установки области видимости и управления жизненным циклом бина в рамках того applicationContext в котором он используется

@ PostConstruct - Аннотация для метода, который будет вызван после вызова конструктора бина.

@PreDestroy - Аннотация для метода, который будет вызван перед уничтожением бина.

http://www.baeldung.com/spring-bean-scopes

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Назовите все способы объявления бина ( xml and annotation )

A

Назовите способы объявления бина? xml / annotation

  1. Используя XML cbean name=”transferService” class=”com.becomejavasenior.TransferServicelmpl”/>

Используя аннотации:

  1. @Bean
  2. @Named
  3. @Component
  4. @Service
  5. @Repository
  6. @Controller and RestController …
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Какие есть способы получить бин ?

A
  1. Используя application контекст:

JavaConfigApplicationContext context = new JavaConfigApplicationContext(…); // returns the myService() primary bean Service service = context.getBean(Service.class); Map matchingBeans = context.getBeansOfType(Service.class); Service service = context.getBean(Service.class, “myService”);

  1. Используя bean wiring:

@Component class CompactDiscPlayer { (@Autowired CompactDiscPlayer( @Qualifier(“hybridTheory”) final CompactDisc compactDisc) { } }

если коротко то :

  1. можно обратиться к контексту
  2. можно autowiring ;
  3. resource
  4. inject

*******

  1. Каковы различные способы настроить класс как Spring Bean?
    Существует несколько способов работы с классами в Spring:

XML конфигурация:

1

Java based конфигурация. Все настройки и указания бинов прописываются в java коде:

@Configuration
@ComponentScan(value="ru.javastudy.spring.main")
public class MyConfiguration {

@Bean
public MyService getService(){
return new MyService();
}
}
1
2
3
4
5
6
7
8
9
@Configuration
@ComponentScan(value=”ru.javastudy.spring.main”)
public class MyConfiguration {

@Bean
public MyService getService(){
return new MyService();
}
}
Для извлечения бина из контекста используется следующий подход:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
MyConfiguration.class);
MyService service = ctx.getBean(MyService.class);
1
2
3
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
MyConfiguration.class);
MyService service = ctx.getBean(MyService.class);
Annotation based конфигурация. Можно использовать внутри кода аннотации @Component, @Service, @Repository, @Controller для указания классов в качестве спринг бинов. Для их поиска и управления контейнером прописывается настройка в xml файле:
http://javastudy.ru/interview/jee-spring-questions-answers/

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Можем ли мы Динамичиски добавить Бин ? вот у нас все стартануло можем ли бин добавить и что для этого нужно сделать ?

A

да ! через ContextRefreshedEvent можно это сделать

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Какие есть стандартные события в Spring Framework ( не надо)

A

ContextStartedEvent

ContextRefreshedEvent

ContextStoppedEvent

ContextClosedEvent

в Spring MVC еще плюс : RequestHandledEvent - применимо только для web-приложений с использованием Spring DispatcherServlet

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Можно ли назвать Spring scope “singleton” GOF синглетоном.

A

Можно ли назвать Spring scope “singleton” GOF ( gang of four) синглтон? Нет, шаблон Singleton описывается как один класс (соотв. один объект) на один загрузчик (class loader) - то есть одну JVM. А в Spring scope singleton определяется в контейнере, и может быть в Spring приложении несколько контейнеров которые используют один и тот же class loader.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Как установить для Spring bean больше одного имени ?

A

@Configuration

public class SampleConfig { @Bean(name = {“Service-B”, “Service-C”}) public SampleService createMirroredService(@Autowired SampleService service) { return service; }}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Что случится если будет циклическая зависимость в конструкторе Бинов ?

bean A зависит от bean B ; bean B зависит от bean A

A

если не autowiring, то Ошибки не будет,

Spring

  1. сначала создаст bean
  2. затем сделает injection бинов друг к другу

есть автовайринг через конструкторы то упадет на старте

если autowiring через setter то будет работать

17
Q

Базовые аннотации Spring

A

http://prntscr.com/n9p585

@Component - Аннотация для любого компонента фреймворка.

@Service - (Сервис-слой приложения) Аннотация, объявляющая, что этот класс представляет собой сервис – компонент сервис-слоя.

Сервис является подтипом класса @Component. Использование данной аннотации позволит искать бины-сервисы автоматически.

@Repository - (Доменный слой) Аннотация показывает, что класс функционирует как репозиторий и требует наличия прозрачной трансляции исключений. Преимуществом трансляции исключений является то, что слой сервиса будет иметь дело с общей иерархией исключений от Spring (DataAccessException) вне зависимости от используемых технологий доступа к данным в слое данных.

@Controller - (Слой представления) Аннотация для маркировки java класса, как класса контроллера. Данный класс представляет собой компонент, похожий на обычный сервлет (HttpServlet) (работающий с объектами HttpServletRequest и HttpServletResponse), но с расширенными возможностями от Spring Framework.

@ResponseBody - Аннотация показывает что данный метод может возвращать кастомный объект в виде xml, json…

@RestController - Аннотация аккумулирует поведение двух аннотаций @Controller и @ResponseBody

@Transactional - Перед исполнением метода помеченного данной аннотацией начинается транзакция, после выполнения метода транзакция коммитится, при выбрасывании RuntimeException откатывается.

@Autowired - Аннотация позволяет автоматически установить значение поля.

@RequestMapping - Аннотация используется для маппинга урл-адреса запроса на указанный метод или класс. Можно указывать конкретный HTTP-метод, который будет обрабатываться (GET/POST), передавать параметры запроса.

@ModelAttribute - Аннотация, связывающая параметр метода или возвращаемое значение метода с атрибутом модели, которая будет использоваться при выводе jsp-страницы.

http://prntscr.com/ngw0nt

@PathVariable - Аннотация, которая показывает, что параметр метода должен быть связан с переменной из урл-адреса.

@Scope - Аннотация для установки области жизни бина: singleton (только один экземпляр бина создается для IoC контейнера; значение по умолчанию ), prototype(создается новый экземпляр бина когда приходит запрос на его создание), request (один экземпляр бина для каждого HTTP запроса ), session (один экземпляр бина для каждой сессии), globalSession (один экземпляр бина для каждой глобальной сессии)

@PostConstruct - Аннотация для метода, который будет вызван после вызова конструктора бина.

@PreDestroy - Аннотация для метода, который будет вызван перед уничтожением бина.

@Profile - Аннотация для создания профилей конфигурации проекта. Может применяться как к бинам так и к конфигурационным классам.

18
Q

Что такое IoC ?

A

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

++++++

то есть нигде в спринг нет слова new для создания объекта, может быть в самой бизнес логике, но для создания объекта спринга не требуется

+++++

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

19
Q

Что такое DI ? dependency injection, это по сути объект IOC

A

Что такое DI ? В computer science, DI концепция определяющая процесс предоставления компоненте приложения объекта, необходимого для работы первоначальной компоненты, которые по своей сути являются такими же полноценными компонентами данного программного приложения , DI осуществляет такой важный принцип проектирования как “принцип единственной ответственности “(single responsobility principle ( SOLID => один из пяти главных принципов ООП ) ). доп : DI является специфичной формой IoC, который происходит через аргументы конструктора, аргументы сеттеров или полей (properties) и интерфейсы ( подчиняясь Dependency inversion principle from ( SOLID ) )

Пример: Колеса и автомобиль

*******

Если объект x (класса X) вызывает методы объекта y (класса Y), то X зависит от Y. Зависимость может быть обращена введением третьего класса, а именно интерфейсного класса I, который должен содержать все методы, которые x может вызвать у объекта y. Кроме того, Y должен реализовать интерфейс I. X и Y сейчас оба зависят от I, и класс X более не зависит от класса Y; предполагается, что X не реализует I.
Это исключение зависимости класса X от Y введением интерфейса I называется Inversion of Control (или Dependency Injection (DI)).” (http://nikcode.blogspot.com/2011/09/spring-inversion-of-control.html)

*****

Q4. What is Dependency Injection?

Dependency Injection, an aspect of Inversion of Control (IoC), is a general concept stating that you do not create your objects manually but instead describe how they should be created. An IoC container will instantiate required classes if needed.

For more details, please refer here.

https://www.baeldung.com/spring-interview-questions#Q4

******

real life example

https://www.dineshonjava.com/dependency-injection-in-spring/

20
Q

Какие есть способы реализации IoC ?

A

Какие есть типы IoC ?

используя DI :

Constructor - based

parametors - based ( через fields ( поля ))

Setter -based

Interface -based ( в спринге нет )

не используя DI :

  • strategy design pattern
  • template method

design pattern

  • Using a contextualized lookup
21
Q

Чем отличается ApplicationContext от BeanFactory ?

A

Чем отличается ApplicationContext от BeanFactory ? ApplicationContext- интерфейс который наследуется от BeanFactory и расширяет его функционал, облегчая реализацию такого функционала как например интернационализация. BeanFactory по сути используется только тогда когда JVM ресурсы в контексте задачи достаточно ограничены. ( пример IoT, мобильные приложения )

*******

Q7. What is the difference between BeanFactory and ApplicationContext?

BeanFactory is an interface representing a container that provides and manages bean instances. The default implementation instantiates beans lazily when getBean() is called.

ApplicationContext is an interface representing a container holding all information, metadata, and beans in the application. It also extends the BeanFactory interface but the default implementation instantiates beans eagerly when the application starts. This behavior can be overridden for individual beans.

For all differences, please refer to the reference.

https://www.baeldung.com/spring-interview-questions#Q7​

22
Q

Какие вы знаете реализации BeanFactory / applicationContext ?

A

Interface BeanFactory Implementing Classes :

  1. xml based ;
  2. annotation based ;
  3. groovy based

xml based : ClassPathXmlApplicationContext XmlWebApplicationContext FileSystemXmlApplicationContext annotation based: AnnotationConfigWebApplicationContext AnnotationConfigApplicationContext

groovy based: GroovyWebApplicationContext GenericGroovyApplicationContext

23
Q

Опишите жизненный цикл bean в Spring framework ?

A

Опишите жизненный цикл bean в Spring framework ?

  • Контейнер находит классы которые определенны как бины в XML или в javaConfig
  • Делаются настройки, которые определены для бина.
  • Вызывается метод setBeanName() если бин реализует BeanNameAware
  • postProcesserBeforelnitialization()
  • Вызывается afterPropertySet() если бин реализует IntializingBean
  • postProcessAfterlnitialization()
  • Если реализуется DisposableBean - вызывается destroy()

***********

Q12. What does the Spring bean lifecycle look like?

First, a Spring bean needs to be instantiated, based on Java or XML bean definition. It may also be required to perform some initialization to get it into a usable state. After that, when the bean is no longer required, it will be removed from the IoC container.

The whole cycle with all initialization methods is shown on the image (source):https://www.baeldung.com/spring-interview-questions#Q5​

http://prntscr.com/nhjxb1

*******

  1. Что такое жизненный цикл Spring Bean?

Жизненный цикл Spring бина — время существования класса. Spring бины инициализируются при инициализации Spring контейнера и происходит внедрение всех зависимостей. Когда контейнер уничтожается, то уничтожается и всё содержимое. Если нам необходимо задать какое-либо действие при инициализации и уничтожении бина, то нужно воспользоваться методами init() и destroy(). Для этого можно использовать аннотации @PostConstruct и @PreDestroy().

1

2

3

4

5

6

7

8

9

10

@PostConstruct

public void init(){

System.out.println(“Bean init method called”);

}

@PreDestroy

public void destroy(){

System.out.println(“Bean destroy method called”);

}

Или через xml конфигурацию:

1

2

3

4

init-method=”init” destroy-method=”destroy”>

http://javastudy.ru/interview/jee-spring-questions-answers/

24
Q

Pros/cons of autowiring

A

Overriding: constructor-arg или property всегда будут переопределять auto-wiring

auto-wiring нельзя использовать для примитивов, строк и классов (Classes) если они не помечены как спринг компоненты

http://prntscr.com/nd3i2h

25
Q

Каковы различные типы автоматического связывания в Spring?

A

Каковы различные типы автоматического связывания в Spring?

Существует четыре вида связывания в спринг:

autowire byName,

autowire byType,

autowire by constructor,

autowiring by @Autowired and @Qualifier annotations

*******

Q5. How can we inject beans in Spring?

A few different options exist:

Setter Injection

Constructor Injection

Field Injection

The configuration can be done using XML files or annotations.

For more details, check this article.

https://www.baeldung.com/spring-interview-questions#Q5