• 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

  • 相关阅读:
    Html 表单表格 form table
    JavaWeb -- 服务器传递给Servlet的对象 -- ServletConfig, ServletContext,Request, Response
    JavaWeb -- Servlet运行过程 和 细节
    调用DLL中的过程和函数
    调用DLL中的过程和函数
    动态载入 DLL
    动态载入 DLL
    静态载入 DLL
    DLL的加载和调用
    静态载入 DLL
  • 原文地址:https://www.cnblogs.com/erdanyang/p/12539397.html
Copyright © 2020-2023  润新知