Skip to content

Commit ea3e1c5

Browse files
committed
Update Java Notes
1 parent 98dc358 commit ea3e1c5

File tree

2 files changed

+1004
-70
lines changed

2 files changed

+1004
-70
lines changed

Frame.md

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7886,17 +7886,19 @@ public void addAccount{}
78867886
78877887
原因:Spring的默认的事务规则是遇到运行异常(RuntimeException)和程序错误(Error)才会回滚。想针对非检测异常进行事务回滚,可以在@Transactional 注解里使用rollbackFor 属性明确指定异常
78887888
7889-
* 情况5:Spring的事务传播策略在内部方法调用时将不起作用,事务注解加到要调用方法上
7889+
* 情况5:Spring的事务传播策略在**内部方法**调用时将不起作用,事务注解加到要调用方法上
78907890
7891+
原因:Spring的事务都是使用AOP代理的模式,仅有外部方法调用过程才会被代理截获,事务才会有效,就是方法调用本对象的另一个方法,没有通过代理类,事务也就无法生效
7892+
78917893
```java
78927894
@Transactional
78937895
public int add(){
78947896
update();
78957897
}
78967898
//注解添加在update方法上无效,需要添加到add()方法上
7897-
public int update(){}
7899+
public int update(){}
78987900
```
7899-
7901+
79007902
79017903
79027904
@@ -8630,11 +8632,12 @@ AnnotationAwareAspectJAutoProxyCreator是这种类型的后置处理器:Instan
86308632
* `if()`:判断每一个增强器是否是 AspectJPointcutAdvisor 类型的,返回true,否则继续执行
86318633
* `return super.shouldSkip(beanClass, beanName)`:永远返回false
86328634
* `getCustomTargetSource(beanClass, beanName)`:返回为空,doCreateBean()
8633-
8635+
8636+
8637+
86348638
8635-
86368639
**进入applyBeanPostProcessorsAfterInitialization:后置处理器创建AOP**
8637-
8640+
86388641
```java
86398642
//如果Bean被子类标识为要代理的bean,则使用配置的拦截器创建代理
86408643
public Object postProcessAfterInitialization(@Nullable Object bean,String bN){
@@ -8648,32 +8651,32 @@ AnnotationAwareAspectJAutoProxyCreator是这种类型的后置处理器:Instan
86488651
}
86498652
return bean;
86508653
}
8651-
```
8652-
8654+
```
8655+
86538656
创建动态代理:`wrapIfNecessary()`调用`createProxy()`(wrap包装)
8654-
8657+
86558658
注释:Create proxy if we have advice
8656-
8659+
86578660
* `getAdvicesAndAdvisorsForBean()`:获取当前bean的所有增强器 (通知方法),**为空就直接返回**
8658-
8661+
86598662
* findEligibleAdvisors():找到哪些通知方法是需要切入当前bean方法的
86608663
* AopUtils.findAdvisorsThatCanApply():获取到能在bean使用的增强器
86618664
* sortAdvisors(eligibleAdvisors):给增强器排序
8662-
8665+
86638666
* `this.advisedBeans.put(cacheKey, Boolean.TRUE)`:保存当前bean在advisedBeans中
8664-
8667+
86658668
* `Object proxy = createProxy(...)`:如果增强器不为空就创建代理,创建当前bean的代理对象
8666-
8669+
86678670
* buildAdvisors(beanName, specificInterceptors):获取所有增强器(通知方法)
8668-
8671+
86698672
* 保存到proxyFactory
8670-
8673+
86718674
* `return proxyFactory.getProxy(getProxyClassLoader())`:返回代理对象
8672-
8675+
86738676
* ProxyFactory类:`return createAopProxy().getProxy(classLoader)`
8674-
8677+
86758678
DefaultAopProxyFactory类:给容器中返回当前组件使用增强了的代理对象
8676-
8679+
86778680
```java
86788681
@Override
86798682
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
@@ -8689,8 +8692,8 @@ AnnotationAwareAspectJAutoProxyCreator是这种类型的后置处理器:Instan
86898692
return new JdkDynamicAopProxy(config);
86908693
}
86918694
}
8692-
```
8693-
8695+
```
8696+
86948697
4. 给容器中返回使用cglib增强了的代理对象,**初始化完成,加入容器**
86958698
86968699
5. 以后容器中获取到的就是这个组件的代理对象,执行目标方法的时候,代理对象就会执行通知方法的流程
@@ -10543,7 +10546,7 @@ public void afterCompletion(HttpServletRequest request,
1054310546

1054410547

1054510548

10546-
### 自定义拦截器
10549+
### 自定义
1054710550

1054810551
* Contoller层
1054910552

@@ -13221,7 +13224,7 @@ ConditionContext类API:
1322113224

1322213225
#### 自定义注解
1322313226

13224-
需求:将类的判断定义为动态的判断哪个字节码文件存在可以动态指定
13227+
需求:将类的判断定义为动态的判断哪个字节码文件存在可以动态指定
1322513228

1322613229
* 自定义条件注解类
1322713230

0 commit comments

Comments
 (0)