16.Spring创建Bean源码-注册配置类,非常细!


highlight: arduino-light

源码断点示例代码

AOP切面类

```java package orange; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.core.PriorityOrdered; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component;

@Aspect @Component public class Aop implements PriorityOrdered {

   //指定切入点表达式,拦截那些方法,即为那些类生成代理对象    //@Pointcut("execution(* com.bie.aop.UserDao.save(..))") ..代表所有参数    //@Pointcut("execution(* com.bie.aop.UserDao.())") 指定所有的方法    //@Pointcut("execution( com.bie.aop.UserDao.save())") 指定save方法

   @Pointcut("execution(* tyrant.*.log(..))")    public void pointCut(){

  }

   @Before("pointCut()")    public void Before(){        System.out.println("Before");   }

   @After("pointCut()")    public void After(){        System.out.println("After");   }

   @AfterThrowing("pointCut()") public void AfterThrowing(){ System.out.println("AfterThrowing"); }

@AfterReturning("pointCut()")
public void AfterReturning(){
    System.out.println("AfterReturning");
}

@Around("execution(* tyrant.*.log(..))")
public void Around(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("Around Before");
    joinPoint.proceed();
    System.out.println("Around After");
}

@Override
public int getOrder() {
    return 1;
}

}

```

事务管理器

```java package orange; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionException; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionStatus; import org.springframework.transaction.support.SimpleTransactionStatus;

@Configuration("transactionManager") public class MyPlatformTransactionManager implements PlatformTransactionManager { @Override public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException { System.out.println("getTransaction"); return new SimpleTransactionStatus(); }

@Override
public void commit(TransactionStatus status) throws TransactionException {
        System.out.println("commit");
}

@Override
public void rollback(TransactionStatus status) throws TransactionException {
        System.out.println("rollback");
}

} ```

启动配置类

```java package orange; import org.springframework.context.annotation.*; import org.springframework.transaction.annotation.EnableTransactionManagement; import tyrant.Config;

@ComponentScan() @EnableAspectJAutoProxy(proxyTargetClass = true) @EnableTransactionManagement(mode = AdviceMode.PROXY) @Configuration public class BeanConfig { } ```

Bean

```java package orange; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional;

@Component public class AopLog { @Transactional("transactionManager") public String log() { System.out.println("----切面----"); return "1"; } } ```

启动类

```java package orange;

import org.springframework.context.annotation.AnnotatedBeanDefinitionReader; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.util.Map;

public class TestOrangeCondition { public static void main(String[] args) { /* * 创建一个BeanDefinition读取器 根据注解读取 * 创建一个BeanDefinition扫描器 能够扫描一个类或者包 转换成bd */ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); //注册配置类 context.register(BeanConfig.class); context.refresh(); Class>[] interfaces = AopLog.class.getInterfaces(); AopLog aopLog = context.getBean("aopLog",AopLog.class); aopLog.log(); } } ```

1.new AnnotationConfigApplicationContext()

java public AnnotationConfigApplicationContext() { //java 用class描述类 //spring 用BeanDefinition 描述bean //调用构造方法时需要首先调用父类GenericApplicationContext的构造方法 //在父类的构造方法里会初始化一个DefaultListableBeanFactory //this.beanFactory = new DefaultListableBeanFactory(); // this 代表的是AnnotationConfigApplicationContext /* 注册了5个RootBeanDefinition RootBeanDefinition df = new RootBeanDefinition(ConfigurationClassPostProcessor.class); RootBeanDefinition df = newRootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class); RootBeanDefinition df = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class); RootBeanDefinition df = new RootBeanDefinition(EventListenerMethodProcessor.class); RootBeanDefinition df = new RootBeanDefinition(DefaultEventListenerFactory.class); */ //创建一个BeanDefinition读取器 可以根据注解读取 BeanDefinition this.reader = new AnnotatedBeanDefinitionReader(this); //创建一个BeanDefinition扫描器 能够扫描一个类或者包 转换成bd this.scanner = new ClassPathBeanDefinitionScanner(this); }

1.1调用父类构造,创建DefaultListableBeanFactory

调用构造方法时需要首先调用父类GenericApplicationContext的构造方法,在父类GenericApplicationContext的构造方法里会初始化一个DefaultListableBeanFactory。

java this.beanFactory = new DefaultListableBeanFactory();

1.2.new AnnotatedBeanDefinitionReader(this)

创建一个BeanDefinition读取器 可以根据注解读取BeanDefinition

java public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) { //registry 代表的是AnnotationConfigApplicationContext this(registry, getOrCreateEnvironment(registry)); }

public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) { Assert.notNull(registry, "BeanDefinitionRegistry must not be null"); Assert.notNull(environment, "Environment must not be null"); this.registry = registry; this.conditionEvaluator = new ConditionEvaluator(registry, environment, null); AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry); }

1.2.1获取StandardEnvironment

java private static Environment getOrCreateEnvironment(BeanDefinitionRegistry registry) { //获取StandardEnvironment Assert.notNull(registry, "BeanDefinitionRegistry must not be null"); if (registry instanceof EnvironmentCapable) { //获取 systemProperties 放入StandardEnvironment //获取 systemEnvironment 放入StandardEnvironment return ((EnvironmentCapable) registry).getEnvironment(); } return new StandardEnvironment(); }

1.2.2注册5个ConfigProcessors的Definition

注册了5个RootBeanDefinition,添加到Set\

java //这个ConfigurationClassPostProcessor非常非常非常重要 RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class); RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class); RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class); RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class); RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);

1.2.2.1ConfigurationClassPostProcessor

贴了2个比较重要的方法:

java //BeanDefinitionRegistryPostProcessor: //postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)

java //BeanFactoryPostProcessor: //postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)

java @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { System.out.println("tyrant ConfigurationClassPostProcessor"); int registryId = System.identityHashCode(registry); if (this.registriesPostProcessed.contains(registryId)) { throw new IllegalStateException( "postProcessBeanDefinitionRegistry already called on this post-processor against " + registry); } if (this.factoriesPostProcessed.contains(registryId)) { throw new IllegalStateException( "postProcessBeanFactory already called on this post-processor against " + registry); } this.registriesPostProcessed.add(registryId); //处理配置类的bean定义信息 processConfigBeanDefinitions(registry); } ​ /** * Prepare the Configuration classes for servicing bean requests at runtime * by replacing them with CGLIB-enhanced subclasses. */ @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { System.out.println("tyrant postProcessBeanFactory"); int factoryId = System.identityHashCode(beanFactory); if (this.factoriesPostProcessed.contains(factoryId)) { throw new IllegalStateException               ("postProcessBeanFactory already called on                                       this post-processor against " + beanFactory); } this.factoriesPostProcessed.add(factoryId); if (!this.registriesPostProcessed.contains(factoryId)) { // BeanDefinitionRegistryPostProcessor hook apparently not supported... // Simply call processConfigurationClasses lazily at this point then. processConfigBeanDefinitions((BeanDefinitionRegistry) beanFactory); } //用于增强配置类 给FULL类型的配置类增加2个增强回调 enhanceConfigurationClasses(beanFactory); //这里还注册了一个ImportAwareBeanPostProcessor 是一个BeanPostProcessor //用于处理增强配置类 beanFactory.addBeanPostProcessor(new                                         ImportAwareBeanPostProcessor(beanFactory)); } ​

★1.2.2.2AutowiredAnnotationBeanPostProcessor
@AutoWired 和 @Value

java @SuppressWarnings("unchecked") public AutowiredAnnotationBeanPostProcessor() { this.autowiredAnnotationTypes.add(Autowired.class); this.autowiredAnnotationTypes.add(Value.class); try { this.autowiredAnnotationTypes.add((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Inject", AutowiredAnnotationBeanPostProcessor.class.getClassLoader())); } catch (ClassNotFoundException ex) { // JSR-330 API not available - simply skip. } }

★1.2.2.3CommonAnnotationBeanPostProcessor
@PostConstruct和@PreDestroy

java public CommonAnnotationBeanPostProcessor() { setOrder(Ordered.LOWEST_PRECEDENCE - 3); setInitAnnotationType(PostConstruct.class); setDestroyAnnotationType(PreDestroy.class); ignoreResourceType("javax.xml.ws.WebServiceContext"); }

1.2.2.4EventListenerMethodProcessor
1.2.2.5DefaultEventListenerFactory

1.3.new ClassPathBeanDefinitionScanner(this)

创建一个BeanDefinition扫描器 能够扫描一个类或者包 转换成bd

java public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry) {   //默认是true代表的是useDefaultFilters this(registry, true); }

java public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters) { this(registry, useDefaultFilters, getOrCreateEnvironment(registry)); }

java public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,Environment environment) { this(registry, useDefaultFilters, environment, (registry instanceof ResourceLoader ? (ResourceLoader) registry : null)); }

★1.3.1includeFilters注册:@Component

@Controller @Repository @Service

public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,Environment environment, @Nullable ResourceLoader resourceLoader) { ​ Assert.notNull(registry, "BeanDefinitionRegistry must not be null"); this.registry = registry; /* 注册了3个类型过滤器 这也是为什么可以扫描到下面这些注解的原因 其中 @Component 包含 @Controller @Repository @Service this.includeFilters.add(new AnnotationTypeFilter(Component.class)); 下面2个如果没有相关依赖 就不会加入对应的filter this.includeFilters.add(javax.inject.ManagedBean) this.includeFilters.add(javax.inject.Named) */ if (useDefaultFilters) { registerDefaultFilters(); } setEnvironment(environment); setResourceLoader(resourceLoader); }

``` protected void registerDefaultFilters() {   //其中 @Component 包含 @Controller @Repository @Service this.includeFilters.add(new AnnotationTypeFilter(Component.class)); ClassLoader cl = ClassPathScanningCandidateComponentProvider           .class.getClassLoader(); try { this.includeFilters               .add(new AnnotationTypeFilter(   ((Class extends Annotation>)                     ClassUtils.forName("javax.annotation.ManagedBean", cl)), false));

} catch (ClassNotFoundException ex) { } try { this.includeFilters               .add(new AnnotationTypeFilter( ((Class extends Annotation>)                     ClassUtils.forName("javax.inject.Named", cl)), false)); } catch (ClassNotFoundException ex) {

}
}

```

2.new AnnotatedBeanDefinitionReader(this)

创建一个BeanDefinition读取器 可以根据注解读取BeanDefinition

java public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment){ Assert.notNull(registry, "BeanDefinitionRegistry must not be null"); Assert.notNull(environment, "Environment must not be null"); this.registry = registry; this.conditionEvaluator = new ConditionEvaluator(registry, environment, null); /* 注册了5个 RootBeanDefinition df = new RootBeanDefinition(ConfigurationClassPostProcessor.class); RootBeanDefinition df = newRootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class); RootBeanDefinition df = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class); RootBeanDefinition df = new RootBeanDefinition(EventListenerMethodProcessor.class); RootBeanDefinition df = new RootBeanDefinition(DefaultEventListenerFactory.class); */ AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry); }

2.1获取StandardEnvironment

java private static Environment getOrCreateEnvironment(BeanDefinitionRegistry registry) { //获取StandardEnvironment Assert.notNull(registry, "BeanDefinitionRegistry must not be null"); if (registry instanceof EnvironmentCapable) { //获取 systemProperties 放入StandardEnvironment //获取 systemEnvironment 放入StandardEnvironment return ((EnvironmentCapable) registry).getEnvironment(); } return new StandardEnvironment(); }

2.2注册5个ConfigProcessors的Definition

注册了5个RootBeanDefinition。

然后添加到Set\ beanDefs = new LinkedHashSet<>(8);

java //这个ConfigurationClassPostProcessor非常非常非常重要 //这个ConfigurationClassPostProcessor非常非常非常重要 RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class); RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class); RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class); RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class); RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);

2.2.1ConfigurationClassPostProcessor

贴2个比较重要的方法: //BeanDefinitionRegistryPostProcessor: //postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)

//BeanFactoryPostProcessor: //postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)

java @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { System.out.println("tyrant ConfigurationClassPostProcessor"); int registryId = System.identityHashCode(registry); if (this.registriesPostProcessed.contains(registryId)) { throw new IllegalStateException( "postProcessBeanDefinitionRegistry already called on this post-processor against " + registry); } if (this.factoriesPostProcessed.contains(registryId)) { throw new IllegalStateException ("postProcessBeanFactory already called on this post-processor against " + registry); } this.registriesPostProcessed.add(registryId); //处理配置类的bean定义信息 processConfigBeanDefinitions(registry); }

java @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { System.out.println("tyrant postProcessBeanFactory"); int factoryId = System.identityHashCode(beanFactory); if (this.factoriesPostProcessed.contains(factoryId)) { throw new IllegalStateException("postProcessBeanFactory already called on this post-processor against " + beanFactory); } this.factoriesPostProcessed.add(factoryId); if (!this.registriesPostProcessed.contains(factoryId)) { // BeanDefinitionRegistryPostProcessor hook apparently not supported... // Simply call processConfigurationClasses lazily at this point then. processConfigBeanDefinitions((BeanDefinitionRegistry) beanFactory); } //用于增强配置类 给FULL类型的配置类增加2个增强回调 enhanceConfigurationClasses(beanFactory); //这里还注册了一个ImportAwareBeanPostProcessor 是一个BeanPostProcessor //用于处理增强配置类 beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory)); }

2.2.2AutowiredAnnotationBeanPostProcessor:处理@Auowired@Value

主要用于处理@AutoWired和@Value

java @SuppressWarnings("unchecked") public AutowiredAnnotationBeanPostProcessor() { this.autowiredAnnotationTypes.add(Autowired.class); this.autowiredAnnotationTypes.add(Value.class); try { this.autowiredAnnotationTypes .add((Class<? extends Annotation>)ClassUtils.forName("javax.inject.Inject", AutowiredAnnotationBeanPostProcessor.class.getClassLoader())); }catch (ClassNotFoundException ex) { } }

2.2.3CommonAnnotationBeanPostProcessor

@PostConstruct

@PreDestroy

java public CommonAnnotationBeanPostProcessor() { setOrder(Ordered.LOWEST_PRECEDENCE - 3); setInitAnnotationType(PostConstruct.class); setDestroyAnnotationType(PreDestroy.class); ignoreResourceType("javax.xml.ws.WebServiceContext"); }

2.2.4EventListenerMethodProcessor

2.2.5DefaultEventListenerFactory

3.new ClassPathBeanDefinitionScanner(this)

创建一个BeanDefinition扫描器 能够扫描一个类或者包 转换成bd

3.1includeFilters注册:@Component

java //@Component 包含 @Controller @Repository @Service @Configuration this.includeFilters.add(new AnnotationTypeFilter(Component.class)); this.includeFilters.add(javax.inject.ManagedBean) this.includeFilters.add(javax.inject.Named)

4.context.register(BeanConfig.class);

for循环遍历注册配置类: 由register---->registerBean---->doRegisterBean

4.1用AnnotatedBeanDefinitionReader注册配置类BD

```java public void doRegisterBean(Class beanClass, @Nullable Supplier instanceSupplier, @Nullable String name,@Nullable Class extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {

//beanClass是配置类 且使用reader处理 所以使用AnnotatedGenericBeanDefinition
AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);

//判断是否需要跳过
//如果没有加@Conditional注解需要解析。
//反之需要执行@Conditional注解指定类的match方法来判断是否需要解析
if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
    return;
}

//instanceSupplier 是 null
abd.setInstanceSupplier(instanceSupplier);

//解析@Scope注解 判断单例&多例
ScopeMetadata scopeMetadata =           
                this.scopeMetadataResolver.resolveScopeMetadata(abd);

//获取类的作用域 getScopeName --->singleton 即单例
abd.setScope(scopeMetadata.getScopeName());

//生成beanName,默认的beanName是null  
//判断有没有指定name,如果没有指定name,那么使用驼峰首字母小写的方式作为命名
String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));

//解析配置类Appconfig上的@LazyInit @Primary @DependsOn @Role @Description 等注解
//并设置到 AnnotatedGenericBeanDefinition的属性里
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);

//qualifiers限定符 是传入进来的参数null
if (qualifiers != null) {  
    for (Class<? extends Annotation> qualifier : qualifiers) {
        if (Primary.class == qualifier) {
            abd.setPrimary(true);
        }
        else if (Lazy.class == qualifier) {
            abd.setLazyInit(true);
        }
        else {
            abd.addQualifier(new AutowireCandidateQualifier(qualifier));
        }
    }
}

//此处没细看 跳过
for (BeanDefinitionCustomizer customizer : definitionCustomizers) {
    customizer.customize(abd);
}

//BeanDefinitionHolder 是一个数据结构 封装了 bd 以及bd的额外信息
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);

//ScopedProxyMode Springmvc
//多例代理模式? 此处是ScopedProxyMode.NO
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode
                                (scopeMetadata, definitionHolder, this.registry);

//同名beanName通过isAllowBeanDefinitionOverriding判断是否可以覆盖
//注册配置类到BeanDefinitionMap
//此时有6个beanDefinition
//5个ConfigProcessors的Definition + 1个BeanConfig的BeanDefinition
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);

} ```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值