Spring的源码解析

简称:

ACAC->AnnotationConfigApplicationContext

ENV->StandardEnvironment

DLBF->DefaultListableBeanFactory

一、重要的类

  1、AnnotationConfigApplicationContext

      1.1 reader=new AnnotatedBeanDefinitionReader(ACAC);

          1.1.1 registry=ACAC

          1.1.2 conditionEvaluator=new ConditionEvaluator(ACAC, ENV, null);

              1.1.2.1 context=new ConditionContextImpl(ACAC, ENV, null);
                1.1.2.1.1 registry=ACAC
                1.1.2.1.2 beanFactory=DLBF
                1.1.2.1.3 environment=ENV
                1.1.2.1.4 resourceLoader=ACAC
                1.1.2.1.5 classLoader=AppClassLoader

          1.1.3 注册BeanDefination(这个是方法)

            org.springframework.context.annotation.internalConfigurationAnnotationProcessor=ConfigurationClassPostProcessor.class

            org.springframework.context.annotation.internalAutowiredAnnotationProcessor=AutowiredAnnotationBeanPostProcessor.class

            org.springframework.context.annotation.internalCommonAnnotationProcessor=CommonAnnotationBeanPostProcessor.class

            org.springframework.context.event.internalEventListenerProcessor=EventListenerMethodProcessor.class

            org.springframework.context.event.internalEventListenerFactory=DefaultEventListenerFactory.class

          1.1.4 scopeMetadataResolver=new AnnotationScopeMetadataResolver();

          1.1.5 beanNameGenerator=new AnnotationBeanNameGenerator();

      1.2 scanner=new ClassPathBeanDefinitionScanner(ACAC);

          1.2.1 registry=ACAC

          1.2.2 includeFilters(这个默认包含@component注解,jsr-250的注解,jsr-330的注解)

          1.2.3 environment=ENV

          1.2.4 resourcePatternResolver=ACAC

          1.2.5 metadataReaderFactory=new CachingMetadataReaderFactory(ACAC);

              1.2.5.1 resourceLoader=ACAC
              1.2.5.2 metadataReaderCache=ACAC.resourceCaches.get(MetadataReader.class)

          1.2.6 componentsIndex=null(和这个路径有关META-INF/spring.components)

      1.3 beanFactory=new DefaultListableBeanFactory();

      1.4 environment=new StandardEnvironment();

      1.5 resourceCaches

      1.6 classLoader=AppClassLoader

  2、DefaultListableBeanFactory

      2.1 dependencyComparator=new AnnotationAwareOrderComparator();

      2.2 autowireCandidateResolver=new ContextAnnotationAutowireCandidateResolver();

      2.3 beanDefinitionMap

      2.4 beanDefinitionNames

      2.5 beanClassLoader=AppClassLoader

      2.6 beanExpressionResolver=new StandardBeanExpressionResolver(AppClassLoader)

      2.7 propertyEditorRegistrars=add(new ResourceEditorRegistrar(ACAC,ENV))

      2.8 beanPostProcessors=add()

          new ApplicationContextAwareProcessor(ACAC)

          new ApplicationListenerDetector(ACAC)

      2.9 ignoredDependencyInterfaces=add()

          BeanNameAware.class,BeanFactoryAware.class,BeanClassLoaderAware.class(初始化时候加的3个)

          EnvironmentAware.class,EmbeddedValueResolverAware.class,ResourceLoaderAware.class,ApplicationEventPublisherAware.class,MessageSourceAware.class,ApplicationContextAware.class(后来prepareBeanFactory时候加的6个)

      2.10 resolvableDependencies=put()

          (BeanFactory.class, DLBF),(ResourceLoader.class, ACAC),(ApplicationEventPublisher.class, ACAC),(ApplicationContext.class, ACAC)

      2.11 singletonObjects

          (environment,ENV)

          (systemProperties,System.getProperties())

          (systemEnvironment,System.getenv())

      2.12 singletonFactories

      2.13 earlySingletonObjects

      2.14 registeredSingletons

      2.15 manualSingletonNames

  3、ConfigurationClassPostProcessor

public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor

二、注意的点

  1、相同beanId的bean,后面加载的bean会把前面加载的bean覆盖掉

三、AOP

  1、AnnotationAwareAspectJAutoProxyCreator(要注意的是它实现的BeanPostProcessor和BeanFactoryAware的接口)

  2、AOP的切点表达式  

      execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)

      ret-type-pattern、name-pattern、param-pattern这三个是必须的,其他的都是可选的。

      ret-type-pattern:*匹配任意任意的返回值类型

      name-pattern:可以用*型号代表方法名的全部或者部分

      全限定名和方法名称之间用 .来连接

      param-pattern:()代表没有参数;(..)代表任意个数测参数;(*)代表只有一个参数,但是类型随意;(*,String)代表有两个参数,第一个参数类型随意,第二个参数必须为String类型

  3、表达式举例

      execution(public * *(..))

      execution(* set*(..))

      execution(* com.xyz.service.AccountService.*(..))当前类下面的所有方法

      execution(* com.xyz.service.*.*(..))当前包下面的所有方法

      execution(* com.xyz.service..*.*(..))当前包和其子包下面的所有方法

      within(com.xyz.service.*)当前包下面的所有方法

      within(com.xyz.service..*)当前包和其子包下面的所有方法

      this(com.xyz.service.AccountService)this作用的对象是代理对象,代理对象实现了指定的接口(spring生成对象的两种方式,一种是jdk动态代理,一种是cglib动态代理)

      target(com.xyz.service.AccountService)所有实现了com.xyz.service.AccountService接口的方法

      args(java.io.Serializable)所有只有一个参数,而且这个参数可序列化的所有的方法

      @annotation(org.springframework.transaction.annotation.Transactional)方法上加了指定的注解

      @within(org.springframework.transaction.annotation.Transactional)类上面加了指定的注解

      @target(org.springframework.transaction.annotation.Transactional)

      @args(com.xyz.security.Classified)运行时参数上加了指定的注解

      bean(tradeService)

      bean(*Service)

  4、注意的点

      ProceedingJoinPoint和JoinPoint的区别

      this与target的不同

      @target与@within的不同

  5、AOP的advice是怎么排序的

      这个类很重要AspectJPrecedenceComparator

四、spring声明式事务

  1、@EnableTransactionManagement使能事务功能(这个注解了本身注册了包含AOP功能的InfrastructureAdvisorAutoProxyCreator.class)

     1.1注册了含有AOP功能的InfrastructureAdvisorAutoProxyCreator.class

        但如果开启@EnableAspectJAutoProxy功能的话(AnnotationAwareAspectJAutoProxyCreator.class会替换掉InfrastructureAdvisorAutoProxyCreator.class)

     1.2注册了事务管理配置器ProxyTransactionManagementConfiguration

     1.3注册了切面类org.springframework.transaction.config.internalTransactionAdvisor

     1.4注册了事务注解属性解析类transactionAttributeSource,会注入到切面类当中,也会注入到事务拦截器类当中

     1.5注册了事务拦截器类transactionInterceptor,会注入到切面类当中

     1.6注册了事务事件工厂类org.springframework.transaction.config.internalTransactionalEventListenerFactory

  2、在使用事务时需要自己实现的类

     2.1事务管理器类

     2.2dataSource类这个要注入到事务管理器类当中

      

 

参考文献

    Aspectj表达式语法:https://my.oschina.net/u/3434392/blog/1625493

posted @ 2020-03-21 14:59  海平面下的我们  阅读(217)  评论(0编辑  收藏  举报