1.容器
1.1 容器启动
AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext();
ioc.register(AppConfig.class);
ioc.refresh();
或者
AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext(AppConfig.class);
1.2 组件添加
@Configuration public class AppConfig { @Bean public Red red(){ return new Red("小红","漂亮"); } }
@Configuration | 声明这是一个配置类,就等同于之前的xml文件,可以在此类执行之前在xml中声明bean的操作 |
@Bean | 给容器注册一个Bean,类型为返回值类型,id默认是用方法名作为id |
@ComponentScan | 扫描指定的文件 |
@Filter | 过滤文件 |
@Configuration @ComponentScan(value="com.indi",includeFilters={@Filter(type=FilterType.ASSIGNABLE_TYPE, classes={Red.class,Orange.class})},useDefaultFilters=false) public class AppConfig { }
@ComponentScan 相关参数说明
value |
指定要扫描的包名 |
includeFilters |
指定要扫描的类型,可以自行写多个@Filter来自定义要扫描的类,注意,使用此属性要指定默认的扫描为false |
useDefaultFilters |
是否启动默认的扫描 |
excludeFilters | 指定不扫描哪些类,和includeFilters使用方法一致 |
说明:多个ComponentScan注解的话,可以用一个ComponentScans包裹
@Repeatable(ComponentScans.class),此注解说明,当前注解重复使用的话,可以使用该注解声明另外一个注解包裹当前的注解
@Filter 相关参数说明
type | FilterType.ANNOTATION | 根据注解筛选 |
FilterType.ASSIGNABLE_TYPE | 自己定义类 | |
FilterType.CUSTOM | 实现TypeFilter接口,根据返回值来筛选 | |
value |
@Component public class MyTypeFilter implements TypeFilter { //自己根据传递的参数来筛选 public boolean match(MetadataReader mr, MetadataReaderFactory mrf) throws IOException { ClassMetadata classMetadata = mr.getClassMetadata(); AnnotationMetadata annotationMetadata = mr.getAnnotationMetadata(); String className = classMetadata.getClassName(); return true; } }
@Scope | prototype | 多实例bean,ioc容器启动并不会去调用方法创建bean,而是每次使用才会创建 |
singleton | 单实例bean(默认值):ioc容器启动会调用方法创建bean放到ioc容器中,以后每次就直接从容器(map)中取 | |
request | 同一次请求创建一个实例 | |
session | 同一个session创建一个实例 |
@Scope("prototype") @Bean("red01") public Red red(){ return new Red("小红","好看"); }
@Lazy | 此注解只针对单实例bean,加上此注解,容器启动不创建对象,第一次获取bBean的时候创建对象,并初始化 |