package org.jboss.seam.ioc.spring; import org.jboss.seam.Component; import org.springframework.beans.BeansException; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.core.Ordered; /** * Intercepts when spring attempts to obtain an instance of a bean. If the bean is a seam component then we retrieve the * bean from seam to ensure it gets wrapped and managed by seam as well. This post processor must have a lower * precedence than any spring autoproxy creators. * * @author youngm */ public class SeamComponentPostProcessor implements BeanPostProcessor, Ordered { private int order = Ordered.LOWEST_PRECEDENCE; /** * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization(java.lang.Object, * java.lang.String) */ public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException { // Check to see if this bean is a component. SpringComponent component = SpringComponent.forSpringBeanName(beanName); // Not a spring component skip. if (component == null) { return bean; } // If this bean is a FactoryBean only request the bean from Seam if the component is a FactoryBean as well // The object created by the factory should come along later if (bean instanceof FactoryBean && !FactoryBean.class.isAssignableFrom(component.getBeanClass())) { return bean; } // Wrap our bean instance in an object factory for the SpringComponent to use SpringComponent.setObjectFactory(new ObjectFactory() { public Object getObject() throws BeansException { return bean; } }); // Return the seam instance return Component.getInstance(beanName, component.getScope()); } /** * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization(java.lang.Object, * java.lang.String) */ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } /** * This post processor must run after any spring AutoProxyCreator * * @see org.springframework.core.Ordered#getOrder() */ public int getOrder() { return order; } /** * @param order the order to set */ public void setOrder(int order) { this.order = order; } }