Skip to content

Commit 75b59f4

Browse files
authored
Update spring.md
1 parent f4bf9b5 commit 75b59f4

1 file changed

Lines changed: 279 additions & 0 deletions

File tree

spring.md

Lines changed: 279 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,3 +742,282 @@ Dependency Injection and Aspect Oriented Programming
742742
+ Если вы используете аспекты, убедитесь, что используете точку присоединения как можно более близко, чтобы избежать случайных проблем с обработкой лишних методов.
743743
+ Пользовательские аннотации могут принести существенные преимущества при использовании AOP.
744744
+ Используйте 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.
982+
model.addAttribute(“attribute1”,”value1”).addAttribute(“attribute2”,”value2”);
983+
984+
985+
### 25 Что можете рассказать про Form Binding?
986+
Нам это может понадобиться, если мы, например, захотим взять некоторое значение с 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 Можно ли передать в запросе один и тот же параметр несколько раз?
1017+
Пример:
1018+
http://localhost:8080/login?name=Ranga&name=Ravi&name=Sathish
1019+
Да, можно принять все значения, используя массив в методе контроллера
1020+
1021+
1022+
public String method(@RequestParam(value="name") String[] names){
1023+
}

0 commit comments

Comments
 (0)