1. XML配置方式
1.1 简单Bean配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="tom" class="bean.Tom">
<property name="name" value="tom"/>
</bean>
</beans>
1.2 静态工厂
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="jack" class="bean.PersonStaticFactory" factory-method="getPerson">
<constructor-arg value="jack"/>
</bean>
</beans>
public class PersonStaticFactory {
public static Person getPerson(String name) {
if ("jack".equals(name)) {
return new Jack("jack");
}
return null;
}
}
1.3 实例工厂
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="personFactory" class="bean.PersonFactory"/>
<bean id="peter" factory-bean="personFactory" factory-method="getPerson">
<constructor-arg value="peter"/>
</bean>
</beans>
public class PersonFactory {
public Person getPerson(String name) {
if ("peter".equals(name)) {
return new Peter("peter");
}
return null;
}
}
1.4 @Controller @Service @Component @Repository
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="com.demo.*"/>
</beans>
测试
public class XmlBeanTest {
@Test
public void testXmlBean() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
for (String beanDefinitionName : applicationContext.getBeanDefinitionNames()) {
System.out.println(beanDefinitionName);
}
}
}
2. 注解(annotation)配置方式
2.1 @Bean
@Configuration
public class BeanConfig {
//默认方法名为Bean的ID
@Bean
public Tony tony() {
return new Tony("tony");
}
}
2.2 @Controller @Service @Component @Repository
@Configuration
@ComponentScan(value = "com.demo.*")
public class BeanConfig {
}
测试
public class AnnotationBeanTest {
@Test
public void testAnnotationBean() {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfig.class);
for (String beanDefinitionName : applicationContext.getBeanDefinitionNames()) {
System.out.println(beanDefinitionName);
}
}
}
3. 其它配置方式
3.1 @Import
@Configuration
@Import(Bob.class)
public class BeanConfig {
}
3.2 ImportSelector
@Configuration
@Import(MyImportSelector.class)
public class BeanConfig {
}
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"bean.Jay"};
}
}
3.3 ImportBeanDefinitionRegistrar
@Configuration
@Import(MyImportBeanDefinitionRegistrar.class)
public class BeanConfig {
}
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
rootBeanDefinition.setBeanClass(Allen.class);
registry.registerBeanDefinition("allen", rootBeanDefinition);
}
}
3.4 FactoryBean
@Component
public class DylanFactoryBean implements FactoryBean<Dylan> {
@Override
public Dylan getObject() throws Exception {
return new Dylan();
}
@Override
public Class<?> getObjectType() {
return Dylan.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
注意:此时容器注入的bean名字虽然是DylanFactoryBean,但是通过applicationContext.getBean(“dylanFactoryBean”)获取的对象却是Dylan,如果要获取factoryBean本身使用“&”前缀,如:applicationContext.getBean("&dylanFactoryBean")
3.5 BeanDefinitionRegistryPostProcessor
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry)
throws BeansException {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
rootBeanDefinition.setBeanClass(May.class);
beanDefinitionRegistry.registerBeanDefinition("may", rootBeanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory)
throws BeansException {
}
}
3.6 BeanPostProcessor
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (beanName.equals("car")) {
return new CarWapper((Car) bean);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
3.7 InstantiationAwareBeanPostProcessor
@Component
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if (beanName.equals("may")) {
return new MayProxy();
}
return null;
}
}