1、@ComponentScan + 组件注解
默认是加载Application类所在同一个目录下的所有类,如果在别的包下才需要@ComponentScan扫描包
组件注解
注解 |
描述 |
@Component |
组件定义不清晰时候的注解 |
@Controller |
控制器层 |
@Service |
服务层 |
@Repository |
数据层 |
2、@Configuration + @Bean
@Configuration
public class TestConfig {
@Bean
public User user() {
return new User();
}
}
3、@Import(【PlaceHolderClass】)快速导入一个组件
PlaceHolderClass |
描述 |
一般Class |
直接注入 |
实现了ImportSelector接口的Class |
根据返回类的全限定名数组注入 |
实现了ImportBeanDefinitionRegistrar接口的Class |
获取类描述信息,选择性手动注入 |
@Configuration
@Import({ImportDemo.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class ImportConfig{
@Bean
public User user(){
return new User();
}
}
//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector {
//返回值是导入到容器中的组件全限定名数组
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//当前类的所有注解
Set<String> annotationTypes = importingClassMetadata.getAnnotationTypes();
System.out.println("当前配置类的注解信息:"+annotationTypes);
return new String[]{"com.paopaoedu.springboot.bean.user01","com.paopaoedu.springboot.bean.user02"};
}
}
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* AnnotationMetadata:当前类的注解信息
* BeanDefinitionRegistry:BeanDefinition注册类;
* 把所有需要添加到容器中的bean;调用
* BeanDefinitionRegistry.registerBeanDefinition手工注册进来
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean definition = registry.containsBeanDefinition("com.paopaoedu.springboot.bean.User01");
boolean definition2 = registry.containsBeanDefinition("com.paopaoedu.springboot.bean.User02");
if(definition && definition2){
//创建一个类的BeanDefinition(Bean的描述信息对象)
RootBeanDefinition beanDefinition = new RootBeanDefinition(User03.class);
//注册一个Bean,指定bean名
registry.registerBeanDefinition("User03", beanDefinition);
}
}
}
4、使用Spring提供的FactoryBean注入
public class UserFactoryBean implements FactoryBean<User> {
// 注入的Bean
@Override
public User getObject() throws Exception {
return new User();
}
// 注入的Bean类型
@Override
public Class<?> getObjectType() {
return User.class;
}
// 是否是单例
@Override
public boolean isSingleton() {
return true;
}
}
网友评论