Spring常见类解析

Spring常见类解析,第1张

Spring常见类解析 BeanDefinition 描述了什么

BeanDefinition 表示Bean的定义文件,用于描述了Bean的一些属性。比如描述,描述Bean的class类型,作用域scope、lazyInit bean是否懒加载,initMethodName 表示Bean初始化执行的方发,destoryMethod bean销毁时执行的方法等

Spring中定义bean的方式

1、

2、@Bean

3、@Compent(@Controller、@Service、@Repository)

上述称之为神明式定义Bean,除了上述说明的定义方式之外,还有通过代码编程声明一个bean

public class BeanDefinitionDemo {
  public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
            new AnnotationConfigApplicationContext(AppConfig.class);
    AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
    beanDefinition.setBeanClass(TrainingClass.class);
    context.registerBeanDefinition("trainingClass",beanDefinition);
    System.out.println(context.getBean("trainingClass"));
  }
}

BeanDefinition 还有很多其他的方法,可以设置一个bean的其他属性

 

BeanDefinitionReader

 

AnnotatedBeanDefinitionReader

可以将某个类直接转为beanDefinition,并且解析类上的注解,比如@Scope、@Conditional、@Lazy、@Primary、@DependsOn等

AnnotationConfigApplicationContext context =
      new AnnotationConfigApplicationContext(AppConfig.class);
AnnotatedBeanDefinitionReader beanDefinitionReader = new AnnotatedBeanDefinitionReader(context);
beanDefinitionReader.register(TrainingClass.class);

XmlBeanDefinitionReader

AnnotationConfigApplicationContext context =
      new AnnotationConfigApplicationContext(AppConfig.class);
XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(context);
xmlBeanDefinitionReader.loadBeanDefinitions("application.xml");
System.out.println(context.getBean("trainingClass"));

classPathBeanDefinitionScanner

这个不是一个beanDefinition,但是它和beanDefinitionReader类型,不同的是,他可以对传入的一个包路径,将包路径下符合条件(比如是否被@Compent注解)的类,都给封装成一个beanDefinition。

AnnotationConfigApplicationContext context =
      new AnnotationConfigApplicationContext(AppConfig.class);
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
scanner.scan("com.huhui.study.springstudydeml.definition");
System.out.println(context.getBean("trainingClass"));
BeanFactory

Beanactory 表示bean的工厂,BeanFactory负责Bean的创建,并且提供api给使用者获取bean对象。

其中ApplicationContext也是Beanfactory的继承者,其中在Spring中有一个beanFactory功能强大,即是一个beanFactory,又是一个BeanDefinition,这个类就是DefaultListableBeanFactory。

DefaultListableBeanFsactory

 

ApplicationContext

上面有分析到,ApplicationContext是个接口,实际上也是一个BeanFactory,不过比BeanFactory 更加强大,比如:

  1. HierarchicalBeanFactory:拥有获取父BeanFactory的功能

  2. ListableBeanFactory:拥有获取beanNames的功能

  3. ResourcePatternResolver:资源加载器,可以一次性获取多个资源(文件资源等等)

  4. EnvironmentCapable:可以获取运行时环境(没有设置运行时环境功能)

  5. ApplicationEventPublisher:拥有广播事件的功能(没有添加事件监听器的功能)

  6. MessageSource:拥有国际化功能

AnnotationConfigApplicationContext

 

ClassPathXmlApplicationContext

 

BeanPostProcess

Bean的后置处理器,用于处理在bean的初始化前和初始化后进行一些功能处理。从而干预Bean

@Component
public class HuhuiBeanPostProcess implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if(beanName.equals("trainingClass")){
            System.out.println("-- trainingClass before init--");
        }
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }
​
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if(beanName.equals("trainingClass")){
            System.out.println("-- trainingClass after init--");
        }
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}

BeanFactoryPostProcessor

bean工厂的后置处理器。干预beanFactory的生成

package com.huhui.study.springstudydeml.definition;
​
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
​

@Component
public class HuHuiBeanFactoryBeanPostProcess implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("加工处理bean工厂");
    }
}

FactoryBean

通过BeanPostprocess的后置处理器,能够干预bean的生成,在bean的初始化过程,干预bean。为了能够完全使用我们自己提供的bean,Spring提供了Bean的后置处理器,例如下面的:

package com.huhui.study.springstudydeml.definition;
​
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
​

@Component
public class HuHuiFactoryBean implements FactoryBean {
    @Override
    public Object getObject() {
        return new SpecialUser();
    }
​
    @Override
    public Class getObjectType() {
        return SpecialUser.class;
    }
}

使用

AnnotationConfigApplicationContext context =
      new AnnotationConfigApplicationContext(AppConfig.class);
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
scanner.scan("com.huhui.study.springstudydeml.definition");
System.out.println(context.getBean("&huHuiFactoryBean"));
ExcludeFilter和IncludeFilter

includeFilter:表示包含哪些类需要被加载,即使这个类没有加@Compent注解

package com.huhui.study.springstudydeml.definition;
​
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
​

@Configuration
@ComponentScan(value = "com.huhui.study.springstudydeml.definition",
        includeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes =  SpecialUser.class)})
public class AppConfig {
​
}
​

excludeFilter:排查那些类不需要被Spring加载

package com.huhui.study.springstudydeml.definition;
​
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
​

@Configuration
@ComponentScan(value = "com.huhui.study.springstudydeml.definition",
        excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes =  SpecialUser.class)})
public class AppConfig {
​
}

FilterType  源码 

public enum FilterType {
​
   
   ANNOTATION,
​
   
   ASSIGNABLE_TYPE,
​
   
   ASPECTJ,
​
   
   REGEX,
​
   
   CUSTOM
​
}
 

自定义过滤使用

HuhuiTypeFilter.class

package com.huhui.study.springstudydeml.definition;
​
import org.springframework.core.annotation.MergedAnnotation;
import org.springframework.core.annotation.MergedAnnotations;
import org.springframework.core.type.Annotationmetadata;
import org.springframework.core.type.classreading.metadataReader;
import org.springframework.core.type.classreading.metadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;
import org.springframework.stereotype.Controller;
​

public class HuhuiTypeFilter implements TypeFilter {
    @Override
    public boolean match(metadataReader metadataReader, metadataReaderFactory metadataReaderFactory) {
        Annotationmetadata annotationmetadata = metadataReader.getAnnotationmetadata();
        MergedAnnotations annotations = annotationmetadata.getAnnotations();
        MergedAnnotation controllerMergedAnnotation = annotations.get(Controller.class);
        if(controllerMergedAnnotation != null){
            return true;
        }
        return false;
    }
}

AppConfig.class

@Configuration
@ComponentScan(value = "com.huhui.study.springstudydeml.definition",useDefaultFilters = false,
        excludeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,classes =  HuhuiTypeFilter.class)})
public class AppConfig {
​
}
metadataReader、Classmetadata、 Annotationmetadata

这些是类的元数据相关的,其中metadataReader是类元数据的读取器,他的实现有SimplemetadataReader。

在Spring中通过ASM技术获取类的元数据信息。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4692598.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-07
下一篇 2022-11-07

发表评论

登录后才能评论

评论列表(0条)

保存