Java | Вопросы собесов – Telegram
Java | Вопросы собесов
11.4K subscribers
41 photos
3 videos
1.13K links
Download Telegram
🤔 Какие существуют способы контроля за значениями десериализованного объекта?

- Реализация метода readObject() с валидацией данных;
- Реализация метода validateObject() в интерфейсе ObjectInputValidation;
- Проверка полей сразу после десериализации;
- Использование serialVersionUID для контроля совместимости классов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4
🤔 Как бороться в БД с SQL Injection?

SQL Injection – это атака, при которой злоумышленник вставляет вредоносный SQL-код в запрос, чтобы получить несанкционированный доступ к данным.

Допустим, у нас есть код
String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";


Если злоумышленник введёт ' OR '1'='1 в поле пароля, запрос превратится в:
SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1'


🚩Способы защиты от SQL Injection

🟠Использование `PreparedStatement` (РЕКОМЕНДУЕТСЯ)
Подготовленные запросы автоматически экранируют входные данные, предотвращая SQL-инъекции.
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();


🟠Использование ORM (например, Hibernate)
ORM-фреймворки (Hibernate, JPA) автоматически генерируют безопасные SQL-запросы.
TypedQuery<User> query = entityManager.createQuery(
"SELECT u FROM User u WHERE u.username = :username AND u.password = :password", User.class);
query.setParameter("username", username);
query.setParameter("password", password);
User user = query.getSingleResult();


🟠Проверка и экранирование входных данных
Если по какой-то причине PreparedStatement использовать нельзя, экранируйте опасные символы (', " и ;).
String safeInput = input.replace("'", "\\'");


🟠Минимизация прав в БД
Создавайте отдельного пользователя БД с ограниченными правами:
Запрет на DROP, DELETE, UPDATE без WHERE
Только доступ к нужным таблицам
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'securepassword';
GRANT SELECT, INSERT, UPDATE ON mydb.users TO 'app_user'@'localhost';


🟠Использование Web Application Firewall (WAF)
WAF анализирует HTTP-запросы и блокирует подозрительные SQL-запросы. Пример: ModSecurity – популярный WAF для защиты веб-приложений.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 Как устроена операция get в LinkedList?

Метод get(index) в LinkedList:
- начинает обход с головы или с хвоста (в зависимости от индекса),
- проходит по указателям (prev/next) пока не дойдёт до нужного элемента.
Это линейный процесс, в худшем случае требует пройти половину списка — O(n/2).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11💊4
🤔 Слышал ли что то про метод intern?

Метод intern() в классе String используется для оптимизации памяти.
Он добавляет строку в String Pool и возвращает её ссылку, если строка уже там есть.

🚩Как работает `intern()`?

Без intern() – строки создаются в Heap (куче)
String s1 = new String("Hello"); // В куче (Heap)
String s2 = new String("Hello");

System.out.println(s1 == s2); // false (разные объекты)


С intern() – строки хранятся в String Pool
String s1 = new String("Hello").intern();
String s2 = new String("Hello").intern();

System.out.println(s1 == s2); // true (одна строка в String Pool)


🚩Что такое `String Pool`?

Это специальная область памяти, где хранятся уникальные строковые литералы.
Все строковые литералы ("Hello") по умолчанию хранятся в String Pool.
String s1 = "Hello"; // В String Pool
String s2 = "Hello"; // Ссылается на тот же объект

System.out.println(s1 == s2); // true


🚩Когда использовать `intern()`?

Когда у вас много одинаковых строк в памяти (например, имена, идентификаторы).
Для экономии памяти, если строки часто дублируются.
В парсинге JSON, XML – одни и те же строки могут повторяться тысячи раз.
List<String> names = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
names.add(("User" + (i % 100)).intern()); // Используем String Pool
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🤔 Что такое аннотация @Transactional?

Это аннотация, которая оборачивает метод в транзакцию. Все операции БД внутри метода:
- будут зафиксированы (commit), если не возникло исключений;
- будут откатаны (rollback), если возникло исключение.
Поддерживает nested, readOnly, isolation, propagation.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥1
🤔 Чем отличаются методы Thread.sleep() и Thread.yield()?

Методы Thread.sleep() и Thread.yield() в Java используются для управления потоком, но работают по-разному.

🚩Thread.sleep()

Метод Thread.sleep(milliseconds) приостанавливает выполнение текущего потока на указанное время.

🚩Как это работает?

Поток уходит в состояние "ожидания" (TIMED_WAITING).
Операционная система не даёт ему процессорное время в течение заданного времени.
После завершения паузы поток снова становится готовым к выполнению (RUNNABLE).

public class SleepExample {
public static void main(String[] args) {
System.out.println("Начало работы...");
try {
Thread.sleep(2000); // Пауза на 2 секунды
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Прошло 2 секунды");
}
}


Результат
Начало работы...
(пауза 2 секунды)
Прошло 2 секунды


🚩Thread.yield()

Метод Thread.yield() даёт возможность другим потокам выполнить работу.

🚩Как это работает?

Текущий поток передаёт управление планировщику (scheduler).
Если есть другие потоки с таким же или более высоким приоритетом, они получат процессорное время.
Если таких потоков нет, то текущий поток продолжит выполняться.

public class YieldExample {
public static void main(String[] args) {
Runnable task = () -> {
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " - " + i);
Thread.yield(); // Позволяет другим потокам выполняться
}
};

Thread t1 = new Thread(task, "Поток-1");
Thread t2 = new Thread(task, "Поток-2");

t1.start();
t2.start();
}
}


Результат (примерный, зависит от планировщика ОС)
Поток-1 - 1
Поток-2 - 1
Поток-1 - 2
Поток-2 - 2
...


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🤔 Где можно применить многоформенность полиморфизма?

Многоформенность (иначе — полиморфизм) применяется, когда один интерфейс используется для разных типов объектов. Применяется:
- В наследовании, где один базовый тип описывает поведение, а конкретные подклассы реализуют его по-разному.
- В шаблонных решениях — например, логика обработки сущностей разного типа через один API.
- В работе с интерфейсами и абстракциями, где можно подменять реализацию без изменения логики.
- В паттернах проектирования, например, Strategy, Factory, State — активно используют полиморфизм.
- В коллекциях и списках объектов, где можно обрабатывать разные подтипы через один общий родительский интерфейс


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤔3🔥1
🤔 Есть ли возможность создать два Singleton'а в Spring'е

В Spring действительно можно создать два синглтона, но тут важно понимать, что Spring использует паттерн Singleton на уровне контейнера, а не на уровне JVM. Давайте разберёмся, как это возможно.

🟠Определение Singleton в Spring
В Spring синглтон означает, что в рамках одного контекста (ApplicationContext) создаётся один экземпляр бина.
@Component
public class MySingletonBean {
public MySingletonBean() {
System.out.println("Создан экземпляр MySingletonBean");
}
}


🟠Два Singleton'а в Spring? Как это возможно?
Есть несколько способов создать два синглтона.
Создание двух контекстов (ApplicationContext)
Spring гарантирует синглтонность только в одном контексте. Если создать два контекста, можно получить два независимых синглтона.
AnnotationConfigApplicationContext context1 = new AnnotationConfigApplicationContext(AppConfig.class);
AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext(AppConfig.class);

MySingletonBean bean1 = context1.getBean(MySingletonBean.class);
MySingletonBean bean2 = context2.getBean(MySingletonBean.class);

System.out.println(bean1 == bean2); // false! Два разных объекта


Определение двух бинов одного типа
Можно создать два разных бина, просто давая им разные имена в конфигурации.
@Configuration
public class AppConfig {

@Bean
public MySingletonBean firstSingleton() {
return new MySingletonBean();
}

@Bean
public MySingletonBean secondSingleton() {
return new MySingletonBean();
}
}


Теперь оба метода создадут разные объекты.
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

MySingletonBean bean1 = context.getBean("firstSingleton", MySingletonBean.class);
MySingletonBean bean2 = context.getBean("secondSingleton", MySingletonBean.class);

System.out.println(bean1 == bean2); // false


Изменение области (scope) бина
Если изменить область (@Scope), можно получить два экземпляра в одном контексте, но тогда это уже не будет синглтон.
@Component
@Scope("prototype")
public class MyBean {
public MyBean() {
System.out.println("Создан новый экземпляр MyBean");
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2
🤔 Что известно про оператор EXISTS?

EXISTS — это булевый оператор, возвращающий TRUE, если вложенный подзапрос возвращает хотя бы одну строку.
Применяется:
- Для проверки наличия связанных записей.
- Для оптимизации: в отличие от IN, EXISTS часто лучше работает с большими наборами.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3
🤔 Какие типы данных есть в контексте JVM?

В контексте JVM (Java Virtual Machine) типы данных делятся на два основных класса: примитивные типы данных и ссылочные типы данных.

🚩Примитивные типы данных

Примитивные типы данных представляют собой базовые типы, которые не являются объектами и хранят непосредственно значения. Они делятся на числовые типы, логический тип и символьный тип.

🟠Числовые типы
Целочисленные типы
byte: 8-битный знаковый целочисленный тип данных (диапазон от -128 до 127).
short: 16-битный знаковый целочисленный тип данных (диапазон от -32,768 до 32,767).
int: 32-битный знаковый целочисленный тип данных (диапазон от -2^31 до 2^31-1).
long: 64-битный знаковый целочисленный тип данных (диапазон от -2^63 до 2^63-1).
Типы с плавающей точкой
float: 32-битный IEEE 754 тип данных с плавающей точкой одинарной точности.
double: 64-битный IEEE 754 тип данных с плавающей точкой двойной точности.

🟠Логический тип
boolean: Представляет логическое значение (true или false).

🟠Символьный тип
char: 16-битный тип данных, представляющий символ Unicode (диапазон от '\u0000' до '\uffff').

🚩Ссылочные типы данных

Ссылочные типы данных представляют собой объекты и массивы. Они хранят ссылку на область памяти, где хранятся данные объекта или массива.

🟠Классы (Classes)
Любой объектный тип данных является экземпляром класса. Классы могут быть как стандартными (например, String, Integer), так и пользовательскими.
🟠Интерфейсы (Interfaces)
Интерфейсы определяют набор методов, которые должны быть реализованы классами, которые их реализуют.
🟠Массивы (Arrays)
Массивы могут быть одномерными или многомерными и могут хранить как примитивные, так и ссылочные типы данных.

🚩Пример примитивных и ссылочных типов данных

public class DataTypesExample {
public static void main(String[] args) {
// Примитивные типы данных
byte aByte = 10;
short aShort = 100;
int anInt = 1000;
long aLong = 10000L;
float aFloat = 10.5f;
double aDouble = 10.55;
boolean aBoolean = true;
char aChar = 'A';

// Ссылочные типы данных
String aString = "Hello, World!";
Integer anInteger = 1000;
int[] anArray = {1, 2, 3, 4, 5};

// Вывод примитивных типов данных
System.out.println("byte: " + aByte);
System.out.println("short: " + aShort);
System.out.println("int: " + anInt);
System.out.println("long: " + aLong);
System.out.println("float: " + aFloat);
System.out.println("double: " + aDouble);
System.out.println("boolean: " + aBoolean);
System.out.println("char: " + aChar);

// Вывод ссылочных типов данных
System.out.println("String: " + aString);
System.out.println("Integer: " + anInteger);
System.out.println("Array: " + java.util.Arrays.toString(anArray));
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Как называются состояния в Hibernate?

Hibernate Entity может находиться в следующих состояниях:
1. Transient — объект создан, но не привязан к сессии.
2. Persistent — объект находится в сессии и отслеживается Hibernate.
3. Detached — объект был отсоединён от сессии (например, после session.close()).
4. Removed — объект помечен как удалённый, будет удалён при flush.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍5
🤔 Что такое xml?

XML (Extensible Markup Language) — это расширяемый язык разметки, который используется для хранения и передачи данных в формате, удобном для чтения как человеком, так и машиной.

🚩Зачем нужен XML?

XML используется для структурированного хранения информации. Он позволяет определять собственные теги и организовывать данные в удобном формате. Основные применения:
Обмен данными между системами (например, между сервером и клиентом).
Конфигурационные файлы (например, web.xml в Java).
Хранение данных (например, в файлах настроек, документах).
Веб-сервисы (SOAP использует XML для передачи сообщений).

🚩Как устроен XML?

XML-документ состоит из элементов (тегов), которые образуют древовидную структуру. Пример простого XML:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>Иван</name>
<age>30</age>
<city>Москва</city>
</person>


🚩Как XML используется в Java?

В Java XML часто используется для работы с конфигурациями и веб-сервисами. Популярные библиотеки для работы с XML:
DOM (Document Object Model) — загружает весь XML-файл в память, создавая дерево элементов.
SAX (Simple API for XML) — обрабатывает XML последовательно, без загрузки в память.
JAXB (Java Architecture for XML Binding) — позволяет преобразовывать Java-объекты в XML и обратно.
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Marshaller;
import java.io.StringWriter;

@XmlRootElement
class Person {
private String name;
private int age;

public Person() {} // Пустой конструктор нужен для JAXB

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@XmlElement
public String getName() { return name; }

@XmlElement
public int getAge() { return age; }
}

public class Main {
public static void main(String[] args) throws JAXBException {
Person person = new Person("Иван", 30);
JAXBContext context = JAXBContext.newInstance(Person.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

StringWriter writer = new StringWriter();
marshaller.marshal(person, writer);

System.out.println(writer.toString());
}
}


Вывод
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person>
<name>Иван</name>
<age>30</age>
</person>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 Что такое BeanDefinition и зачем он нужен?

BeanDefinition — это внутреннее описание бина в Spring. Оно содержит:
- имя класса,
- scope (singleton, prototype),
- зависимости (autowiring),
- параметры конструктора,
- init и destroy методы.
Это объект, который Spring использует в момент создания бина. Он управляется внутри ApplicationContext и позволяет Spring динамически настраивать, создавать и управлять жизненным циклом бинов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3
🤔 Чем отличаются Web server и Application server?

🟠Web Server (веб-сервер)
обрабатывает HTTP-запросы и отдает статический контент (HTML, CSS, JS, изображения).
🟠Application Server (сервер приложений)
запускает бизнес-логику приложения, выполняет обработку данных и работает с базой данных.

🚩Web Server (веб-сервер)

Принимает HTTP-запросы от браузера.
Отдает статические файлы (HTML, CSS, JS, картинки).
Может перенаправлять запросы к Application Server.
Apache HTTP Server
Nginx
Microsoft IIS
Допустим, пользователь открывает сайт example.com/index.html:
Браузер отправляет HTTP-запрос:
GET /index.html HTTP/1.1
Host: example.com


Веб-сервер (например, Nginx) получает запрос и отправляет браузеру файл index.html.
Web Server НЕ обрабатывает логику приложения, он просто отправляет файлы клиенту.

🚩Application Server (сервер приложений)

Обрабатывает динамические запросы (например, авторизацию, платежи, работу с БД).
Выполняет Java-код (Servlet, EJB, Spring, Hibernate).
Может генерировать HTML-страницы на сервере (JSP, Thymeleaf).
Управляет транзакциями и соединениями с базой данных.
Tomcat (самый популярный в мире Java-сервер)
WildFly (JBoss)
GlassFish
WebLogic, WebSphere
Допустим, пользователь заходит на example.com/login:
Браузер отправляет HTTP-запрос:

   POST /login HTTP/1.1
Host: example.com


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🤔2
🤔 Почему объекты попадают в String Pool?

Потому что строки в Java неизменяемы, и для оптимизации памяти JVM использует пул строк, где одинаковые строковые литералы ссылаются на один и тот же объект. Это экономит ресурсы и ускоряет сравнение строк.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🤔 Каким образом можно получить синхронизированные объекты стандартных коллекций?

В Java стандартные коллекции из java.util (например, ArrayList, HashMap, HashSet) не потокобезопасны. Чтобы использовать их в многопоточной среде, можно применять синхронизированные обёртки** и **коллекции из java.util.concurrent.

🚩Синхронизация с `Collections.synchronizedXXX()`

Java предоставляет методы для создания потокобезопасных обёрток над обычными коллекциями:
import java.util.*;

public class SynchronizedCollectionsExample {
public static void main(String[] args) {
List<Integer> syncList = Collections.synchronizedList(new ArrayList<>());
Map<String, String> syncMap = Collections.synchronizedMap(new HashMap<>());
Set<Integer> syncSet = Collections.synchronizedSet(new HashSet<>());

syncList.add(1);
syncMap.put("key", "value");
syncSet.add(10);
}
}


🚩Важный момент: Итерация через `synchronized` коллекции

Даже если коллекция синхронизирована, её итерация не потокобезопасна.
for (Integer num : syncList) { // Возможен ConcurrentModificationException!
System.out.println(num);
}


Чтобы избежать ошибок, итерацию нужно делать внутри synchronized блока
synchronized (syncList) {
for (Integer num : syncList) {
System.out.println(num);
}
}


🚩Коллекции из `java.util.concurrent` (рекомендуемый вариант)

Вместо Collections.synchronizedXXX() лучше использовать современные конкурентные коллекции из java.util.concurrent. Они спроектированы для многопоточности и работают быстрее.
import java.util.concurrent.*;

public class ConcurrentMapExample {
public static void main(String[] args) {
ConcurrentMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put("one", 1);
concurrentMap.put("two", 2);

System.out.println(concurrentMap.get("one")); // 1
}
}


Пример CopyOnWriteArrayList (потокобезопасный список, работающий через копии)
import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteExample {
public static void main(String[] args) {
CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>();
list.add(1);
list.add(2);

for (Integer num : list) { // Без ConcurrentModificationException!
System.out.println(num);
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 Какие есть уровни изоляции транзакций?

1. Read Uncommitted: транзакция может видеть данные, которые ещё не зафиксированы.
2. Read Committed: транзакция видит только зафиксированные изменения.
3. Repeatable Read: данные, прочитанные транзакцией, остаются неизменными до её завершения.
4. Serializable: самая высокая изоляция, предотвращающая любые конфликты чтения и записи.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2
🤔 Чем отличается обычный объект от Bean?

В Spring термин Bean (бин) означает объект, управляемый Spring-контейнером.

🟠Обычный объект (Java POJO)
Создаётся вручную, Spring о нём ничего не знает
class Car {
void drive() {
System.out.println("Машина едет...");
}
}

public class Main {
public static void main(String[] args) {
Car car = new Car(); // Создаём объект вручную
car.drive();
}
}


🟠Spring Bean (управляемый объект)
Spring создаёт и управляет бином через аннотации.
import org.springframework.stereotype.Component;

@Component // Сообщает Spring, что этот класс - Bean
class Car {
void drive() {
System.out.println("Spring-машина едет...");
}
}


Теперь объект создаётся Spring-контейнером
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class); // Получаем Bean из Spring-контейнера
car.drive();
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
🤔 По какому принципу увеличивается количество бакетов?

В структурах данных типа HashMap, бакеты (внутренние ячейки массива) увеличиваются при превышении порога загрузки (load factor).
Обычно при достижении 75% от текущей ёмкости, количество бакетов удваивается.
После расширения происходит ре-хеширование всех элементов, чтобы распределить их по новой таблице.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥1
🤔 Какая структура данных в коллекции List?

В Java интерфейс List представляет упорядоченную коллекцию элементов, допускающую дубликаты. В зависимости от конкретной реализации (ArrayList, LinkedList, Vector), используется разная структура данных.

🚩Основные реализации `List` и их структуры данных

🟠ArrayList
Динамический массив
Структура данных: массив
Быстрая индексация O(1), но медленное удаление/вставка в середину O(n).
List<String> list = new ArrayList<>();


🟠LinkedList
Двусвязный список
Структура данных: двусвязный список
Быстрое добавление/удаление элементов O(1), но медленный доступ по индексу O(n).
List<String> list = new LinkedList<>();


🟠Vector
Динамический массив (синхронизирован)
Структура данных: массив (как ArrayList), но с синхронизацией.
Устарел, используется редко из-за synchronized методов (медленнее ArrayList).
List<String> list = new Vector<>();


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Как dependency injection можно применить с SpringBean?

Dependency Injection применяется через аннотации
@Autowired, конструкторную инъекцию или через методы с аннотацией @Bean в Java-конфигурации для связывания Spring Bean-ов друг с другом.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🤔4