目录
1.basePackages属性:用于设置可以扫描到的注解所在包的范围,也就是原本扫描标签的value值。
2.includeFilters属性:该属性是一个数组,用于拦截除指定bean以外的所有注解bean
3.excludeFilters属性:该属性是一个数组,用于拦截所有指定bean
@Configuration
设置该类为注解配置类,该类的作用为配置配置文件相关信息
@Bean
@Bean
public Person person(){
return new Person("张三");
}
作用在方法上,用于注册bean实例,类似原来的bean标签,使用@Bean注解后的方法用于注册bean实例,方法的返回值为原来的class属性,方法的名称为原来的id属性。如果想要重写设置id,可以将注解的返回值改成目标id。
@Bean(value = "person1")
public Person person(){
return new Person("张三");
}
@ComponentScan
用于配置扫描包的范围,
@ComponentScan(basePackages = {"com.ling"},includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Service.class)},useDefaultFilters = false)
@ComponentScan(basePackages = {"com.ling"},includeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = UserDao.class)},useDefaultFilters = false)
@ComponentScan(basePackages = {"com.ling"},excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)})
@ComponentScan(basePackages = {"com.ling"},excludeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,classes = ServiceFilter.class)})
1.basePackages属性:用于设置可以扫描到的注解所在包的范围,也就是原本扫描标签的value值。
2.includeFilters属性:该属性是一个数组,用于拦截除指定bean以外的所有注解bean
3.excludeFilters属性:该属性是一个数组,用于拦截所有指定bean
@Filter
该标签在ComponentScan内部使用,用于表示拦截的内容
1.type属性:用于设置拦截的方式:
FilterType.ANNOTATION:按照注解类型拦截
FilterType.ASSIGNABLE_TYPE:按照bean类型拦截
FilterType.CUSTOM:按照自定义拦截器拦截
2.classes属性:用于设置按照拦截方式所属的拦截类
3.当使用自定义拦截器拦截时,关于自定义拦截器的书写
实现TypeFilter接口,重写match方法,该方法在spring扫描包时每扫描到一个类就会进行一次调用。metadataReader参数中可以获取当前扫描类的大量信息,如果该方法返回true,即为选中当前类,返回false,即为不选中。
例如,当使用includeFilter扫描到了某个类,使得match方法正好匹配该类,返回了true,那么该类就会被选中,纳入includeFilter中,该对象就可以被加载到容器中。如果使用excludeFilter扫描到了某个类是的match方法正好匹配该类,返回了true,那么该类就会被选中,纳入excludeFilter中,该对象就不会被加载到容器中。
public class ServiceFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
AnnotationMetadata metadata = metadataReader.getAnnotationMetadata();
ClassMetadata classMetadata = metadataReader.getClassMetadata();
String className = classMetadata.getClassName();
if (className.equals("com.ling.service.impl.UserServiceImpl")){
return true;
}
return false;
}
}
@Import
用于直接导入某个类进容器
导入方式:
1.直接导入
@Import({Color.class})
2.通过ImportSelector实现类导入
@Import({MyImport.class})
public class MyImport implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.ling.pojo.Red","com.ling.pojo.Blue"};
}
}
实现方法selectImports的返回值,就是需要导入的类src下的路径数组。当注解导入ImportSelector实现类时,会调用该方法,将返回值所有类加载进容器,id都是类的路劲
FactoryBean工厂Bean
public class ColorFactoryBean implements FactoryBean<Color> {
@Override
public boolean isSingleton() {
return false;
}
@Override
public Color getObject() throws Exception {
return new Color();
}
@Override
public Class<?> getObjectType() {
return null;
}
}
该bean我们在spring基础的时候学习过了,所以看看他的注册方式的特殊点就可以
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}
注册方式与其他所有bean都一样,但是当返回该对象时,spring会调用他的getObject方法,放入方法的返回值对象,而不是工厂类对象。