spring import 注解分析
This commit is contained in:
parent
f0c6bc87ac
commit
b88fee21f8
@ -48,6 +48,7 @@
|
||||
- [Spring messageSource](/docs/Spring/clazz/Spring-MessageSource.md)
|
||||
- [Spring 自定义属性解析器](/docs/Spring/clazz/Spring-Custom-attribute-resolver.md)
|
||||
- [Spring 排序工具](/docs/Spring/clazz/Spring-OrderUtils.md)
|
||||
- [Spring-import注解](/docs/Spring/clazz/Spring-Import.md)
|
||||
### Spring5 新特性
|
||||
- [Spring5-spring.components解析](/docs/Spring/Spring5新特性/Spring-spring-components.md)
|
||||
|
||||
|
98
docs/Spring/clazz/Spring-Import.md
Normal file
98
docs/Spring/clazz/Spring-Import.md
Normal file
@ -0,0 +1,98 @@
|
||||
# Spring Import
|
||||
- Author: [HuiFer](https://github.com/huifer)
|
||||
- 源码阅读仓库: [SourceHot-spring](https://github.com/SourceHot/spring-framework-read)
|
||||
|
||||
## 分析
|
||||
- org.springframework.context.annotation.Import
|
||||
```java
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface Import {
|
||||
|
||||
/**
|
||||
* {@link Configuration @Configuration}, {@link ImportSelector},
|
||||
* {@link ImportBeanDefinitionRegistrar}, or regular component classes to import.
|
||||
*
|
||||
* 需要导入的类
|
||||
*/
|
||||
Class<?>[] value();
|
||||
}
|
||||
```
|
||||
### ImportBeanDefinitionRegistrar
|
||||
- 注册Import Bean
|
||||
- `org.springframework.context.annotation.ImportBeanDefinitionRegistrar`
|
||||
```java
|
||||
public interface ImportBeanDefinitionRegistrar {
|
||||
|
||||
/**
|
||||
* Register bean definitions as necessary based on the given annotation metadata of
|
||||
* the importing {@code @Configuration} class.
|
||||
* <p>Note that {@link BeanDefinitionRegistryPostProcessor} types may <em>not</em> be
|
||||
* registered here, due to lifecycle constraints related to {@code @Configuration}
|
||||
* class processing.
|
||||
*
|
||||
* 对import value属性的注册
|
||||
* @param importingClassMetadata annotation metadata of the importing class
|
||||
* @param registry current bean definition registry
|
||||
*/
|
||||
void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
|
||||
|
||||
}
|
||||
```
|
||||
- 两个实现类
|
||||
1. `org.springframework.context.annotation.AutoProxyRegistrar`
|
||||
2. `org.springframework.context.annotation.AspectJAutoProxyRegistrar`
|
||||
|
||||
#### AutoProxyRegistrar
|
||||
```java
|
||||
public class AutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
|
||||
|
||||
private final Log logger = LogFactory.getLog(getClass());
|
||||
|
||||
/**
|
||||
* 注册import bean定义
|
||||
*/
|
||||
@Override
|
||||
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
|
||||
boolean candidateFound = false;
|
||||
// 获取注解
|
||||
Set<String> annTypes = importingClassMetadata.getAnnotationTypes();
|
||||
for (String annType : annTypes) {
|
||||
// 注解属性
|
||||
AnnotationAttributes candidate = AnnotationConfigUtils.attributesFor(importingClassMetadata, annType);
|
||||
if (candidate == null) {
|
||||
continue;
|
||||
}
|
||||
// 获取 mode 属性
|
||||
Object mode = candidate.get("mode");
|
||||
// 获取代理对象
|
||||
Object proxyTargetClass = candidate.get("proxyTargetClass");
|
||||
if (mode != null && proxyTargetClass != null && AdviceMode.class == mode.getClass() &&
|
||||
Boolean.class == proxyTargetClass.getClass()) {
|
||||
candidateFound = true;
|
||||
if (mode == AdviceMode.PROXY) {
|
||||
// 注册
|
||||
AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);
|
||||
if ((Boolean) proxyTargetClass) {
|
||||
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!candidateFound && logger.isInfoEnabled()) {
|
||||
String name = getClass().getSimpleName();
|
||||
logger.info(String.format("%s was imported but no annotations were found " +
|
||||
"having both 'mode' and 'proxyTargetClass' attributes of type " +
|
||||
"AdviceMode and boolean respectively. This means that auto proxy " +
|
||||
"creator registration and configuration may not have occurred as " +
|
||||
"intended, and components may not be proxied as expected. Check to " +
|
||||
"ensure that %s has been @Import'ed on the same class where these " +
|
||||
"annotations are declared; otherwise remove the import of %s " +
|
||||
"altogether.", name, name, name));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
```
|
Loading…
x
Reference in New Issue
Block a user