/** * Register bean definitions contained in a resource bundle, * using all property keys (i.e. not filtering by prefix). * @param rb the ResourceBundle to load from * @return the number of bean definitions found * @throws BeanDefinitionStoreException in case of loading or parsing errors * @see #registerBeanDefinitions(java.util.ResourceBundle, String) */ public int registerBeanDefinitions(ResourceBundle rb) throws BeanDefinitionStoreException { return registerBeanDefinitions(rb, null); }
/** * Register bean definitions contained in a Map, using all property keys (i.e. not * filtering by prefix). * @param map a map of {@code name} to {@code property} (String or Object). Property * values will be strings if coming from a Properties file etc. Property names * (keys) <b>must</b> be Strings. Class keys must be Strings. * @return the number of bean definitions found * @throws BeansException in case of loading or parsing errors * @see #registerBeanDefinitions(java.util.Map, String, String) */ public int registerBeanDefinitions(Map<?, ?> map) throws BeansException { return registerBeanDefinitions(map, null); }
/** * Register bean definitions contained in a Map. * Ignore ineligible properties. * @param map a map of {@code name} to {@code property} (String or Object). Property * values will be strings if coming from a Properties file etc. Property names * (keys) <b>must</b> be Strings. Class keys must be Strings. * @param prefix a filter within the keys in the map: e.g. 'beans.' * (can be empty or {@code null}) * @return the number of bean definitions found * @throws BeansException in case of loading or parsing errors */ public int registerBeanDefinitions(Map<?, ?> map, @Nullable String prefix) throws BeansException { return registerBeanDefinitions(map, prefix, "Map " + map); }
/** * Register bean definitions contained in a ResourceBundle. * <p>Similar syntax as for a Map. This method is useful to enable * standard Java internationalization support. * @param rb the ResourceBundle to load from * @param prefix a filter within the keys in the map: e.g. 'beans.' * (can be empty or {@code null}) * @return the number of bean definitions found * @throws BeanDefinitionStoreException in case of loading or parsing errors */ public int registerBeanDefinitions(ResourceBundle rb, @Nullable String prefix) throws BeanDefinitionStoreException { // Simply create a map and call overloaded method. Map<String, Object> map = new HashMap<>(); Enumeration<String> keys = rb.getKeys(); while (keys.hasMoreElements()) { String key = keys.nextElement(); map.put(key, rb.getObject(key)); } return registerBeanDefinitions(map, prefix); }
/** * Load bean definitions from the database via the given SQL string. * @param sql the SQL query to use for loading bean definitions. * The first three columns must be bean name, property name and value. * Any join and any other columns are permitted: e.g. * {@code SELECT BEAN_NAME, PROPERTY, VALUE FROM CONFIG WHERE CONFIG.APP_ID = 1} * It's also possible to perform a join. Column names are not significant -- * only the ordering of these first three columns. */ public void loadBeanDefinitions(String sql) { Assert.notNull(this.jdbcTemplate, "Not fully configured - specify DataSource or JdbcTemplate"); final Properties props = new Properties(); this.jdbcTemplate.query(sql, rs -> { String beanName = rs.getString(1); String property = rs.getString(2); String value = rs.getString(3); // Make a properties entry by combining bean name and property. props.setProperty(beanName + '.' + property, value); }); this.propReader.registerBeanDefinitions(props); }
@Test public void testPropertiesPopulationWithNullPrefix() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); p.setProperty("test.(class)", TestBean.class.getName()); p.setProperty("test.name", "Tony"); p.setProperty("test.age", "48"); int count = (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p); assertTrue("1 beans registered, not " + count, count == 1); testSingleTestBean(lbf); }
@Test public void testPropertiesPopulationWithPrefix() { String PREFIX = "beans."; DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); p.setProperty(PREFIX + "test.(class)", TestBean.class.getName()); p.setProperty(PREFIX + "test.name", "Tony"); p.setProperty(PREFIX + "test.age", "0x30"); int count = (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p, PREFIX); assertTrue("1 beans registered, not " + count, count == 1); testSingleTestBean(lbf); }
@Test public void testNameAlreadyBound() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); p.setProperty("kerry.(class)", TestBean.class.getName()); p.setProperty("kerry.age", "35"); (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p); try { (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p); } catch (BeanDefinitionStoreException ex) { assertEquals("kerry", ex.getBeanName()); // expected } }
@Test public void testCanEscapeBeanReferenceSyntax() { String name = "*name"; DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); p.setProperty("r.(class)", TestBean.class.getName()); p.setProperty("r.name", "*" + name); (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p); TestBean r = (TestBean) lbf.getBean("r"); assertTrue(r.getName().equals(name)); }
@Test public void testBeanReferenceWithNewSyntax() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); p.setProperty("r.(class)", TestBean.class.getName()); p.setProperty("r.name", "rod"); p.setProperty("k.(class)", TestBean.class.getName()); p.setProperty("k.name", "kerry"); p.setProperty("k.spouse", "*r"); (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p); TestBean k = (TestBean) lbf.getBean("k"); TestBean r = (TestBean) lbf.getBean("r"); assertTrue(k.getSpouse() == r); }
@Test public void testHarmlessIgnorableRubbish() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); p.setProperty("foo", "bar"); p.setProperty("qwert", "er"); (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p, "test"); assertTrue("No beans defined after harmless ignorable rubbish", lbf.getBeanDefinitionCount() == 0); }
@Test public void testUnresolvedReference() { String PREFIX = "beans."; DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); try { p.setProperty(PREFIX + "kerry.(class)", TestBean.class.getName()); p.setProperty(PREFIX + "kerry.name", "Kerry"); p.setProperty(PREFIX + "kerry.age", "35"); p.setProperty(PREFIX + "kerry.spouse(ref)", "rod"); (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p, PREFIX); lbf.getBean("kerry"); fail("Unresolved reference should have been detected"); } catch (BeansException ex) { // cool } }
@Test public void testPrototypeCircleLeadsToException() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); p.setProperty("kerry.(class)", TestBean.class.getName()); p.setProperty("kerry.(singleton)", "false"); p.setProperty("kerry.age", "35"); p.setProperty("kerry.spouse", "*rod"); p.setProperty("rod.(class)", TestBean.class.getName()); p.setProperty("rod.(singleton)", "false"); p.setProperty("rod.age", "34"); p.setProperty("rod.spouse", "*kerry"); (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p); try { lbf.getBean("kerry"); fail("Should have thrown BeanCreationException"); } catch (BeanCreationException ex) { // expected assertTrue(ex.contains(BeanCurrentlyInCreationException.class)); } }
@Test public void testPropertiesWithDotsInKey() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); p.setProperty("tb.(class)", TestBean.class.getName()); p.setProperty("tb.someMap[my.key]", "my.value"); int count = (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p); assertTrue("1 beans registered, not " + count, count == 1); assertEquals(1, lbf.getBeanDefinitionCount()); TestBean tb = lbf.getBean("tb", TestBean.class); assertEquals("my.value", tb.getSomeMap().get("my.key")); }
@Test public void testSimpleReference() { String PREFIX = "beans."; DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); p.setProperty(PREFIX + "rod.(class)", TestBean.class.getName()); p.setProperty(PREFIX + "rod.name", "Rod"); p.setProperty(PREFIX + "kerry.(class)", TestBean.class.getName()); p.setProperty(PREFIX + "kerry.name", "Kerry"); p.setProperty(PREFIX + "kerry.age", "35"); p.setProperty(PREFIX + "kerry.spouse(ref)", "rod"); int count = (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p, PREFIX); assertTrue("2 beans registered, not " + count, count == 2); TestBean kerry = lbf.getBean("kerry", TestBean.class); assertTrue("Kerry name is Kerry", "Kerry".equals(kerry.getName())); ITestBean spouse = kerry.getSpouse(); assertTrue("Kerry spouse is non null", spouse != null); assertTrue("Kerry spouse name is Rod", "Rod".equals(spouse.getName())); }
@Test public void testEmptyPropertiesPopulation() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p); assertTrue("No beans defined after ignorable invalid", lbf.getBeanDefinitionCount() == 0); }
@Test public void testUnreferencedSingletonWasInstantiated() { KnowsIfInstantiated.clearInstantiationRecord(); DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); p.setProperty("x1.(class)", KnowsIfInstantiated.class.getName()); assertTrue("singleton not instantiated", !KnowsIfInstantiated.wasInstantiated()); (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p); lbf.preInstantiateSingletons(); assertTrue("singleton was instantiated", KnowsIfInstantiated.wasInstantiated()); }
@Test public void testLazyInitialization() { KnowsIfInstantiated.clearInstantiationRecord(); DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); p.setProperty("x1.(class)", KnowsIfInstantiated.class.getName()); p.setProperty("x1.(lazy-init)", "true"); assertTrue("singleton not instantiated", !KnowsIfInstantiated.wasInstantiated()); (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p); assertTrue("singleton not instantiated", !KnowsIfInstantiated.wasInstantiated()); lbf.preInstantiateSingletons(); assertTrue("singleton not instantiated", !KnowsIfInstantiated.wasInstantiated()); lbf.getBean("x1"); assertTrue("singleton was instantiated", KnowsIfInstantiated.wasInstantiated()); }
p.setProperty("test.age", "48"); p.setProperty("test.spouse(ref)", "singletonObject"); (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p); Object singletonObject = new TestBean(); lbf.registerSingleton("singletonObject", singletonObject);
@Test public void testFactoryBeanDidNotCreatePrototype() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); Properties p = new Properties(); p.setProperty("x1.(class)", DummyFactory.class.getName()); // Reset static state DummyFactory.reset(); p.setProperty("x1.singleton", "false"); assertTrue("prototype not instantiated", !DummyFactory.wasPrototypeCreated()); (new PropertiesBeanDefinitionReader(lbf)).registerBeanDefinitions(p); assertTrue("prototype not instantiated", !DummyFactory.wasPrototypeCreated()); assertEquals(TestBean.class, lbf.getType("x1")); lbf.preInstantiateSingletons(); assertTrue("prototype not instantiated", !DummyFactory.wasPrototypeCreated()); lbf.getBean("x1"); assertEquals(TestBean.class, lbf.getType("x1")); assertTrue(lbf.containsBean("x1")); assertTrue(lbf.containsBean("&x1")); assertTrue("prototype was instantiated", DummyFactory.wasPrototypeCreated()); }