/** * Expose the given target class for the specified bean, if possible. * @param beanFactory the containing ConfigurableListableBeanFactory * @param beanName the name of the bean * @param targetClass the corresponding target class * @since 4.2.3 */ static void exposeTargetClass( ConfigurableListableBeanFactory beanFactory, @Nullable String beanName, Class<?> targetClass) { if (beanName != null && beanFactory.containsBeanDefinition(beanName)) { beanFactory.getMergedBeanDefinition(beanName).setAttribute(ORIGINAL_TARGET_CLASS_ATTRIBUTE, targetClass); } }
/** * @param beanName a bean definition name * @param attributeName the name of the property * @param beanFactory a {@link BeanFactory} * @return The value for the attribute of the bean. Search parent hierarchy * if necessary. Return null if none is found. */ public static Object getAttribute(String beanName, String attributeName, ConfigurableListableBeanFactory beanFactory) { return beanFactory.getMergedBeanDefinition(beanName).getAttribute(attributeName); } }
/** * @param beanName a bean definition name * @param propertyName the name of the property * @param beanFactory a {@link BeanFactory} * @return The {@link PropertyValue} for the property of the bean. Search * parent hierarchy if necessary. Return null if none is found. */ public static PropertyValue getPropertyValue(String beanName, String propertyName, ConfigurableListableBeanFactory beanFactory) { return beanFactory.getMergedBeanDefinition(beanName).getPropertyValues().getPropertyValue(propertyName); }
/** * Determine the original target class for the specified bean, if possible, * otherwise falling back to a regular {@code getType} lookup. * @param beanFactory the containing ConfigurableListableBeanFactory * @param beanName the name of the bean * @return the original target class as stored in the bean definition, if any * @since 4.2.3 * @see org.springframework.beans.factory.BeanFactory#getType(String) */ @Nullable public static Class<?> determineTargetClass( ConfigurableListableBeanFactory beanFactory, @Nullable String beanName) { if (beanName == null) { return null; } if (beanFactory.containsBeanDefinition(beanName)) { BeanDefinition bd = beanFactory.getMergedBeanDefinition(beanName); Class<?> targetClass = (Class<?>) bd.getAttribute(ORIGINAL_TARGET_CLASS_ATTRIBUTE); if (targetClass != null) { return targetClass; } } return beanFactory.getType(beanName); }
@Nullable protected RootBeanDefinition getResolvedDecoratedDefinition(RootBeanDefinition rbd) { BeanDefinitionHolder decDef = rbd.getDecoratedDefinition(); if (decDef != null && this.beanFactory instanceof ConfigurableListableBeanFactory) { ConfigurableListableBeanFactory clbf = (ConfigurableListableBeanFactory) this.beanFactory; if (clbf.containsBeanDefinition(decDef.getBeanName())) { BeanDefinition dbd = clbf.getMergedBeanDefinition(decDef.getBeanName()); if (dbd instanceof RootBeanDefinition) { return (RootBeanDefinition) dbd; } } } return null; }
LookupOverride override = new LookupOverride(method, lookup.value()); try { RootBeanDefinition mbd = (RootBeanDefinition) this.beanFactory.getMergedBeanDefinition(beanName); mbd.getMethodOverrides().addOverride(override);
@Test public void testSimpleLocalSlsb() throws Exception { BeanDefinition beanDefinition = this.beanFactory.getMergedBeanDefinition("simpleLocalEjb"); assertEquals(LocalStatelessSessionProxyFactoryBean.class.getName(), beanDefinition.getBeanClassName()); assertPropertyValue(beanDefinition, "businessInterface", ITestBean.class.getName()); assertPropertyValue(beanDefinition, "jndiName", "ejb/MyLocalBean"); }
@Test public void testSimpleRemoteSlsb() throws Exception { BeanDefinition beanDefinition = this.beanFactory.getMergedBeanDefinition("simpleRemoteEjb"); assertEquals(SimpleRemoteStatelessSessionProxyFactoryBean.class.getName(), beanDefinition.getBeanClassName()); assertPropertyValue(beanDefinition, "businessInterface", ITestBean.class.getName()); assertPropertyValue(beanDefinition, "jndiName", "ejb/MyRemoteBean"); }
@Nullable protected RootBeanDefinition getResolvedDecoratedDefinition(RootBeanDefinition rbd) { BeanDefinitionHolder decDef = rbd.getDecoratedDefinition(); if (decDef != null && this.beanFactory instanceof ConfigurableListableBeanFactory) { ConfigurableListableBeanFactory clbf = (ConfigurableListableBeanFactory) this.beanFactory; if (clbf.containsBeanDefinition(decDef.getBeanName())) { BeanDefinition dbd = clbf.getMergedBeanDefinition(decDef.getBeanName()); if (dbd instanceof RootBeanDefinition) { return (RootBeanDefinition) dbd; } } } return null; }
@Test public void testWithEnvironment() throws Exception { BeanDefinition beanDefinition = this.beanFactory.getMergedBeanDefinition("withEnvironment"); assertPropertyValue(beanDefinition, "jndiEnvironment", "foo=bar"); assertPropertyValue(beanDefinition, "defaultObject", new RuntimeBeanReference("myBean")); }
@Test public void testLazyInitJndiLookup() throws Exception { BeanDefinition definition = this.beanFactory.getMergedBeanDefinition("lazyDataSource"); assertTrue(definition.isLazyInit()); definition = this.beanFactory.getMergedBeanDefinition("lazyLocalBean"); assertTrue(definition.isLazyInit()); definition = this.beanFactory.getMergedBeanDefinition("lazyRemoteBean"); assertTrue(definition.isLazyInit()); }
@Test public void testWithReferencedEnvironment() throws Exception { BeanDefinition beanDefinition = this.beanFactory.getMergedBeanDefinition("withReferencedEnvironment"); assertPropertyValue(beanDefinition, "jndiEnvironment", new RuntimeBeanReference("myEnvironment")); assertFalse(beanDefinition.getPropertyValues().contains("environmentRef")); }
@Test public void testSimpleDefinition() throws Exception { BeanDefinition beanDefinition = this.beanFactory.getMergedBeanDefinition("simple"); assertEquals(JndiObjectFactoryBean.class.getName(), beanDefinition.getBeanClassName()); assertPropertyValue(beanDefinition, "jndiName", "jdbc/MyDataSource"); assertPropertyValue(beanDefinition, "resourceRef", "true"); }
LookupOverride override = new LookupOverride(method, lookup.value()); try { RootBeanDefinition mbd = (RootBeanDefinition) this.beanFactory.getMergedBeanDefinition(beanName); mbd.getMethodOverrides().addOverride(override);
@Test public void testComplexLocalSlsb() throws Exception { BeanDefinition beanDefinition = this.beanFactory.getMergedBeanDefinition("complexLocalEjb"); assertEquals(LocalStatelessSessionProxyFactoryBean.class.getName(), beanDefinition.getBeanClassName()); assertPropertyValue(beanDefinition, "businessInterface", ITestBean.class.getName()); assertPropertyValue(beanDefinition, "jndiName", "ejb/MyLocalBean"); assertPropertyValue(beanDefinition, "cacheHome", "true"); assertPropertyValue(beanDefinition, "lookupHomeOnStartup", "true"); assertPropertyValue(beanDefinition, "resourceRef", "true"); assertPropertyValue(beanDefinition, "jndiEnvironment", "foo=bar"); }
@Test public void testComplexRemoteSlsb() throws Exception { BeanDefinition beanDefinition = this.beanFactory.getMergedBeanDefinition("complexRemoteEjb"); assertEquals(SimpleRemoteStatelessSessionProxyFactoryBean.class.getName(), beanDefinition.getBeanClassName()); assertPropertyValue(beanDefinition, "businessInterface", ITestBean.class.getName()); assertPropertyValue(beanDefinition, "jndiName", "ejb/MyRemoteBean"); assertPropertyValue(beanDefinition, "cacheHome", "true"); assertPropertyValue(beanDefinition, "lookupHomeOnStartup", "true"); assertPropertyValue(beanDefinition, "resourceRef", "true"); assertPropertyValue(beanDefinition, "jndiEnvironment", "foo=bar"); assertPropertyValue(beanDefinition, "homeInterface", "org.springframework.tests.sample.beans.ITestBean"); assertPropertyValue(beanDefinition, "refreshHomeOnConnectFailure", "true"); assertPropertyValue(beanDefinition, "cacheSessionBean", "true"); }
@Test public void testComplexDefinition() throws Exception { BeanDefinition beanDefinition = this.beanFactory.getMergedBeanDefinition("complex"); assertEquals(JndiObjectFactoryBean.class.getName(), beanDefinition.getBeanClassName()); assertPropertyValue(beanDefinition, "jndiName", "jdbc/MyDataSource"); assertPropertyValue(beanDefinition, "resourceRef", "true"); assertPropertyValue(beanDefinition, "cache", "true"); assertPropertyValue(beanDefinition, "lookupOnStartup", "true"); assertPropertyValue(beanDefinition, "exposeAccessContext", "true"); assertPropertyValue(beanDefinition, "expectedType", "com.myapp.DefaultFoo"); assertPropertyValue(beanDefinition, "proxyInterface", "com.myapp.Foo"); assertPropertyValue(beanDefinition, "defaultObject", "myValue"); }
BeanDefinition bd = beanFactory.getMergedBeanDefinition(beanName);
@Test public void testFactoryBeanObjectTypeWithServiceInterface() throws Exception { ConfigurableListableBeanFactory beanFactory = ((GenericApplicationContext) context).getBeanFactory(); Object attribute = beanFactory.getMergedBeanDefinition("&oneWay").getAttribute( IntegrationConfigUtils.FACTORY_BEAN_OBJECT_TYPE); assertEquals(TestService.class.getName(), attribute); }
@Test public void testFactoryBeanObjectTypeWithNoServiceInterface() throws Exception { ConfigurableListableBeanFactory beanFactory = ((GenericApplicationContext) context).getBeanFactory(); Object attribute = beanFactory.getMergedBeanDefinition("&defaultConfig").getAttribute( IntegrationConfigUtils.FACTORY_BEAN_OBJECT_TYPE); assertEquals(RequestReplyExchanger.class.getName(), attribute); }