主要内容:
一、IOC容器的初始化流
1、创建IOC容器
2、注册配置类
3、BeanFactory后置处理器
4、Bean的后置处理器
5、创建Bean对象
二、AOP切面的工作流程
前期准备
一、配置类
@Configuration
@EnableAspectJAutoProxy
@ComponentScan(value = {"com.netease.study.aop"})
@ImportResource("classpath:spring-test.xml")
@PropertySource(value = "jdbc.properties")
@EnableTransactionManagement
@Conditional(MyCondition.class)
@Lazy
//@Import({Yellow.class})
public class MainConfig {
@Bean
public TargetClass targetClass() {
return new TargetClass();
}
@Bean
public AspectClass aspectClass() {
return new AspectClass();
}
}
二、部分Bean的创建类
1、AspectClass类
@Aspect
public class AspectClass {
@Pointcut(value = "execution(public int com.netease.study.aop.TargetClass.div(..))")
public void pointCut() {
}
@Before(value = "pointCut()")
public void logStart() {
System.out.println("before..............");
}
}
2、TargetClass类
public class TargetClass {
public int div(int i, int j) {
return i / j;
}
}
3、MyCondition类
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return true;
}
}
4、MyFactoryBean类
@Component
public class MyFactoryBean implements SmartFactoryBean<Yellow> {
@Override
public Yellow getObject() throws Exception {
return new Yellow();
}
@Override
public Class<?> getObjectType() {
return Yellow.class;
}
@Override
public boolean isSingleton() {
return true;
}
@Override
public boolean isPrototype() {
return false;
}
@Override
public boolean isEagerInit() {
return true;
}
}
5、Blue类
@Data
public class Blue {
private String name;
@Autowired
private Car car;
}
6、启动类
public class MainTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
System.out.println(applicationContext);
TargetClass targetClass = applicationContext.getBean(TargetClass.class);
targetClass.div(1, 1);
}
}
IOC容器的初始化流程
从:
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class,OtherConfig.class);
进入:
this();
register(annotatedClasses);
refresh();
一、创建IOC容器
1、this();先执行父类的初始化方法,创建IOC容器。
public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
}
2、执行初始化方法创建BeanDefinition的读取器和classpath下扫描器
public AnnotationConfigApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
3、this.reader = new AnnotatedBeanDefinitionReader(this)的创建过程
AnnotationConfigApplicationContext继承了BeanDefinitionRegistry接口作为参数给
AnnotatedBeanDefinitionReader对象,首先为这个注册器创建一个StandardEnvironment对象。
4、执行AnnotatedBeanDefinitionReader的构造器:重点在最后一行的注册注解配置处理器
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);
}
5、执行AnnotationConfigUtils#registerAnnotationConfigProcessors方法
5.1、这个方法把下面对象注册到IOC容器里面
org.springframework.context.annotation.ConfigurationClassPostProcessor、org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor
org.springframework.context.annotation.CommonAnnotationBeanPostProcessor、org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor放到IOC容器里