1. 什么是AOP? 先看一下传统程序的流程,比如银行系统会有一个取款流程: 我们可以把方框里的流程合为一个,另外系统还会有一个查询余额流程,我们先把这两个流程放到一起: 有没有发现,这个两者有一个相同的验证流程,我们先把它们圈起来再说下一步:
1. AOP的基石 AOP的功能这么强大,其基础知识就是动态代理。
1. spring mvc核心访问流程 springmvc随着springboot启动后,即可立即对外部暴露restful api,接收消费端的http请求,那么一个请求从客户端发起,到restful接收,整个过程是什么样子的呢?
1.
1. spring底层对普通方式比如@Component,和特殊方式@Bean的处理区别 @Bean标注在一个方法上,会自动执行该方法,将该方法的返回值作为bean实例注册到spring容器中去。 1.1 beanDefinition描述的bean类型有区别 @Bean注册的beanDefinition中,描述的bean类型就是@Bean标注的方法返回值类型,不会添加目标bean的所有父类型。 这点需要特别注意,@Bean注册的bean类型就是方法返回值的类型,为什么非要强调这一点? 是因为通过@Bean的方式注册到容器中的bean的类型就是方法返回值的类型,这在通过context.getBean(TargetBean.class)这种方式获取bean实例时有很大的影响。 举个例子: public interface MyInterface{} 上述接口有一个实现类: public class MyInterfaceImpl implements MyInterface{} 如果通过普通方式注册MyInterfaceImpl的话,比如: @Component public class MyInterfaceImpl implements MyInterface{} 这种方式注册到spring容器中的bean,其根据该类的class转换成的BeanDefinition对象中,大概有如下信息: beanName:是类名驼峰化后的字符串。 beanType:是该类的真实类型,比如MyInterfaceImpl、同时还会将该类的所有父类型依次绑定到该bean的BeanDefinition中,比如 MyInterface类型。如果MyInterface还有父类型,会递归检索,直到发现父类型是Object.class为止。 因此,通过applicationContext.getBean(MyInterface.class)是可以成功从容器中获取到MyInterfaceImpl实例的。 实际上通过@Component等方式注册的bean,转换后的BeanDefinition类型是org.springframework.context.annotation.ScannedGenericBeanDefinition,通过在自定义的beanFactoryPostProcessor中进行代码调试可以发现有如下结构: metaData:这个对象中定义了目标bean的ClassName、SuperClassName表示目标Bean的直接父类、InterfaceNames表示了目标Bean的所有直接接口的权限定名。 beanClass:表示目标Bean的Class对象。 scope:表示目标Bean的scope,默认是singleton。 除此之外还有很多信息,都用来描述目标bean。
1.
1.
1.
1.
1. spring对bean的实例化一般有两种 1.实时初始化bean 2.延迟初始化bean 注意,这里的“延迟初始化”中的“初始化”实际上是习惯性叫法,正确理解应该是“延迟实例化”。
个人独立开发项目,基于springboot 3.x starter机制提供插拔式的插件功能
基于芋道最新源码二次开发