Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Внедрение зависимостей — это специальный паттерн, который уменьшает связь между Spring компонентами (то есть между различными POJO).
Рано или поздно вы столкнетесь с ситуацией что все тесты зеленые а приложение не стартует (к примеру из-за циклических зависимостей).
Или еще хуже, стартует на девелопменте а на продакшене нет (реальный случай между прочим)
Отлично, в вашем бине есть @PostConstruct. Ваши действия? Эмулировать поведение Спринга?
на равне с @PreDestroy лучше не использовать?
И Value аннотации вешать на методы а не на поля
Мы уже вроде договорились что инъекция через конструктор небезопасна из-за циклических зависимостей
...
@Autowired
private ApplicationContext applicationContext;
...
Насчет «циклических зависимостей».
Так в конструктор инжектится интерфейс.
И если создавать бины типа интерфейса, то Spring их замечательно проксирует и никаких проблем с циклическими зависимостями.
interface IA {
}
interface IB {
}
@Component
public class IAImpl implements IA {
public IAImpl(@Autowired IB ib) {
}
}
@Component
public class IBImpl implements IB {
public IBImpl(@Autowired IA ia) {
}
}***************************
APPLICATION FAILED TO START
***************************
Description:
The dependencies of some of the beans in the application context form a cycle:
┌─────┐
| IAImpl defined in file [G:\.....\IAImpl.class]
↑ ↓
| IBImpl defined in file [G:\.....\IBImpl.class]
└─────┘
public interface IA {
public void testA();
}
...
public class IAImpl implements IA {
private IB ib;
IAImpl(IB ib) {
this.ib = ib;
}
public void testA() {
System.out.println("TEST A");
ib.testB();
}
}
public interface IB {
public void testB();
}
public class IBImpl implements IB {
private IA ia;
IBImpl(IA ia) {
this.ia = ia;
}
public void testB() {
Random random = new Random();
if(random.nextBoolean()) {
System.out.println("TEST B");
} else {
ia.testA();
}
}
}
@SpringBootApplication
public class Main {
@Bean
public IA iaBean(@Lazy IB ibBean) {
return new IAImpl(ibBean);
}
@Bean
public IB ibBean(IA iaBean) {
return new IBImpl(iaBean);
}
@Bean
public CommandLineRunner commandLineRunner() {
return new CommandLineRunner() {
@Autowired
private IA ia;
@Autowired
private IB ib;
@Override
public void run(String... args) throws Exception {
ia.testA();
System.out.println("--------------");
ib.testB();
}
};
}
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
public IAImpl(@Lazy @Autowired IB ib) {
}А на сколько ценится такая сертификация не в контексте саморазвития, но у работадателей?
CGLib proxy — не встроен в JDK. Используется когда интерфейс объекта недоступенПочему для создания Spring beans рекомендуются интерфейсы?Что такое профили? Какие у них причины использования?По поводу скоупов и многопоточности некорректно.
Все совсем наоборот - синглтон не потокобезопасный, а прототайп потокобезопасный, если не инджектится в непотокобезопасный бин.
Подготовка к Spring Professional Certification. Контейнер, IoC, бины