Details

Description

LifecycleBeanPostProcessor needs to be registred before ShiroFilterFactoryBean because...

ShiroFilterFactoryBean itself is a BeanPostProcessor, like LifecycleBeanPostProcessor too. So during AbstractApplicationContext.registerBeanPostProcessors() these two beans are created and added to nonOrderedPostProcessors, after then they get registered. At this execution point ShiroFilterFactoryBean is already created with its SecurityManager and defined Realms. So LifecycleBeanPostProcessor will not effect anymore on Realms init.

There is a problem with LifecycleBeanPostPRocessor and spring import configuration.
I have the following scenario in my project:

@Configuration
public class AppConfig {

@Bean
public SecurityManager securityManager()

{
//return security manager instance here
}

}

@Configuration
@Import(AppConfig.class)
public class WebConfig {

@Autowired private AppConfig config;

@Bean
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor()

{
return new LifecycleBeanPostProcessor();
}

@Bean
public ShiroFilterFactoryBean shiroFilter()

{
//return filter bean here
}

}

The main point is to separate application configuration from web configuration.

In this scenario AppConfig is not wired when shifo filter is accessed. This is because LifecycleBeanPostProcessor implements PriorityOrdered and WebConfig configuration bean is instantiated before other priority ordered post processors, such as @Autowired post processor, are registered. Thus WebConfig bean is instantiated without post processing @Import annotation and breaks wiring.