zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    某个牛人做WINDOWS系统文件详解
    常用ASP脚本程序集锦
    LINUX基础:文件安全与权限
    proftpd+mysql+quota
    apache2.0.49tomcat5.0.19jk2建立virtualHost
    URL Redirection(转) Anny
    顶级域名后缀列表(转) Anny
    \u4E00\u9FA5意义 Anny
    How to POST Form Data Using Ruby(转) Anny
    How to get rid of 'Enter password to unlock your login keyring' in Ubuntu(转) Anny
  • 原文地址:https://www.cnblogs.com/erdanyang/p/12539397.html
Copyright © 2011-2022 走看看