/* * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.beans.factory.annotation; import java.io.Serializable; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.List; import java.util.Map; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import test.beans.ITestBean; import test.beans.IndexedTestBean; import test.beans.NestedTestBean; import test.beans.TestBean; public final class AutowiredAnnotationBeanPostProcessorTests { public static class ResourceInjectionBean { @Autowired(required = false) private TestBean testBean; private TestBean testBean2; @Autowired public void setTestBean2(TestBean testBean2) { if (this.testBean2 != null) { throw new IllegalStateException("Already called"); } this.testBean2 = testBean2; } public TestBean getTestBean() { return this.testBean; } public TestBean getTestBean2() { return this.testBean2; } } public static class ExtendedResourceInjectionBean<T> extends ResourceInjectionBean { @Autowired protected ITestBean testBean3; private T nestedTestBean; private ITestBean testBean4; protected BeanFactory beanFactory; public boolean baseInjected = false; public ExtendedResourceInjectionBean() { } @Autowired @Required public void setTestBean2(TestBean testBean2) { super.setTestBean2(testBean2); } @Autowired private void inject(ITestBean testBean4, T nestedTestBean) { this.testBean4 = testBean4; this.nestedTestBean = nestedTestBean; } @Autowired private void inject(ITestBean testBean4) { this.baseInjected = true; } @Autowired protected void initBeanFactory(BeanFactory beanFactory) { this.beanFactory = beanFactory; } public ITestBean getTestBean3() { return this.testBean3; } public ITestBean getTestBean4() { return this.testBean4; } public T getNestedTestBean() { return this.nestedTestBean; } public BeanFactory getBeanFactory() { return this.beanFactory; } } public static class TypedExtendedResourceInjectionBean extends ExtendedResourceInjectionBean<NestedTestBean> { } public static class OverriddenExtendedResourceInjectionBean extends ExtendedResourceInjectionBean<NestedTestBean> { public boolean subInjected = false; @Override public void setTestBean2(TestBean testBean2) { super.setTestBean2(testBean2); } @Override protected void initBeanFactory(BeanFactory beanFactory) { this.beanFactory = beanFactory; } @Autowired private void inject(ITestBean testBean4) { this.subInjected = true; } } public static class OptionalResourceInjectionBean extends ResourceInjectionBean { @Autowired(required = false) protected ITestBean testBean3; private IndexedTestBean indexedTestBean; private NestedTestBean[] nestedTestBeans; @Autowired(required = false) public NestedTestBean[] nestedTestBeansField; private ITestBean testBean4; @Autowired(required = false) public void setTestBean2(TestBean testBean2) { super.setTestBean2(testBean2); } @Autowired(required = false) private void inject(ITestBean testBean4, NestedTestBean[] nestedTestBeans, IndexedTestBean indexedTestBean) { this.testBean4 = testBean4; this.indexedTestBean = indexedTestBean; this.nestedTestBeans = nestedTestBeans; } public ITestBean getTestBean3() { return this.testBean3; } public ITestBean getTestBean4() { return this.testBean4; } public IndexedTestBean getIndexedTestBean() { return this.indexedTestBean; } public NestedTestBean[] getNestedTestBeans() { return this.nestedTestBeans; } } public static class OptionalCollectionResourceInjectionBean extends ResourceInjectionBean { @Autowired(required = false) protected ITestBean testBean3; private IndexedTestBean indexedTestBean; private List<NestedTestBean> nestedTestBeans; public List<NestedTestBean> nestedTestBeansSetter; @Autowired(required = false) public List<NestedTestBean> nestedTestBeansField; private ITestBean testBean4; @Autowired(required = false) public void setTestBean2(TestBean testBean2) { super.setTestBean2(testBean2); } @Autowired(required = false) private void inject(ITestBean testBean4, List<NestedTestBean> nestedTestBeans, IndexedTestBean indexedTestBean) { this.testBean4 = testBean4; this.indexedTestBean = indexedTestBean; this.nestedTestBeans = nestedTestBeans; } @Autowired(required = false) public void setNestedTestBeans(List<NestedTestBean> nestedTestBeans) { this.nestedTestBeansSetter = nestedTestBeans; } public ITestBean getTestBean3() { return this.testBean3; } public ITestBean getTestBean4() { return this.testBean4; } public IndexedTestBean getIndexedTestBean() { return this.indexedTestBean; } public List<NestedTestBean> getNestedTestBeans() { return this.nestedTestBeans; } } public static class ConstructorResourceInjectionBean extends ResourceInjectionBean { @Autowired protected ITestBean testBean3; private ITestBean testBean4; private NestedTestBean nestedTestBean; private ConfigurableListableBeanFactory beanFactory; public ConstructorResourceInjectionBean() { throw new UnsupportedOperationException(); } public ConstructorResourceInjectionBean(ITestBean testBean3) { throw new UnsupportedOperationException(); } @Autowired public ConstructorResourceInjectionBean(ITestBean testBean4, NestedTestBean nestedTestBean, ConfigurableListableBeanFactory beanFactory) { this.testBean4 = testBean4; this.nestedTestBean = nestedTestBean; this.beanFactory = beanFactory; } public ConstructorResourceInjectionBean(NestedTestBean nestedTestBean) { throw new UnsupportedOperationException(); } public ConstructorResourceInjectionBean(ITestBean testBean3, ITestBean testBean4, NestedTestBean nestedTestBean) { throw new UnsupportedOperationException(); } @Autowired public void setTestBean2(TestBean testBean2) { super.setTestBean2(testBean2); } public ITestBean getTestBean3() { return this.testBean3; } public ITestBean getTestBean4() { return this.testBean4; } public NestedTestBean getNestedTestBean() { return this.nestedTestBean; } public ConfigurableListableBeanFactory getBeanFactory() { return this.beanFactory; } } public static class ConstructorsResourceInjectionBean { protected ITestBean testBean3; private ITestBean testBean4; private NestedTestBean[] nestedTestBeans; public ConstructorsResourceInjectionBean() { } @Autowired(required = false) public ConstructorsResourceInjectionBean(ITestBean testBean3) { this.testBean3 = testBean3; } @Autowired(required = false) public ConstructorsResourceInjectionBean(ITestBean testBean4, NestedTestBean[] nestedTestBeans) { this.testBean4 = testBean4; this.nestedTestBeans = nestedTestBeans; } public ConstructorsResourceInjectionBean(NestedTestBean nestedTestBean) { throw new UnsupportedOperationException(); } public ConstructorsResourceInjectionBean(ITestBean testBean3, ITestBean testBean4, NestedTestBean nestedTestBean) { throw new UnsupportedOperationException(); } public ITestBean getTestBean3() { return this.testBean3; } public ITestBean getTestBean4() { return this.testBean4; } public NestedTestBean[] getNestedTestBeans() { return this.nestedTestBeans; } } public static class ConstructorsCollectionResourceInjectionBean { protected ITestBean testBean3; private ITestBean testBean4; private List<NestedTestBean> nestedTestBeans; public ConstructorsCollectionResourceInjectionBean() { } @Autowired(required = false) public ConstructorsCollectionResourceInjectionBean(ITestBean testBean3) { this.testBean3 = testBean3; } @Autowired(required = false) public ConstructorsCollectionResourceInjectionBean(ITestBean testBean4, List<NestedTestBean> nestedTestBeans) { this.testBean4 = testBean4; this.nestedTestBeans = nestedTestBeans; } public ConstructorsCollectionResourceInjectionBean(NestedTestBean nestedTestBean) { throw new UnsupportedOperationException(); } public ConstructorsCollectionResourceInjectionBean(ITestBean testBean3, ITestBean testBean4, NestedTestBean nestedTestBean) { throw new UnsupportedOperationException(); } public ITestBean getTestBean3() { return this.testBean3; } public ITestBean getTestBean4() { return this.testBean4; } public List<NestedTestBean> getNestedTestBeans() { return this.nestedTestBeans; } } public static class MapConstructorInjectionBean { private Map<String, TestBean> testBeanMap; @Autowired public MapConstructorInjectionBean(Map<String, TestBean> testBeanMap) { this.testBeanMap = testBeanMap; } public Map<String, TestBean> getTestBeanMap() { return this.testBeanMap; } } public static class MapFieldInjectionBean { @Autowired private Map<String, TestBean> testBeanMap; public Map<String, TestBean> getTestBeanMap() { return this.testBeanMap; } } public static class MapMethodInjectionBean { private TestBean testBean; private Map<String, TestBean> testBeanMap; @Autowired(required = false) public void setTestBeanMap(TestBean testBean, Map<String, TestBean> testBeanMap) { this.testBean = testBean; this.testBeanMap = testBeanMap; } public TestBean getTestBean() { return this.testBean; } public Map<String, TestBean> getTestBeanMap() { return this.testBeanMap; } } public static class ObjectFactoryInjectionBean implements Serializable { @Autowired private ObjectFactory<TestBean> testBeanFactory; public TestBean getTestBean() { return this.testBeanFactory.getObject(); } } public static class ObjectFactoryQualifierInjectionBean { @Autowired @Qualifier("testBean") private ObjectFactory<?> testBeanFactory; public TestBean getTestBean() { return (TestBean) this.testBeanFactory.getObject(); } } public static class CustomAnnotationRequiredFieldResourceInjectionBean { @MyAutowired(optional = false) private TestBean testBean; public TestBean getTestBean() { return this.testBean; } } public static class CustomAnnotationRequiredMethodResourceInjectionBean { private TestBean testBean; @MyAutowired(optional = false) public void setTestBean(TestBean testBean) { this.testBean = testBean; } public TestBean getTestBean() { return this.testBean; } } public static class CustomAnnotationOptionalFieldResourceInjectionBean extends ResourceInjectionBean { @MyAutowired(optional = true) private TestBean testBean3; public TestBean getTestBean3() { return this.testBean3; } } public static class CustomAnnotationOptionalMethodResourceInjectionBean extends ResourceInjectionBean { private TestBean testBean3; @MyAutowired(optional = true) protected void setTestBean3(TestBean testBean3) { this.testBean3 = testBean3; } public TestBean getTestBean3() { return this.testBean3; } } @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public static @interface MyAutowired { boolean optional() default false; } /** * Bean with a dependency on a {@link FactoryBean}. */ private static class FactoryBeanDependentBean { @Autowired private FactoryBean<?> factoryBean; public final FactoryBean<?> getFactoryBean() { return this.factoryBean; } } public static class StringFactoryBean implements FactoryBean<String> { public String getObject() throws Exception { return ""; } public Class<String> getObjectType() { return String.class; } public boolean isSingleton() { return true; } } public static class StringInjectionBean { @Autowired private String testBean; public String getTestBean() { return this.testBean; } } public static class UnknownFactoryBean<T> implements FactoryBean<T> { public T getObject() throws Exception { return null; } public Class<T> getObjectType() { return null; } public boolean isSingleton() { return true; } } public static class AutowiredWithUknownTypeBean { @Autowired private TestBean testBean; public TestBean getTestBean() { return this.testBean; } } public static class AutowiredEnvironmentBean { @Autowired private org.springframework.core.env.Environment env; } }