Spring学习笔记(一):配置类、组件扫描和懒加载
Configuration注解配置类
使用@Configuration来注解配置类,可以替代beans.xml配置文件
//配置类==配置文件
@Configuration
public class MainConfig {
//向IoC容器中注册一个bean,类型为返回值的类型
@Bean
public Person person() {
return new Person("john", 20);
}
}
根据配置获取IoC容器
public class ConfigTest {
public static main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(MainConfig.class);
//person()方法名默认为bean的Id
//如何修改bean的id:
//1.修改被@bean注解的方法名
//2.@Bean("需要设置的bean的Id")
String[] namesOfBean = ac.getBeanNameForType(Person.class);
for (String name : namesOfBean) {
System.out.println(name);
}
}
}
结果打印:person
ComponentScan扫描规则
使用@ComponentScan来注解配置类,用来指定需要扫描的包
@Configuration
//若使用根据类型来
@ComponentScan(value="com.got.test",
includeFilters={@Filter(type=FilterType.ANNOTATION,calsses={Controller.class}),
useDefaultFilters=false)
public class Confing {
@Bean
public Person person() {
return new Person("John, 20");
}
}
如果需要手工设置需要包含和排除的类,可以在@ComponentScan中添加属性,同时设置useDefaultFilters为false。
@ComponentScan:
- value:指定要扫描的包
- excludeFilters = Filter[] 指定按怎样的规则排除组件
- includeFilters = Filter[] 指定按怎样的规则包含组件
- useDefaultFilters: 默认为true,扫描所有组件;指定包含排除规则时需要设置为false
- 相关扫描规则:
- FilterType.ANNOTATION:按照注解
- FilterType.ASSIGNABLE_TYPE: 按照给定类型(类名.class)
- FilterType.ASPECTJ:使用ASPECTJ表达式
- FilterType.REGEX:使用正则匹配
- FilterType.CUSTOM:使用自定义规则,自行定义
Scope扫描规则
@Scope注解规定了bean的作用域
- prototype: 多实例,容器启动时不会创建实例,每次获取对象时才调用方法创建实例
- singleton:单实例(默认),容器启动时创建实例并放入容器中
- request:针对web应用,作用于为一次请求
- session:同一session使用同一实例
@Scope("prototype")
@Bean
public Person person() {
return new Person("John", 20);
}
Lazy懒加载
主要针对单实例的bean,单实例的bean默认在容器启动时创建对象,在加上@lazy注解后容器启动时不创建对象,仅当第一次使用(获取)bean时才创建初始化bean实例
@Lazy
@Bean
public Person person() {
System.out.println("add bean person to IoC Container,");
retrun new Person("John", 20);
}