IOC
@componentScan
相当于xml配置文件中的
<context:component-scan base-package=""/>
可以重复使用
- value
指定要扫描的包名 - includeFilters(只扫描指定的组件)
@Configuration
@ComponentScan(value = "ganxie.xiaowen.spring_anno",useDefaultFilters = false,includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {
Controller.class})
})
public class MainConfig {
useDefaultFilters = false 不使用默认过滤规则,默认是true,会自动扫描指定包里的所有组件加入容器
- excludeFilters(不扫描指定的组件)
@Configuration
@ComponentScan(value = "ganxie.xiaowen.spring_anno",excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {
Controller.class})
})
public class MainConfig {
@Filter
- type(指定过滤使用哪种方式)
FilterType.ANNOTATION:按照注解
FilterType.ASSIGNABLE_TYPE:按照给定的类型
FilterType.ASPECTJ:使用aspectj表达式
FilterType.REGEX:使用正则表达式
FilterType.CUSTOM:自定义 - classes
指定要过滤的内容,数组形式
自定义filter示例
自定义filter需要实现TypeFilter接口,并重写match方法
public class MyTypeFilter implements TypeFilter {
/**
*
* @param metadataReader 正在扫描类的信息
* @param metadataReaderFactory 可以获取到其他任何类的信息
* @return 返回true就将当前被扫描的类加入到容器中,如果返回false就不加入容器
* @throws IOException
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
//获取当前被扫描类注解的信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
//获取当前被扫描类的类信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
//获取当前被扫描类的资源信息
Resource resource = metadataReader.getResource();
String className = classMetadata.getClassName();
System.out.println("扫描----->"+className);
if (className.contains("er")){
return true;
}
return false;
}
}
在主配置类中指定自定义的过滤器
@Configuration
@ComponentScan(value = "ganxie.xiaowen.spring_anno",includeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM,classes = {
MyTypeFilter.class})
},useDefaultFilters = false)
public class MainConfig {
@conditional
自定义condition需要实现condition接口并实现matches方法,下边是根据操作系统作为条件的判断用例
//判断当前操作系统是否为linux,如果是返回true
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
String property = environment.getProperty("os.name");
if (property.contains("linux")) {
return true;
}
return false;
}
}
//判断当前操作系统是否为windows,如果是返回true
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//获取到ioc使用的beanFactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
//获取类加载器
ClassLoader classLoader = context.getClassLoader();
//获取当前环境信息
Environment environment = context.getEnvironment();
//获取到bean定义的注册类
BeanDefinitionRegistry registry = context.getRegistry();
String property = environment.getProperty("os.name");
if (property.contains("Windows")) {
return true;
}
return false;
}
}
@Configuration
public class MainConfig2 {
@Conditional({
WindowsCondition.class})
@Bean
public User windows(){
return new User("windows","1234");
}
@Conditional({
LinuxCondition.class})
@Bean
public User linux(){
return new User("linux","1234");
}
修改虚拟机运行时参数的步骤
根据容器中是否含有指定bean作为指定条件
public class BeanCondition implements Condition {
@Override
public