Advertisement
nimchimpsky

AutoBeanDeclarer for spring

Aug 10th, 2013
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.92 KB | None | 0 0
  1. /**
  2.  *  If a Bean is declared with @Autowired but has no bean with matching name, it gets mocked
  3.  *  used in conjunction with a limited base package performs auto generation of mocked dependencies
  4.  */
  5. public class AutoBeanDeclarer implements BeanDefinitionRegistryPostProcessor {
  6.     private final org.slf4j.Logger logger = LoggerFactory.getLogger(AutoBeanDeclarer.class);
  7.     private final Collection<String> mockedDefinitions;
  8.  
  9.     public AutoBeanDeclarer() {
  10.         mockedDefinitions = new ArrayList<String>();
  11.     }
  12.  
  13.     private Iterable<Field> findAllAutoWired(Class targetBean) {
  14.         List<Field> declaredFields = Arrays.asList(targetBean.getDeclaredFields());
  15.         return Iterables.filter(declaredFields, new Predicate<Field>() {
  16.             @Override
  17.             public boolean apply(Field input) {
  18.                 return input.isAnnotationPresent(Autowired.class);
  19.             }
  20.         });
  21.     }
  22.  
  23.     private void registerOn(final BeanDefinitionRegistry registry,final String beanName, final Class type){
  24.         RootBeanDefinition definition = new RootBeanDefinition(MocksFactory.class);
  25.         MutablePropertyValues values = new MutablePropertyValues();
  26.         values.addPropertyValue(new PropertyValue("type", type));
  27.         definition.setPropertyValues(values);
  28.         logger.debug("bean registered with name : "+beanName);
  29.         registry.registerBeanDefinition(beanName, definition);
  30.     }
  31.  
  32.     @Override
  33.     public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
  34.         for(String beanName: registry.getBeanDefinitionNames()) {
  35.             BeanDefinition beanDefinition = registry.getBeanDefinition(beanName);
  36.             String beanClassName = beanDefinition.getBeanClassName();
  37.             try {
  38.                 Class beanClass = Class.forName(beanClassName);
  39.                 for (final Field field : findAllAutoWired(beanClass)) {
  40.                     String fieldName = field.getName();
  41.                     boolean invalidType = field.getType().isArray() || field.getType().isPrimitive();
  42.                     if( invalidType ) {
  43.                         continue;
  44.                     }
  45.                     if( !registry.isBeanNameInUse(fieldName) ) {
  46.                         registerOn(registry, fieldName, field.getType());
  47.                         mockedDefinitions.add(fieldName);
  48.                         // Now field will be available for autowiring.
  49.                     }
  50.                 }
  51.             } catch (ClassNotFoundException ex) {
  52.                 logger.error(ex.getMessage());
  53.             }
  54.         }
  55.     }
  56.  
  57.     @Override
  58.     public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
  59.         for(String beanName: mockedDefinitions) {
  60.             if( !beanFactory.containsBean(beanName) ) {
  61.                 logger.error("Missing definition %s", beanName);
  62.             }
  63.         }
  64.     }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement