You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: spring.md
+279Lines changed: 279 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -742,3 +742,282 @@ Dependency Injection and Aspect Oriented Programming
742
742
+ Если вы используете аспекты, убедитесь, что используете точку присоединения как можно более близко, чтобы избежать случайных проблем с обработкой лишних методов.
743
743
+ Пользовательские аннотации могут принести существенные преимущества при использовании AOP.
744
744
+ Используйте dependency injection там, где это принесет явную пользу. Внедрение зависимостей повсюду может добавить сложностей при поддержке проекта.
745
+
746
+
### 1 Для чего нужен Component Scan?
747
+
Если вы понимаете как работает Component Scan, то вы понимаете Spring
748
+
Первый шаг для описания Spring Beans это добавление аннотации — @Component, или @Service, или @Repository.
749
+
Однако, Spring ничего не знает об этих бинах, если он не знает где искать их. То, что скажет Spring где искать эти бины и называется Component Scan. В @ComponentScan вы указываете пакеты, которые должны сканироваться.
750
+
Spring будет искать бины не только в пакетах для сканирования, но и в их подпакетах.
751
+
### 2 Как вы добавите Component Scan в Spring Boot?
752
+
@SpringBootApplication
753
+
public class Application {
754
+
public static void main(String[] args) {
755
+
SpringApplication.run(Application.class, args);
756
+
}
757
+
}
758
+
759
+
@SpringBootApplication определяет автоматическое сканирование пакета, где находится класс Application
760
+
761
+
Всё будет в порядке, ваш код целиком находится в указанном пакете или его подпакетах.
762
+
Однако, если необходимый вам компонент находится в другом пакете, вы должны использовать дополнительно аннотацию @ComponentScan, где перечислите все дополнительные пакеты для сканирования
763
+
764
+
### 3 В чём отличие между @Component и @ComponentScan?
765
+
@Component и @ComponentScan предназначены для разных целей
766
+
767
+
768
+
@Component помечает класс в качестве кандидата для создания Spring бина.
769
+
@ComponentScan указывает где Spring искать классы, помеченные аннотацией @Component или его производной
770
+
771
+
772
+
### 4 Для чего используется аннотация @Bean?
773
+
В классах конфигурации Spring, @Bean используется для определения компонентов с кастомной логикой.
774
+
775
+
776
+
### 5 В чём разница между @Bean и @Component?
777
+
@Bean используется в конфигурационных классах Spring. Он используется для непосредственного создания бина.
778
+
779
+
780
+
@Component используется со всеми классами, которыми должен управлять Spring. Когда Spring видит класс с @Component, Spring определяет этот класс как кандидата для создания bean.
781
+
782
+
783
+
### 6 В чём разница между @Component, @Service и @Repository аннотациями?
784
+
Все они определяют бины Spring. Однако между ними всё же есть разница.
785
+
786
+
787
+
@Component — универсальный компонент
788
+
@Repository — компонент, который предназначен для хранения, извлечения и поиска. Как правило, используется для работы с базами данных.
789
+
@Service — фасад для некоторой бизнес логики
790
+
791
+
792
+
Пользовательские аннотации, производные от @Component, могут добавлять специальную логику в бинах.
793
+
794
+
795
+
Например, бины, получившиеся при помощи @Repository, дополнительно имеют обработку для JDBC Exception
796
+
797
+
798
+
### 7 Можем ли мы использовать @Component вместо @Service для бизнес логики?
799
+
Да. конечно.
800
+
801
+
802
+
Если @Component является универсальным стереотипом для любого Spring компонента, то @Service в настоящее время является его псевдонимом. Однако, в официальной документации Spring рекомендуется использовать именно @Service для бизнес логики. Вполне возможно, что в будущих версиях фреймворка, для данного стереотипа добавится дополнительная семантика, и его бины станут обладать дополнительной логикой.
803
+
804
+
805
+
### 8 В чем различие между web.xml и the Spring Context - servlet.xml?
806
+
web.xml — Метаданные и конфигурация любого веб-приложения, совместимого с Java EE. Java EE стандарт для веб-приложений.
807
+
servlet.xml — файл конфигурации, специфичный для Spring Framework.
808
+
809
+
810
+
### 9 Что предпочитаете использовать для конфигурации Spring - xml или аннотирование?
811
+
Предпочитаю аннотации, если кодовая база хорошо описывается такими элементами, как @Service, @Component, @Autowired
812
+
813
+
814
+
Однако когда дело доходит до конфигурации, у меня нет каких-либо предпочтений. Я бы оставил этот вопрос команде.
815
+
816
+
817
+
### 10 Можем ли мы применить @Autowired с не сеттерами и не конструкторами методами?
818
+
Да, конечно.
819
+
820
+
821
+
@Autowired может использоваться вместе с конструкторами, сеттерами или любым другими методами. Когда Spring находит @Autowired на методе, Spring автоматически вызовет этот метод, после создания экземпляра бина. В качестве аргументов, будут подобраны подходящие объекты из контекста Spring.
822
+
823
+
824
+
### 11 В чем разница между Сквозной Функциональностью (Cross Cutting Concerns) и АОП (аспектно оринтированное программирование)?
825
+
Сквозная Функциональность — функциональность, которая может потребоваться вам на нескольких различных уровнях — логирование, управление производительностью, безопасность и т.д.
826
+
АОП — один из подходов к реализации данной проблемы
827
+
828
+
829
+
### 12 В чем разница между IOC (Inversion of Control) и Application Context?
830
+
IOC — инверсия управления. Вместо ручного внедрения зависимостей, фреймворк забирает ответственность за это.
831
+
ApplicationContext — реализация IOC спрингом.
832
+
833
+
834
+
Bean Factory — это базовая версия IOC контейнера
835
+
836
+
837
+
Application Context также включает дополнительные функции, которые обычно нужны для разработки корпоративных приложений
838
+
839
+
840
+
### 13 В чем разница между classPathXmlApplicationContext и annotationConfigApplicationContext?
841
+
classPathXmlApplicationContext — если вы хотите инициализировать контекст Spring при помощи xml
842
+
annotationConfigApplicationContext — если вы хотите инициализировать контекст Spring при помощи конфигурационного класса java
843
+
844
+
845
+
### 14 Почему возвращаемое значение при применении аспекта @Around может потеряться? Назовите причины.
846
+
Метод, помеченный аннотацией @Around, должен возвращать значение, которое он (метод) получил из joinpoint.proceed()
847
+
848
+
849
+
@Around("trackTimeAnnotation()")
850
+
public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
851
+
long startTime = System.currentTimeMillis();
852
+
Object retVal = joinPoint.proceed();
853
+
long timeTaken = System.currentTimeMillis() - startTime;
854
+
logger.info("Time taken by {} is equal to {}",joinPoint, timeTaken);
855
+
return retVal;
856
+
}
857
+
858
+
### 15 Как вы решаете какой бин инжектить, если у вас несколько подходящих бинов. Расскажите о @Primary и @Qualifier?
859
+
Если есть бин, который вы предпочитаете большую часть времени по сравнению с другими, то используйте @Primary, и используйте @Qualifier для нестандартных сценариев.
860
+
861
+
862
+
Если все бины имеют одинаковый приоритет, мы всегда будем использовать @Qualifier
863
+
864
+
865
+
Если бин надо выбрать во время исполнения программы, то эти аннотации вам не подойдут. Вам надо в конфигурационном классе создать метод, пометить его аннотацией @Bean, и вернуть им требуемый бин.
866
+
867
+
868
+
### 16 Что нового в Spring Framework 5.0?
869
+
На мой взгляд это Functional Web Framework, Kotlin и и поддержка реактивного программирования.
870
+
871
+
872
+
### 17 Сравните Application Context, IOC Container, vs Web Container и EJB Container. Нужен ли Web Container для запуска Spring Boot приложения?
873
+
Web Container и EJB Containers являются частью приложения/веб-сервера, таких как Tomcat, Websphere, Weblogic. Они добавляют свою дополнительную функциональность к ним. Java EE определяет контракт для веб-приложений, эти контейнеры являются реализацией этих контрактов.
874
+
875
+
876
+
Spring контейнер может являться частью любого приложения, которое вы делаете на java. Spring может работать внутри веб-контейнера, ejb контейнера или даже без них.
877
+
878
+
879
+
### 18 Как мы можем выбрать подходящий бин при помощи application.properties?
880
+
Рассмотрим пример:
881
+
882
+
883
+
interface GreetingService {
884
+
public String sayHello();
885
+
}
886
+
887
+
И два компонента
888
+
889
+
890
+
@Component(value="real")
891
+
class RealGreetingService implements GreetingService {
892
+
public String sayHello() {
893
+
return "I'm real";
894
+
}
895
+
}
896
+
897
+
@Component(value="mock")
898
+
class MockGreetingService implements GreetingService {
899
+
public String sayHello() {
900
+
return "I'm mock";
901
+
}
902
+
}
903
+
904
+
Тогда в application.properties добавим свойство
905
+
application.greeting: real
906
+
907
+
908
+
Воспользуемся данным решением:
909
+
910
+
911
+
@RestController
912
+
public class WelcomeController {
913
+
@Resource(name="${application.greeting}")
914
+
private GreeterService service1;
915
+
}
916
+
917
+
### 19 Какая минимальная версия Java поддерживается в Spring Boot 2 и Spring 5?
918
+
Spring 5.0 и Spring Boot 2.0 поддерживают Java 8 и более поздней версии.
919
+
920
+
921
+
### 20 В чём разница между @Controller и @RestController?
922
+
@RestController = @Controller + @ResponseBody
923
+
924
+
925
+
@RestController превращает помеченный класс в Spring-бин. Этот бин для конвертации входящих/исходящих данных использует Jackson message converter. Как правило целевые данные представлены в json или xml.
926
+
927
+
928
+
### 21 Почему иногда мы используем @ResponseBody, а иногда ResponseEntity?
929
+
ResponseEntity необходим, только если мы хотим кастомизировать ответ, добавив к нему статус ответа. Во всех остальных случаях будем использовать @ResponseBody.
930
+
931
+
932
+
@GetMapping(value=”/resource”)
933
+
@ResponseBody
934
+
public Resource sayHello() { return resource; }
935
+
936
+
@PostMapping(value=”/resource”)
937
+
public ResponseEntity createResource() {
938
+
….
939
+
return ResponseEntity.created(resource).build();
940
+
}
941
+
942
+
Стандартные HTTP коды статусов ответов, которые можно использовать.
943
+
200 — SUCCESS
944
+
201 — CREATED
945
+
404 — RESOURCE NOT FOUND
946
+
400 — BAD REQUEST
947
+
401 — UNAUTHORIZED
948
+
500 — SERVER ERROR
949
+
950
+
951
+
Для @ResponseBody единственные состояния статуса это SUCCESS(200), если всё ок и SERVER ERROR(500), если произошла какая-либо ошибка.
952
+
953
+
954
+
Допустим мы что-то создали и хотим отправить статус CREATED(201). В этом случае мы используем ResponseEntity.
955
+
956
+
957
+
### 22 В чем разница между Filters, Listeners and Interceptors?
958
+
Концептуально всё просто, фильтры сервлетов могут перехватывать только HTTPServlets. Listeners могут перехватывать специфические события. Как перехватить события которые относятся ни к тем не другим?
959
+
960
+
961
+
Фильтры и перехватчики делают по сути одно и тоже: они перехватывают какое-то событие, и делают что-то до или после.
962
+
963
+
964
+
Java EE использует термин Filter, Spring называет их Interceptors.
965
+
966
+
967
+
Именно здесь AOP используется в полную силу, благодаря чему возможно перехватывание вызовов любых объектов
968
+
969
+
970
+
### 23 В чем разница между ModelMap и ModelAndView?
971
+
Model — интерфейс, ModelMap его реализация..
972
+
973
+
974
+
ModelAndView является контейнером для пары, как ModelMap и View.
975
+
976
+
977
+
Обычно я люблю использовать ModelAndView. Однако есть так же способ когда мы задаем необходимые атрибуты в ModelMap, и возвращаем название View обычной строкой из метода контроллера.
978
+
979
+
980
+
### 24 В чем разница между model.put() и model.addAttribute()?
981
+
Метод addAttribute отделяет нас от работы с базовой структурой hashmap. По сути addAttribute это обертка над put, где делается дополнительная проверка на null. Метод addAttribute в отличии от put возвращает modelmap.
Нам это может понадобиться, если мы, например, захотим взять некоторое значение с HTML страницы и сохранить его в БД. Для этого нам надо это значение переместить в контроллер Спринга.
987
+
988
+
989
+
Если мы будем использовать Spring MVC form tags, Spring автоматически свяжет переменные на HTML странице с Бином Спринга.
990
+
991
+
992
+
Если мне придется с этим работать, я обязательно буду смотреть официальную документацию Spring MVC Form Tags.
993
+
994
+
995
+
### 26 Почему мы используем Hibernate Validator?
996
+
Hibernate Validator никак не связан с БД. Это просто библиотека для валидации.
997
+
998
+
999
+
Hibernate Validator версии 5.x является эталонной реализацией Bean Validation 1.1
1000
+
1001
+
1002
+
Так же если взглянуть по адресу http://beanvalidation.org/2.0, то Hibernate Validator является единственным, который сертифицирован.
1003
+
1004
+
1005
+
### 27 Где должны располагаться статические (css, js, html) ресурсы в Spring MVC приложении?
1006
+
Расположение статических ресурсов можно настроить. В документации Spring Boot рекомендуется использовать /static, или /public, или /resources, или /META-INF/resources
1007
+
1008
+
1009
+
### 28 Почему для конфиденциальных данных рекомендуется использовать POST, а не GET запросы?
1010
+
В случае GET запроса передаваемые параметры являются частью url, и все маршрутизаторы, через которые пройдет наш GET запрос, смогут их прочитать.
1011
+
1012
+
1013
+
В случае POST запроса передаваемые параметры являются частью тела запроса. При использовании HTTPs, тело запроса шифруется. Следовательно, использование POST запросов является более безопасным
1014
+
1015
+
1016
+
### 29 Можно ли передать в запросе один и тот же параметр несколько раз?
0 commit comments