@Test public void findsBeansByTypeIfNotInstantiated() { assertThat(bf.isTypeMatch("&foo", FactoryBean.class), is(true)); @SuppressWarnings("rawtypes") Map<String, FactoryBean> fbBeans = bf.getBeansOfType(FactoryBean.class); assertThat(1, equalTo(fbBeans.size())); assertThat("&foo", equalTo(fbBeans.keySet().iterator().next())); Map<String, AnInterface> aiBeans = bf.getBeansOfType(AnInterface.class); assertThat(aiBeans.size(), is(1)); assertThat(aiBeans.keySet(), hasItem("&foo")); }
(includeNonSingletons || (dbd != null ? mbd.isSingleton() : isSingleton(beanName))) && isTypeMatch(beanName, type); if (!matchFound && isFactoryBean) { matchFound = (includeNonSingletons || mbd.isSingleton()) && isTypeMatch(beanName, type); if ((includeNonSingletons || isSingleton(beanName)) && isTypeMatch(beanName, type)) { result.add(beanName); if (isTypeMatch(beanName, type)) { result.add(beanName);
@Test public void repro() { assertThat(bf.getBean("foo"), instanceOf(Foo.class)); assertThat(bf.getBean("&foo"), instanceOf(FooFactoryBean.class)); assertThat(bf.isTypeMatch("&foo", FactoryBean.class), is(true)); @SuppressWarnings("rawtypes") Map<String, FactoryBean> fbBeans = bf.getBeansOfType(FactoryBean.class); assertThat(fbBeans.size(), is(1)); assertThat(fbBeans.keySet(), hasItem("&foo")); Map<String, AnInterface> aiBeans = bf.getBeansOfType(AnInterface.class); assertThat(aiBeans.size(), is(1)); assertThat(aiBeans.keySet(), hasItem("&foo")); }
(includeNonSingletons || (dbd != null ? mbd.isSingleton() : isSingleton(beanName))) && isTypeMatch(beanName, type); if (!matchFound && isFactoryBean) { matchFound = (includeNonSingletons || mbd.isSingleton()) && isTypeMatch(beanName, type); if ((includeNonSingletons || isSingleton(beanName)) && isTypeMatch(beanName, type)) { result.add(beanName); if (isTypeMatch(beanName, type)) { result.add(beanName);
@Test public void parameterizedInstanceFactoryMethodWithWrappedClassName() { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); RootBeanDefinition rbd = new RootBeanDefinition(); rbd.setBeanClassName(Mockito.class.getName()); rbd.setFactoryMethodName("mock"); // TypedStringValue used to be equivalent to an XML-defined argument String rbd.getConstructorArgumentValues().addGenericArgumentValue(new TypedStringValue(Runnable.class.getName())); bf.registerBeanDefinition("mock", rbd); assertTrue(bf.isTypeMatch("mock", Runnable.class)); assertTrue(bf.isTypeMatch("mock", Runnable.class)); assertEquals(Runnable.class, bf.getType("mock")); assertEquals(Runnable.class, bf.getType("mock")); Map<String, Runnable> beans = bf.getBeansOfType(Runnable.class); assertEquals(1, beans.size()); }
@Test public void parameterizedInstanceFactoryMethodWithNonResolvedClassName() { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); RootBeanDefinition rbd = new RootBeanDefinition(MocksControl.class); bf.registerBeanDefinition("mocksControl", rbd); rbd = new RootBeanDefinition(); rbd.setFactoryBeanName("mocksControl"); rbd.setFactoryMethodName("createMock"); rbd.getConstructorArgumentValues().addGenericArgumentValue(Runnable.class.getName()); bf.registerBeanDefinition("mock", rbd); assertTrue(bf.isTypeMatch("mock", Runnable.class)); assertTrue(bf.isTypeMatch("mock", Runnable.class)); assertEquals(Runnable.class, bf.getType("mock")); assertEquals(Runnable.class, bf.getType("mock")); Map<String, Runnable> beans = bf.getBeansOfType(Runnable.class); assertEquals(1, beans.size()); }
@Test // SPR-16720 public void parameterizedInstanceFactoryMethodWithTempClassLoader() { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); bf.setTempClassLoader(new OverridingClassLoader(getClass().getClassLoader())); RootBeanDefinition rbd = new RootBeanDefinition(MocksControl.class); bf.registerBeanDefinition("mocksControl", rbd); rbd = new RootBeanDefinition(); rbd.setFactoryBeanName("mocksControl"); rbd.setFactoryMethodName("createMock"); rbd.getConstructorArgumentValues().addGenericArgumentValue(Runnable.class); bf.registerBeanDefinition("mock", rbd); assertTrue(bf.isTypeMatch("mock", Runnable.class)); assertTrue(bf.isTypeMatch("mock", Runnable.class)); assertEquals(Runnable.class, bf.getType("mock")); assertEquals(Runnable.class, bf.getType("mock")); Map<String, Runnable> beans = bf.getBeansOfType(Runnable.class); assertEquals(1, beans.size()); }
@Test public void parameterizedInstanceFactoryMethodWithInvalidClassName() { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); RootBeanDefinition rbd = new RootBeanDefinition(MocksControl.class); bf.registerBeanDefinition("mocksControl", rbd); rbd = new RootBeanDefinition(); rbd.setFactoryBeanName("mocksControl"); rbd.setFactoryMethodName("createMock"); rbd.getConstructorArgumentValues().addGenericArgumentValue("x"); bf.registerBeanDefinition("mock", rbd); assertFalse(bf.isTypeMatch("mock", Runnable.class)); assertFalse(bf.isTypeMatch("mock", Runnable.class)); assertNull(bf.getType("mock")); assertNull(bf.getType("mock")); Map<String, Runnable> beans = bf.getBeansOfType(Runnable.class); assertEquals(0, beans.size()); }
@Test public void parameterizedInstanceFactoryMethodWithIndexedArgument() { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); RootBeanDefinition rbd = new RootBeanDefinition(MocksControl.class); bf.registerBeanDefinition("mocksControl", rbd); rbd = new RootBeanDefinition(); rbd.setFactoryBeanName("mocksControl"); rbd.setFactoryMethodName("createMock"); rbd.getConstructorArgumentValues().addIndexedArgumentValue(0, Runnable.class); bf.registerBeanDefinition("mock", rbd); assertTrue(bf.isTypeMatch("mock", Runnable.class)); assertTrue(bf.isTypeMatch("mock", Runnable.class)); assertEquals(Runnable.class, bf.getType("mock")); assertEquals(Runnable.class, bf.getType("mock")); Map<String, Runnable> beans = bf.getBeansOfType(Runnable.class); assertEquals(1, beans.size()); }
assertTrue(lbf.isPrototype("x1")); assertTrue(lbf.isPrototype("&x1")); assertTrue(lbf.isTypeMatch("x1", TestBean.class)); assertFalse(lbf.isTypeMatch("&x1", TestBean.class)); assertTrue(lbf.isTypeMatch("&x1", DummyFactory.class)); assertTrue(lbf.isTypeMatch("&x1", ResolvableType.forClass(DummyFactory.class))); assertTrue(lbf.isTypeMatch("&x1", ResolvableType.forClassWithGenerics(FactoryBean.class, Object.class))); assertFalse(lbf.isTypeMatch("&x1", ResolvableType.forClassWithGenerics(FactoryBean.class, String.class))); assertEquals(TestBean.class, lbf.getType("x1")); assertEquals(DummyFactory.class, lbf.getType("&x1"));
/** * Tests support for parameterized instance {@code factory-method} declarations such * as EasyMock's {@code IMocksControl.createMock()} method which has the following * signature. * <pre> * {@code * public <T> T createMock(Class<T> toMock) * } * </pre> * <p>See SPR-10411 */ @Test public void parameterizedInstanceFactoryMethod() { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); RootBeanDefinition rbd = new RootBeanDefinition(MocksControl.class); bf.registerBeanDefinition("mocksControl", rbd); rbd = new RootBeanDefinition(); rbd.setFactoryBeanName("mocksControl"); rbd.setFactoryMethodName("createMock"); rbd.getConstructorArgumentValues().addGenericArgumentValue(Runnable.class); bf.registerBeanDefinition("mock", rbd); assertTrue(bf.isTypeMatch("mock", Runnable.class)); assertTrue(bf.isTypeMatch("mock", Runnable.class)); assertEquals(Runnable.class, bf.getType("mock")); assertEquals(Runnable.class, bf.getType("mock")); Map<String, Runnable> beans = bf.getBeansOfType(Runnable.class); assertEquals(1, beans.size()); }
assertTrue(lbf.isPrototype("x1")); assertFalse(lbf.isPrototype("&x1")); assertTrue(lbf.isTypeMatch("x1", TestBean.class)); assertFalse(lbf.isTypeMatch("&x1", TestBean.class)); assertTrue(lbf.isTypeMatch("&x1", DummyFactory.class)); assertTrue(lbf.isTypeMatch("&x1", ResolvableType.forClass(DummyFactory.class))); assertTrue(lbf.isTypeMatch("&x1", ResolvableType.forClassWithGenerics(FactoryBean.class, Object.class))); assertFalse(lbf.isTypeMatch("&x1", ResolvableType.forClassWithGenerics(FactoryBean.class, String.class))); assertEquals(TestBean.class, lbf.getType("x1")); assertEquals(DummyFactory.class, lbf.getType("&x1"));
assertTrue(lbf.isPrototype("x1")); assertTrue(lbf.isPrototype("&x1")); assertTrue(lbf.isTypeMatch("x1", TestBean.class)); assertFalse(lbf.isTypeMatch("&x1", TestBean.class)); assertTrue(lbf.isTypeMatch("&x1", DummyFactory.class)); assertTrue(lbf.isTypeMatch("&x1", ResolvableType.forClass(DummyFactory.class))); assertTrue(lbf.isTypeMatch("&x1", ResolvableType.forClassWithGenerics(FactoryBean.class, Object.class))); assertFalse(lbf.isTypeMatch("&x1", ResolvableType.forClassWithGenerics(FactoryBean.class, String.class))); assertEquals(TestBean.class, lbf.getType("x1")); assertEquals(DummyFactory.class, lbf.getType("&x1"));
assertTrue(lbf.isPrototype("x1")); assertFalse(lbf.isPrototype("&x1")); assertTrue(lbf.isTypeMatch("x1", TestBean.class)); assertFalse(lbf.isTypeMatch("&x1", TestBean.class)); assertTrue(lbf.isTypeMatch("&x1", DummyFactory.class)); assertTrue(lbf.isTypeMatch("x1", Object.class)); assertTrue(lbf.isTypeMatch("&x1", Object.class)); assertEquals(TestBean.class, lbf.getType("x1")); assertEquals(DummyFactory.class, lbf.getType("&x1")); assertTrue(lbf.isPrototype("x2")); assertFalse(lbf.isPrototype("&x2")); assertTrue(lbf.isTypeMatch("x2", TestBean.class)); assertFalse(lbf.isTypeMatch("&x2", TestBean.class)); assertTrue(lbf.isTypeMatch("&x2", DummyFactory.class)); assertTrue(lbf.isTypeMatch("x2", Object.class)); assertTrue(lbf.isTypeMatch("&x2", Object.class)); assertEquals(TestBean.class, lbf.getType("x2")); assertEquals(DummyFactory.class, lbf.getType("&x2"));
@Test public void testNonStaticFactoryMethodFoundByNonEagerTypeMatching() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); RootBeanDefinition factoryBd = new RootBeanDefinition(TestBeanFactory.class); lbf.registerBeanDefinition("factory", factoryBd); RootBeanDefinition rbd = new RootBeanDefinition(TestBeanFactory.class); rbd.setFactoryBeanName("factory"); rbd.setFactoryMethodName("createTestBeanNonStatic"); lbf.registerBeanDefinition("x1", rbd); TestBeanFactory.initialized = false; String[] beanNames = lbf.getBeanNamesForType(TestBean.class, true, false); assertEquals(1, beanNames.length); assertEquals("x1", beanNames[0]); assertFalse(lbf.containsSingleton("x1")); assertTrue(lbf.containsBean("x1")); assertFalse(lbf.containsBean("&x1")); assertTrue(lbf.isSingleton("x1")); assertFalse(lbf.isSingleton("&x1")); assertFalse(lbf.isPrototype("x1")); assertFalse(lbf.isPrototype("&x1")); assertTrue(lbf.isTypeMatch("x1", TestBean.class)); assertFalse(lbf.isTypeMatch("&x1", TestBean.class)); assertEquals(TestBean.class, lbf.getType("x1")); assertEquals(null, lbf.getType("&x1")); assertFalse(TestBeanFactory.initialized); }
@Test public void testStaticPrototypeFactoryMethodFoundByNonEagerTypeMatching() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); RootBeanDefinition rbd = new RootBeanDefinition(TestBeanFactory.class); rbd.setScope(RootBeanDefinition.SCOPE_PROTOTYPE); rbd.setFactoryMethodName("createTestBean"); lbf.registerBeanDefinition("x1", rbd); TestBeanFactory.initialized = false; String[] beanNames = lbf.getBeanNamesForType(TestBean.class, true, false); assertEquals(1, beanNames.length); assertEquals("x1", beanNames[0]); assertFalse(lbf.containsSingleton("x1")); assertTrue(lbf.containsBean("x1")); assertFalse(lbf.containsBean("&x1")); assertFalse(lbf.isSingleton("x1")); assertFalse(lbf.isSingleton("&x1")); assertTrue(lbf.isPrototype("x1")); assertFalse(lbf.isPrototype("&x1")); assertTrue(lbf.isTypeMatch("x1", TestBean.class)); assertFalse(lbf.isTypeMatch("&x1", TestBean.class)); assertEquals(TestBean.class, lbf.getType("x1")); assertEquals(null, lbf.getType("&x1")); assertFalse(TestBeanFactory.initialized); }
@Test public void testStaticFactoryMethodFoundByNonEagerTypeMatching() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); RootBeanDefinition rbd = new RootBeanDefinition(TestBeanFactory.class); rbd.setFactoryMethodName("createTestBean"); lbf.registerBeanDefinition("x1", rbd); TestBeanFactory.initialized = false; String[] beanNames = lbf.getBeanNamesForType(TestBean.class, true, false); assertEquals(1, beanNames.length); assertEquals("x1", beanNames[0]); assertFalse(lbf.containsSingleton("x1")); assertTrue(lbf.containsBean("x1")); assertFalse(lbf.containsBean("&x1")); assertTrue(lbf.isSingleton("x1")); assertFalse(lbf.isSingleton("&x1")); assertFalse(lbf.isPrototype("x1")); assertFalse(lbf.isPrototype("&x1")); assertTrue(lbf.isTypeMatch("x1", TestBean.class)); assertFalse(lbf.isTypeMatch("&x1", TestBean.class)); assertEquals(TestBean.class, lbf.getType("x1")); assertEquals(null, lbf.getType("&x1")); assertFalse(TestBeanFactory.initialized); }
assertTrue(lbf.isPrototype("x1")); assertFalse(lbf.isPrototype("&x1")); assertTrue(lbf.isTypeMatch("x1", TestBean.class)); assertFalse(lbf.isTypeMatch("&x1", TestBean.class)); assertTrue(lbf.isTypeMatch("x1", Object.class)); assertFalse(lbf.isTypeMatch("&x1", Object.class)); assertEquals(TestBean.class, lbf.getType("x1")); assertEquals(null, lbf.getType("&x1")); assertTrue(lbf.isPrototype("x2")); assertFalse(lbf.isPrototype("&x2")); assertTrue(lbf.isTypeMatch("x2", TestBean.class)); assertFalse(lbf.isTypeMatch("&x2", TestBean.class)); assertTrue(lbf.isTypeMatch("x2", Object.class)); assertFalse(lbf.isTypeMatch("&x2", Object.class)); assertEquals(TestBean.class, lbf.getType("x2")); assertEquals(null, lbf.getType("&x2"));
(includeNonSingletons || isSingleton(beanName)) && isTypeMatch(beanName, type); if (!matchFound && isFactoryBean) { matchFound = (includeNonSingletons || mbd.isSingleton()) && isTypeMatch(beanName, type); if ((includeNonSingletons || isSingleton(beanName)) && isTypeMatch(beanName, type)) { result.add(beanName); if (isTypeMatch(beanName, type)) { result.add(beanName);
/** * Override to always return false if the raven decorators are present, * otherwise delegates to the superclass method */ @SuppressWarnings("unchecked") @Override public boolean isTypeMatch(String beanName, Class type) { /** * try { BeanDefinition bd = getBeanDefinition(beanName); if * (bd.hasAttribute(ARTIFACT_BEAN_ATTRIBUTE_NAME)) { return false; } } * catch (NoSuchBeanDefinitionException nsbde) { // Happens if we're * passed a factory bean here - the raven aware // beans are never * factories } */ return super.isTypeMatch(beanName, type); }