spring容器注册组件

通过使用注解方式向spring容器中添加组件是十分简单的,大体有如下方式:

  1. 在config类中通过添加@Bean来添加注解
  2. 通过扫描添加组件
  3. 使用@Import添加一个外部组件
  4. 使用@ImportSelector添加一个组件
  5. 使用ImportBeanDefinitionRegistrar添加一个组件
  6. 使用FactoryBean注册组件

在config类中通过添加@Bean来添加注解

使用方式如下:

@Configuration
public class MyConfig {
	@Bean
	public Target target(){
		return new Target();
	}
}

通过扫描添加组件

使用@ComponentScan+组件注解@Controller/@Service/@Repository/@Component扫描添加组件使用方式如下:

@ComponentScan("org.springframework.demo")
@Configuration
public class MyConfig {
}

另外,通过扫描方式添加组件的方式可以通过一些注解来配置组件:

  1. @TypeFilter指定过滤规则
  2. @Scope设置组件作用域
  3. @Lazy设置是否懒加载
  4. @Conditional按照条件注册bean

使用@Import添加一个外部组件

使用方式如下:

@Configuration
@Import(value = {Example1.class})
public class MyConfig {
}

使用@ImportSelector添加一个组件

使用方式如下:

@Configuration
@Import(value = {MyImportSelector.class})
public class MyConfig {
}

使用FactoryBean注册组件

使用方式如下:

@Configuration
@Import(value = {MyBeanDefinitionRegister.class})
public class MyConfig {
}

public class MyBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Example1.class);
		registry.registerBeanDefinition("Dog",rootBeanDefinition);
	}
}

使用FactoryBean注册组件

使用方式如下:

// 创建一个FactoryBean的实现类
public class ExampleFactoryBean implements FactoryBean<Example3> {
	// 返回一个Example3对象,这个对象会被添加到spring容器中
	@Override
	public Example3 getObject() throws Exception {
		return new Example3();
	}

	@Override
	public Class<?> getObjectType() {
		return Example3.class;
	}

	// 如果是单例,则返回true,否则返回false
	@Override
	public boolean isSingleton() {
		return true;
	}
}

@Configuration
public class MyConfig {
	// 将这个FactoryBean的实现类添加到spring容器中
	@Bean
	public ExampleFactoryBean exampleFactoryBean(){
		return new ExampleFactoryBean();
	}
}

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
ExampleFactoryBean bean = applicationContext.getBean(ExampleFactoryBean.class);
try {
	// getObject()返回Example3 bean
	System.out.println(bean.getObject());
} catch (Exception e) {
	e.printStackTrace();
}