spring注解驱动(一)
@Configuration
作用于类上,指定当前类是一个配置类,相当于配置spring的容器(应用上下文)。
@Bean
作用域方法上,将方法的返回值作为bean对象放入spring容器中,如果没有指定bean的名称,默认是方法名。
@ComponentScan
配置启动时,要扫描的包路径。
可以配置过滤器表示过滤包的规则。
includeFilters:
指定扫描时,包含哪些扫描组件,如果没有禁用默认的扫描规则,除了当前注解中包含的外,还会扫描默认规则的所有组件。可以通过置useDefaultFilter=false
来禁用默认扫描规则,那么就只会扫描当前包含过滤的包路径下的包。
excludeFilters:
指定扫描时,按照什么规则排除不需要扫描的组件。
@Filter: 指定过滤的规则。
其中type属性包含5中类型的过滤规则,如下:
public enum FilterType {
ANNOTATION, //通过指定注解类型
ASSIGNABLE_TYPE, //通过指定类型
ASPECTJ, //通过使用aspectj表达式
REGEX, //通过正则表达式
CUSTOM; //自定义类型
private FilterType() {
}
}
自定义过滤规则:
通过实现TypeFilter接口,并重写match方法,方法返回true,表示匹配成功,false表示匹配失败。
public class MyTypeFilter implements TypeFilter {
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
//获取当前类注解的信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//获取当前正在扫描类类的信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
//获取当前类资源(类的路径)
Resource resource = metadataReader.getResource();
return false;
}
}
参数说明:
metadataReader:
读取到的当前正在扫描的类的信息
metadataReaderFactory:
可以获取到其他任何类的信息
@Scope
prototype: 多实例的,在容器启动时,不会创建对象放入容器,而是在获取对象时才调用方法创建对象。
singleton: 单实例的(默认值),在ioc容器启动时,会调用方法创建对象,放入容器中,以后需要使用对象时,直接冲容器中拿。
request: 同一个请求创建一个实例
session: 同一个session创建一个实例
@Lazy
对于但实例而言的,当容器启动时,就会创建对象,放入ioc容器,此注解可以使对象创建变为懒加载模式,容器创建时,并不会创建对象,而是在第一次获取对象时,才会创建
.
@Conditional
对满足条件的bean对象才放入ioc容器,不满足条件的不注册。
需要自己创建一个类实现Condition接口,来设置注册条件。
@FunctionalInterface
public interface Condition {
boolean matches(ConditionContext context, AnnotatedTypeMetadata var2);
}
结果返回true表示匹配成功,将被注册,返回false表示匹配失败,不满足注册条件。
参数:
context:
表示的是判断条件能使用的上下文(环境)
var2:
表示注释信息