Аннотация конфигурации Spring указывает, что класс имеет методы определения @Been. Аннотация Spring @Bean применяется к методу, чтобы указать, что он возвращает компонент, которым будет управлять контекст Spring.
@Configuration
public class ApplicationConfig {
@Bean
public DataSource dataSource() {
return new DataSource();
}
}
Spring создаст столько компонентов, сколько мы определим в классах @Configuration. Классы @Configuration тоже являются компонентами.
public class MySpringApp {
public static void main(String[] args) {
// Create the application from the configuration
ApplicationContext ctx = SpringApplication.run(ApplicationConfig.class);
// Look up the application service interface
// Way 1: Casting
DataSource ds1 = (DataSource) ctx.getBean("dataSource");
// Way 2: Use typed method
DataSource ds2 = ctx.getBean("dataSource", DataSource.class);
// Way 3: Without been id if type is unique
DataSource ds3 = ctx.getBean(DataSource.class);
// Use the application
ds1.close();
ds2.close();
ds3.close();
}
}
@Configuration
@Import({ApplicationConfig.class, WebConfig.class})
public class InfraetructureConfig {
@Bean
public DataSource dataSource() {
return new DataSource();
}
}
Остерегайтесь дубликатов бобов. В предыдущем коде, если ApplicationConfig.class и WebConfig.class есть тот же боб, что и у меня. d вы получаете компонент из веб-конфигурации, потому что это последний компонент. Чтобы избежать этого, вы можете использовать аннотацию @Order.
@Configuration
@Order(1)
public class ApplicationConfig {
@Bean
public String example(){
return new String("example");
}
}
Область действия по умолчанию – одноэлементная
DataSource ds1 = (DataSource) ctx.getBean("dataSource");
DataSource ds2 = (DataSource) ctx.getBean("dataSource");
assert ds1 == ds2; // True - Same object
Область действия прототипа: новый экземпляр создается каждый раз, когда на компонент ссылаются.
@Bean
@Scope("prototype")
public DataSource dataSource() {
return new DataSource();
}
DataSource ds1 = (DataSource) ctx.getBean("dataSource");
DataSource ds2 = (DataSource) ctx.getBean("dataSource");
assert ds1 != ds2; // True - Diferent objects
Другие области применения:
- сессия
- запрос
- приложение
- глобальный
- нить
- веб-кошелек
- освежить
- Пользовательские области видимости
Оригинал: “https://dev.to/eidher/dependency-injection-using-spring-ckk”