[jboss-user] [JBoss/Spring Integration] - Re: New feature proposal: byType injection of Spring beans

c.vidal do-not-reply at jboss.com
Thu Sep 28 10:10:41 EDT 2006


Hi Ales,

Here is a quick and dirty patch. I just couldn't wait :) I didn't have the time to figure out how the jboss unit tests work though, so I didn't add any unit tests. If you could just explain that to me quickly, I'd be glad to add them.

The code tries to do as much guess-work as possible and i'm not sure if it's the best way to do it. The algorithm used is explained in the code.

Tell me if it suits you.

Regards,

Cédric


  | Index: spring-int/src/main/org/jboss/spring/support/SpringInjectionSupport.java
  | ===================================================================
  | --- spring-int/src/main/org/jboss/spring/support/SpringInjectionSupport.java	(revision 57255)
  | +++ spring-int/src/main/org/jboss/spring/support/SpringInjectionSupport.java	(working copy)
  | @@ -26,6 +26,7 @@
  |  import org.jboss.logging.Logger;
  |  import org.jboss.naming.Util;
  |  import org.springframework.beans.factory.BeanFactory;
  | +import org.springframework.beans.factory.ListableBeanFactory;
  |  import org.springframework.util.Assert;
  |  
  |  import java.lang.reflect.Field;
  | @@ -111,30 +112,101 @@
  |          return m.getName().startsWith("set") && m.getParameterTypes().length == 1;
  |      }
  |  
  | -    private Object getObjectFromBeanFactory(Spring spring) throws Exception
  | +    private Object getObjectFromBeanFactory(Spring spring, String defaultBeanName, Class type) throws Exception
  |      {
  |          BeanFactory beanFactory = (BeanFactory) Util.lookup(spring.jndiName(), BeanFactory.class);
  | -        return beanFactory.getBean(spring.bean());
  | +        return getObjectFromBeanFactory(spring, beanFactory, defaultBeanName, type);
  |      }
  |  
  | +    private Object getObjectFromBeanFactory(Spring spring, BeanFactory beanFactory, String defaultBeanName, Class type) {
  | +    	Object bean = null;
  | +
  | +    	if(spring.bean() != null && spring.bean().length() > 0) {
  | +
  | +    		/*
  | +			 * If the bean name is specified in the annotation, then the bean
  | +			 * must looked up by name whether the bean factory is listable or
  | +			 * not.
  | +			 */
  | +    		bean = beanFactory.getBean(spring.bean());
  | +
  | +    	} else {
  | +    		if (beanFactory instanceof ListableBeanFactory) {
  | +
  | +				/*
  | +				 * If no bean name is specified in the annotation but the bean
  | +				 * factory is listable then the bean is looked up by type.
  | +				 */
  | +    			ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;
  | +				Map beans = listableBeanFactory.getBeansOfType(type);
  | +
  | +				if(beans.size() > 1) {
  | +
  | +					/*
  | +					 * If there is a ambiguity, try with the default name
  | +					 */
  | +					bean = beans.get(defaultBeanName);
  | +
  | +					/*
  | +					 * If no beans amongst the ones of the expected type has the
  | +					 * default name then we can't do anything.
  | +					 */
  | +					if(bean == null) {
  | +						throw new IllegalArgumentException("More than one bean is of type " + type);
  | +					}
  | +
  | +				} else {
  | +					Iterator beansIterator = beans.values().iterator();
  | +					if(beansIterator.hasNext()) {
  | +						bean = beansIterator.next();
  | +					}
  | +				}
  | +
  | +    		} else {
  | +
  | +				/*
  | +				 * If no bean name is specified in the annotation and the bean
  | +				 * factory is not listable then the bean can only be looked up
  | +				 * by its default name.
  | +				 */
  | +				bean = beanFactory.getBean(defaultBeanName);
  | +
  | +			}
  | +    	}
  | +    	return bean;
  | +    }
  | +
  |      private void injectToMethod(Object target, Method method, Spring spring) throws Exception
  |      {
  | -        Object bean = getObjectFromBeanFactory(spring);
  | +    	String defaultBeanName = getDefaultBeanName(method);
  | +        Object bean = getObjectFromBeanFactory(spring, defaultBeanName, method.getReturnType());
  |          doAssert(bean, method.getParameterTypes()[0]);
  |          logInjection(spring, bean, target, method);
  |          method.setAccessible(true);
  |          method.invoke(target, bean);
  |      }
  |  
  | -    private void injectToField(Object target, Field field, Spring spring) throws Exception
  | +	private void injectToField(Object target, Field field, Spring spring) throws Exception
  |      {
  | -        Object bean = getObjectFromBeanFactory(spring);
  | +    	String defaultBeanName = getDefaultBeanName(field);
  | +        Object bean = getObjectFromBeanFactory(spring, defaultBeanName, field.getType());
  |          doAssert(bean, field.getType());
  |          logInjection(spring, bean, target, field);
  |          field.setAccessible(true);
  |          field.set(target, bean);
  |      }
  |  
  | +    private String getDefaultBeanName(Method method) {
  | +    	String name = method.getName().substring(3, 3).toLowerCase();
  | +    	name += method.getName().substring(4);
  | +		return name;
  | +	}
  | +
  | +    private String getDefaultBeanName(Field field) {
  | +    	String name = field.getName();
  | +		return name;
  | +	}
  | +
  |      private void doAssert(Object bean, Class expectedBeanClass)
  |      {
  |          Assert.isTrue(expectedBeanClass.isAssignableFrom(bean.getClass()),
  | Index: spring-int/src/main/org/jboss/annotation/spring/Spring.java
  | ===================================================================
  | --- spring-int/src/main/org/jboss/annotation/spring/Spring.java	(revision 57255)
  | +++ spring-int/src/main/org/jboss/annotation/spring/Spring.java	(working copy)
  | @@ -38,6 +38,6 @@
  |  
  |      String jndiName();
  |  
  | -    String bean();
  | +    String bean() default "";
  |  
  |  }
  | 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3974889#3974889

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3974889




More information about the jboss-user mailing list