文章字数:590,阅读全文大约需要2分钟
配置注解
@Configuration
注解相当于将当前类当作一个bean
注入的组件@Bean
将当前方法的返回值注入成为组件,bean
的id
是方法名@ComponentScan(value="com.xx.xx")
扫描并注入的文件/文件包位置AnnotationConfigApplicationContext(xxx.class)
把指定的class
当作配置文件加载一个上下文。指定扫描的包中标记有
@Controller
注解的类注入1
2
3"com.xx.xx", includeFilters={ (value=
.class}) (type=FilterType.ANNOTATION, classes={Controller
}, useDefaultFilter=false)使用
excludeFilters
即为排除useDefaultFilter
即是否使用默认的扫描@Filter(type=FilterType.ASSIGNABLE_TYPE), classes={xx.class}
指定注入的类自定义扫描器
@Filter(type=FilterType.CUSTOM, classes={MyFilter .class}
1 | public class MyFilter implements TypeFilter{ |
单实例和多实例
- 单实例在容器初始化时就创建(
@Bean
创建默认是单实例),可以使用@Lazy
强制懒加载,第一次使用再创建。 - 多实例用时创建(
@Scope("prototype")
注解)
注入判断
1 | public class MyCondition implements Condition{ |
注入时使用判断过滤器
1 | .class) (MyCondition |
import注册Bean
注入的几种方式
@Bean
一般用于导入第三方的组件- 包扫描+类上的标注注解
@Import
能够快速给容器导入组件Factorybean
接口实现
import注册Bean的几种方式
1 | // 注册类上直接注册,id是全类名 |
ImportSelector
是一个接口,返回需要导入容器的全类名和数组1
2
3
4
5
6public class MySelect implements ImportSelector{
public String[] selectImports(AnnotationMetadata annotationMetadata) {
// 返回类的全类名
return new String[]{"com.xx.yy", "com.xx.zz"};
}
}
1 | // 使用选择器注入 |
ImportBeanDefinitionRegistrar
接口,满足条件注入Bean
1 | /**AnnotationMetadata 当前类注解信息 |
1 | // 使用ImportBeanDefinitionRegistrar注入 |
FactoryBean接口注入
1 | public MyFactoryBean implements FactoryBean<MyClass>{ |
1 | // 注入FactoryBean即为注入MyFactoryBean所包含的Class |
spring容器
beanDefinitionMap
里面就是Spring
的容器