/*
* Copyright 2002-2010 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.context.annotation.configuration;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.junit.Test;
import test.beans.Colour;
import test.beans.TestBean;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.io.ClassPathResource;
/**
* System tests covering use of {@link Autowired} and {@link Value} within
* {@link Configuration} classes.
*
* @author Chris Beams
* @author Juergen Hoeller
*/
public class AutowiredConfigurationTests {
@Test
public void testAutowiredConfigurationDependencies() {
ClassPathXmlApplicationContext factory = new ClassPathXmlApplicationContext(
AutowiredConfigurationTests.class.getSimpleName() + ".xml", AutowiredConfigurationTests.class);
assertThat(factory.getBean("colour", Colour.class), equalTo(Colour.RED));
assertThat(factory.getBean("testBean", TestBean.class).getName(), equalTo(Colour.RED.toString()));
}
@Configuration
static class AutowiredConfig {
@Autowired
private Colour colour;
@Bean
public TestBean testBean() {
return new TestBean(colour.toString());
}
}
@Configuration
static class ColorConfig {
@Bean
public Colour colour() {
return Colour.RED;
}
}
/**
* {@link Autowired} constructors are not supported on {@link Configuration} classes
* due to CGLIB constraints
*/
@Test(expected=BeanCreationException.class)
public void testAutowiredConfigurationConstructorsAreNotSupported() {
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("annotation-config.xml", AutowiredConstructorConfig.class));
GenericApplicationContext ctx = new GenericApplicationContext(factory);
ctx.registerBeanDefinition("config1", new RootBeanDefinition(AutowiredConstructorConfig.class));
ctx.registerBeanDefinition("config2", new RootBeanDefinition(ColorConfig.class));
ctx.refresh(); // should throw
}
@Configuration
static class AutowiredConstructorConfig {
Colour colour;
@Autowired
AutowiredConstructorConfig(Colour colour) {
this.colour = colour;
}
}
@Test
public void testValueInjection() {
ClassPathXmlApplicationContext factory = new ClassPathXmlApplicationContext(
"ValueInjectionTests.xml", AutowiredConfigurationTests.class);
System.clearProperty("myProp");
TestBean testBean = factory.getBean("testBean", TestBean.class);
assertNull(testBean.getName());
testBean = factory.getBean("testBean2", TestBean.class);
assertNull(testBean.getName());
System.setProperty("myProp", "foo");
testBean = factory.getBean("testBean", TestBean.class);
assertThat(testBean.getName(), equalTo("foo"));
testBean = factory.getBean("testBean2", TestBean.class);
assertThat(testBean.getName(), equalTo("foo"));
System.clearProperty("myProp");
testBean = factory.getBean("testBean", TestBean.class);
assertNull(testBean.getName());
testBean = factory.getBean("testBean2", TestBean.class);
assertNull(testBean.getName());
}
@Configuration
static class ValueConfig {
@Value("#{systemProperties[myProp]}")
private String name;
private String name2;
@Value("#{systemProperties[myProp]}")
public void setName2(String name) {
this.name2 = name;
}
@Bean @Scope("prototype")
public TestBean testBean() {
return new TestBean(name);
}
@Bean @Scope("prototype")
public TestBean testBean2() {
return new TestBean(name2);
}
}
@Test
public void testCustomProperties() {
ClassPathXmlApplicationContext factory = new ClassPathXmlApplicationContext(
"AutowiredConfigurationTests-custom.xml", AutowiredConfigurationTests.class);
TestBean testBean = factory.getBean("testBean", TestBean.class);
assertThat(testBean.getName(), equalTo("localhost"));
}
@Configuration
static class PropertiesConfig {
private String hostname;
@Value("#{myProps.hostname}")
public void setHostname(String hostname) {
this.hostname = hostname;
}
@Bean
public TestBean testBean() {
return new TestBean(hostname);
}
}
}