Spring-AOP【二】简单使用与源码分析开篇
1、简单使用首先定义要拦截的bean,简单的写一个:
1234567891011121314151617181920/** * 用于拦截的Bean */public class CustomBean { private String str = "A"; public String getStr() { return str; } public void setStr(String str) { this.str = str; } @Override public String toString() { return str; }}
之后定义切面:
12345678910111213141516171819202122232425262728293031323334353637383940414243/** * 切面 */@Aspectpublic class CustomAspect { ...
Spring-AOP【一】概念与术语介绍
引言面向切面的程序设计(Aspect-oriented programming,AOP,又译作面向方面的程序设计、剖面导向程序设计)是计算机科学中的一种程序设计思想,旨在将横切关注点与业务主体进行进一步分离,以提高程序代码的模块化程度。通过在现有代码基础上增加额外的通知(Advice)机制,能够对被声明为“切点(Pointcut)”的代码块进行统一管理与装饰,如“对所有方法名以‘set*’开头的方法添加后台日志”。该思想使得开发人员能够将与代码核心业务逻辑关系不那么密切的功能(如日志功能)添加至程序中,同时又不降低业务代码的可读性。面向切面的程序设计思想也是面向切面软件开发的基础。
1、术语1.1、连接点 Joinpoint指程序执行过程中的点,如方法调用,在Spring AOP中支持方法级别的连接点。org.aopalliance.intercept.Joinpoint
123456789101112131415161718192021222324252627282930313233343536373839/** * 这个接口表示一个通用的运行时连接点(在AOP术语中)。 * * 运 ...
Spring-IOC从ApplicationContext角度看bean的加载流程【五】finishBeanFactoryInitialization
重要方法:finishBeanFactoryInitialization:实例化所有剩余的(非惰性初始化)单例。
1finishBeanFactoryInitialization(beanFactory);
完成此上下文的bean工厂的初始化,初始化所有剩余的单例bean。
12345678910111213141516171819202122232425262728293031323334protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { // 初始化此上下文的转换服务。 // conversionService if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) && beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.clas ...
Spring-IOC从ApplicationContext角度看bean的加载流程【四】MessageSource与ApplicationEventMulticaster
1、initMessageSource()Spring对MessageSource的初始化。
1234567891011121314151617181920212223242526272829//初始化MessageSource,如果在此上下文中没有定义父类,则使用父类。 protected void initMessageSource() { //获取beanFactory ConfigurableListableBeanFactory beanFactory = getBeanFactory(); //如果本地上下文中存在messageSource if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) { this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class); // 让M ...
Spring-IOC从ApplicationContext角度看bean的加载流程【三】BeanFactoryPostProcessors与BeanPostProcessors的处理
接着上一篇文章继续分析:
1、postProcessBeanFactory(beanFactory)在应用程序上下文的标准初始化之后修改其内部bean工厂。所有bean定义都已加载,但还没有实例化bean。这允许在特定的ApplicationContext实现中注册特殊的BeanPostProcessors等。
1protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {}
由子类实现:
2、invokeBeanFactoryPostProcessors(beanFactory)实例化并调用所有已注册的BeanFactoryPostProcessor bean,如果给定显式顺序,则遵循显式顺序。必须在单例实例化之前调用。
123456789protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProce ...
Spring-IOC从ApplicationContext角度看bean的加载流程【二】obtainFreshBeanFactory
obtainFreshBeanFactory方法的作用是告诉子类刷新内部bean工厂。
123456protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { //刷新bean工厂,这里使用了子类AbstractRefreshableApplicationContext中的实现 refreshBeanFactory(); //获取bean工厂 return getBeanFactory(); }
这里refreshBeanFactory()方法由子类AbstractRefreshableApplicationContext实现:
1234567891011121314151617181920212223242526@Overrideprotected final void refreshBeanFactory() throws BeansException { //如果已经持有一个BeanFactory i ...
Spring-IOC从ApplicationContext角度看bean的加载流程【一】
引言经过前一阵子的学习,了解了从BeanFactory角度加载bean的流程,但是一般使用spring都是使用ApplicationContent来加载配置文件,获取bean。ApplicationContent在实现BeanFactory接口的前提下,还有很多其他的功能,比如国际化、资源加载等。下面从一段代码开始本系列:
1234//上下文ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");//获取beanObject beanV1 = ac.getBean("xxx");
以前分析BeanFactory的代码:
12345678//资源定位ClassPathResource resource = new ClassPathResource("bean.xml");//bean工厂DefaultListableBeanFactory factory = new DefaultListableBeanFactory();//xml Bea ...
Spring-IOC加载Bean【十七】简单总结
Spring加载Bean确实很复杂,估计要看几遍才能摸清楚脉络,分析这一块源码大大小小耗费了好多天,终于耐着性子简单的分析完了。写这个总结还得拉出一段代码:
1234567891011//资源定位ClassPathResource resource = new ClassPathResource("bean.xml");//bean工厂DefaultListableBeanFactory factory = new DefaultListableBeanFactory();//xml BeanDefinition 阅读器XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);//加载与注册BeanDefinition,完成后的BeanDefinition放置在IOC容器中。reader.loadBeanDefinitions(resource);//bean的加载Object bean = factory.getBean("xxx");
即最后一行bean的加载逻 ...
Spring-IOC加载Bean【十六】bean对象的实例化-初始化Bean
经过createBeanInstance获取了BeanWrapper,之后通过调用populateBean实现了属性的填充,一个真正可以使用的bean马上就可以出师了:本篇分析bean的初始化:处理Aware,后置处理器,init方法等。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950/** * 初始化给定的bean实例,应用工厂回调以及init方法和bean后处理器。 * 对于传统定义的bean,从{@link #createBean}调用,对于现有bean实例,从{@link #initializeBean}调用。 * * @param beanName 工厂中的bean名称(用于调试) * @param bean 我们可能需要初始化新的bean实例 * @param mbd 创建bean时使用的bean定义(如果给定一个现有bean实例,也可以是 ...
Spring-IOC加载Bean【十五】bean对象的实例化-属性填充
获取bean(doCreateBean)有四步:
createBeanInstance,创建BeanWrapper
属性填充
bean初始化
1、属性填充逻辑123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121//用bean定义中的属性值填充给定BeanWrapper中的bean实例。 @SuppressWarnings("deprecation") // for postProcessPropertyValues protected void populateBean(String beanNam ...