Spring Core part 2 Flashcards
Какие есть ограничения для auto-wiring ?
Какие есть ограничения для 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 аннотацию…
Как сделать иньекцию null значения ? (не надо)
при помощи Java config = > используя аннотацию @Value через xml config
- Через конструктор:
- Через property:
ключевые слова constructor-arg
property name “…. “
Что такое java-based конфигурация в Spring. Примеры ?
Что такое 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;
Дополнение:
- Каковы различные способы настроить класс как 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
Для чего используется аннотация Qualifier
Для чего используется аннотация Qualifier?
Используется вместе с Autowired когда нужно делать инъекции зависимости, а при этом у нас несколько реализаций этой зависимости совпадающих по типу( или имплиментирующих один интерфейс ) . Принимает String параметр.
*****
или например, у нас 2 бина dependent на 1 класс и спринг не знает какой из них заинжектить
Для чего используется аннотация @Веаn
Для чего используется аннотация @Веа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
Для чего предназначена аннотация @Required
Для чего предназначена аннотация @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..
Для чего предназначена аннотация @Component
Для чего предназначена аннотация @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.
Какие есть наследники у аннотации @Component
Какие есть наследники у аннотации @Component?
@Service(Сервис-слой приложения)
@Repository (Доменный слой)
@Controller (Слой представления)
@RestController
@Configuration
Какое предназначение аннотаций
Scope
postConstruct
PreDestroy
Какое предназначение аннотаций ©Scope, @ PostConstruct, @PreDestroy?
@Scope - Аннотация для установки области видимости и управления жизненным циклом бина в рамках того applicationContext в котором он используется
@ PostConstruct - Аннотация для метода, который будет вызван после вызова конструктора бина.
@PreDestroy - Аннотация для метода, который будет вызван перед уничтожением бина.
Назовите все способы объявления бина ( xml and annotation )
Назовите способы объявления бина? xml / annotation
- Используя XML cbean name=”transferService” class=”com.becomejavasenior.TransferServicelmpl”/>
Используя аннотации:
- @Bean
- @Named
- @Component
- @Service
- @Repository
- @Controller and RestController …
Какие есть способы получить бин ?
- Используя 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”);
- Используя bean wiring:
@Component class CompactDiscPlayer { (@Autowired CompactDiscPlayer( @Qualifier(“hybridTheory”) final CompactDisc compactDisc) { } }
если коротко то :
- можно обратиться к контексту
- можно autowiring ;
- resource
- inject
*******
- Каковы различные способы настроить класс как 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/
Можем ли мы Динамичиски добавить Бин ? вот у нас все стартануло можем ли бин добавить и что для этого нужно сделать ?
да ! через ContextRefreshedEvent можно это сделать
Какие есть стандартные события в Spring Framework ( не надо)
ContextStartedEvent
ContextRefreshedEvent
ContextStoppedEvent
ContextClosedEvent
в Spring MVC еще плюс : RequestHandledEvent - применимо только для web-приложений с использованием Spring DispatcherServlet
Можно ли назвать Spring scope “singleton” GOF синглетоном.
Можно ли назвать Spring scope “singleton” GOF ( gang of four) синглтон? Нет, шаблон Singleton описывается как один класс (соотв. один объект) на один загрузчик (class loader) - то есть одну JVM. А в Spring scope singleton определяется в контейнере, и может быть в Spring приложении несколько контейнеров которые используют один и тот же class loader.
Как установить для Spring bean больше одного имени ?
@Configuration
public class SampleConfig { @Bean(name = {“Service-B”, “Service-C”}) public SampleService createMirroredService(@Autowired SampleService service) { return service; }}