Как получить Spring-контекст в объекте класса, который не является бином?

183
29 августа 2017, 10:25

Добрый день! Есть web-приложение. AppConfig.java

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "net.package")
@EnableJpaRepositories("net.package.repository")
public class AppConfig extends WebMvcConfigurerAdapter{
@Autowired
RoleToUserProfileConverter roleToUserProfileConverter;
@Bean(name = "applicationContextProvder")
public ApplicationContextProvider getApplicationContextProvider() {
    return new ApplicationContextProvider();
}
@Bean(name="multipartResolver")
public CommonsMultipartResolver getResolver() throws IOException {
    CommonsMultipartResolver resolver = new CommonsMultipartResolver();
    //Set the maximum allowed size (in bytes) for each individual file.
    resolver.setMaxUploadSizePerFile(5242880);//5MB
    //You may also set other available properties.
    return resolver;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setViewClass(JstlView.class);
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".jsp");
    registry.viewResolver(viewResolver);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    registry.addResourceHandler("/favicon.ico"). addResourceLocations("/favicon.ico");
}
@Override
public void addFormatters(FormatterRegistry registry) {
    registry.addConverter(roleToUserProfileConverter);
}
@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("messages");
    return messageSource;
}
@Override
public void configurePathMatch(PathMatchConfigurer matcher) {
    matcher.setUseRegisteredSuffixPatternMatch(true);
}

Обычно контекст можно получить так:

@Autowired
private ApplicationContext ctx;

Так можно СОЗДАТЬ контекст в классе(не бине):

private ApplicationContext context =
        new AnnotationConfigApplicationContext(AppConfig.class,     HibernateConfiguration.class, MyAppConfigForAsync.class);

Подскажите пожалуйста как получить уже созданный при запуске сервера приложений Spring-контекст в объекте класса, который не является бином ?

Answer 1

Можно создать spring-компонент, в который заинжектится spring-контекст в статическую переменную:

@Component
public class ApplicationContextHolder {
    // Контекст Spring
    private static ApplicationContext ctx;
    @Autowired
    public ApplicationContextHolder(ApplicationContext applicationContext) {
        ApplicationContextHolder.ctx = applicationContext;
    }
    public static ApplicationContext getApplicationContext() {
        return ctx;
    }
}

Затем используйте в другом классе:

public class NotBean {
    private final ApplicationContext ctx;
    public NotBean() {
        ctx = ApplicationContextHolder.getApplicationContext();
    }
}

Update - вариант с использованием ApplicationContextAware

@Component
public class ApplicationContextHolder implements ApplicationContextAware {
    // Контекст Spring
    private static ApplicationContext ctx;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextHolder.ctx = applicationContext;
    }
    public static ApplicationContext getApplicationContext() {
        return ctx;
    }
}
READ ALSO
поиск сущностей по параметрам

поиск сущностей по параметрам

Как реализовать удобный фильтр по параметрам при работе с бд? Есть определенные параметры, к примеру цвет, длина, вес которые приходят с UIВ контроллере...

214
Как зациклить массив? Java

Как зациклить массив? Java

Есть массив из n элементов, и есть массив из k элементов, так вот, мне нужно что бы К массив заполнялся элементами из n, но при условии что n < k

516
Ошибка 403 Forbidden с favicon.ico

Ошибка 403 Forbidden с favicon.ico

Проблема с faviconico Всё сделал как было написано

287
Проброс значения data-атрибута при клике [дубликат]

Проброс значения data-атрибута при клике [дубликат]

На данный вопрос уже ответили:

267