简称:
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