Как работать с ConfigurableListableBeanFactoty (не могу зарегистрировать BeanPostProcessor)?
Добрый день.
Создаю свой BeanPostProcessor и хочу его добавить явно (не с помощью bean).
Делаю в Spring MVC так:
public class BuhApp implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(BuhAppConfig.class); context.getBeanFactory().addBeanPostProcessor(new MyBeanPostProcessor()); DispatcherServlet servlet = new DispatcherServlet(context); ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet); registration.setLoadOnStartup(1); registration.addMapping("/*"); } } |
public class BuhApp implements WebApplicationInitializer { @Override public void onStartup(ServletContext servletContext) { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.register(BuhAppConfig.class); context.getBeanFactory().addBeanPostProcessor(new MyBeanPostProcessor()); DispatcherServlet servlet = new DispatcherServlet(context); ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet); registration.setLoadOnStartup(1); registration.addMapping("/*"); } }
Но в результате выдает ошибку:
Caused by: java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
Посмотрел в интернете. Там делают так же, но не в Spring MVC, и там работает. А в Spring MVC нет.
P.S. Не нужно советовать зарегистрировать как бин. Это я знаю. Интересует как сделать с помощью ConfigurableBeanFactory.
Дополнительно:
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для работы с ConfigurableListableBeanFactory и регистрации BeanPostProcessor в Spring Framework есть несколько шагов, которые необходимо выполнить.
1. Создайте класс, который реализует интерфейс BeanPostProcessor. Например:
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class CustomBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } }
2. Зарегистрируйте этот класс в вашем конфигурационном файле Spring. Например, в файле applicationContext.xml:
3. Укажите ConfigurableListableBeanFactory как зависимость в вашем классе. Например:
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; public class CustomClass { private ConfigurableListableBeanFactory beanFactory; public CustomClass(ConfigurableListableBeanFactory beanFactory) { this.beanFactory = beanFactory; } // Другие методы вашего класса }
4. В методе, где вы создаете экземпляр CustomClass, передайте ему ConfigurableListableBeanFactory. Например:
ConfigurableListableBeanFactory beanFactory = // Получите beanFactory из контекста приложения CustomClass customClass = new CustomClass(beanFactory);
После выполнения этих шагов вы сможете успешно работать с ConfigurableListableBeanFactory и зарегистрировать BeanPostProcessor в вашем приложении на основе Spring Framework. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.