spring ioc Aop原理

以下面代码为例:

ApplicationContext applicationContext = new FileSystemXmlApplicationContext(“classpath:application.xml”);

User user = (User) applicationContext.getBean(“user”);

user.getName();

很显然spring会读取classpath下的配置文件,然后解析配置文件中的各个标签:

当遇到<context:component-scan base-package=”com.test.app.service” />就会去扫描这个路径然后封装类的数据到BeanDefinition中,每一个bean对应一个BeanDefinition.然后封装到private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(64);这个map中.至于直接在xml中定义的bean就更简单了.如果读取<bean/>标签的内容解析并封装到BeanDefinition.然后封装到beanDefinitionMap.

然后是调用AbstractApplicationContext中的refresh()方法的finishBeanFactoryInitialization(beanFactory)这句代码.这句代码将初始化spring的所有bean放到DefaultSingletonBeanRegistry 中的private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64);singletonObjects中,注意放到singletonObjects中的类会根据配置的切面来判断是否生成代理类,也就是放在这里面的bean如果要被拦截就会生成代理类,如果不需要被拦截就会生成普通类.

当使用这些类的时候直接从singletonObjects中获取bean。如果是spring aop的话那么就会获取代理bean然后调用反射挨个执行拦截器中的方法以及bean中的方法。

    原文作者:AOP
    原文地址: https://blog.csdn.net/u012415194/article/details/84895555
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞