spring(不定时更新)
2021-05-23 13:13:36 0 举报
AI智能生成
spring
作者其他创作
大纲/内容
常用注解
@Lookup
假设一个单例的Bean A需要引用一个非单例模式的Bean B,
那么在每次引用B的时候都想拿到一个新的B,该怎么做?
要知道,Bean A是单例模式的,只会被创建一次,注入一次属性,也就是说,
即使B是property模式,那也是只会一个相同的B,因为A只会被注入一次
那么在每次引用B的时候都想拿到一个新的B,该怎么做?
要知道,Bean A是单例模式的,只会被创建一次,注入一次属性,也就是说,
即使B是property模式,那也是只会一个相同的B,因为A只会被注入一次
解决方法
1.让bean A通过实现ApplicationContextAware来感知applicationContext(即可以获得容器上下文),
从而能在运行时通过ApplicationContext.getBean(String beanName)的方法来获取最新的bean B
从而能在运行时通过ApplicationContext.getBean(String beanName)的方法来获取最新的bean B
2. 使用Spring的Lookup注解
@Lookup只能注解在方法上,通过方法返回该非单例实例
@Import
@Import只能用在类上 ,@Import通过快速导入的方式实现把实例加入spring的IOC容器中
@Import注解可以用于导入第三方包
@ComponentScan一般只会扫到自己项目中的Bean,第三方jar包中的@Bean扫不到
@ComponentScan一般只会扫到自己项目中的Bean,第三方jar包中的@Bean扫不到
@Bean
该注释的属性的名称和语义类似于Spring XML模式中bean的元素的名称和语义。
@Bean指示方法产生一个由Spring容器管理的bean
@Bean指示方法产生一个由Spring容器管理的bean
@Autowired
默认按类型装配
required=false
表示忽略当前要注入的bean,如果有直接注入,没有则跳过
required=true
表示注入时,该bean必须存在,否则注入失败
@Resource
默认按照名称来,如果名称找不到,那么按照type
@Required
主要用在setter方法上,表示受影响的bean属性必须在配置时注入
AOP
advisor
spring aop顶层抽象,用来管理advice和pointcut
IntroductionAdvisor
只能应用与类级别的拦截
只能只用Introduction型的Advice
PointcutAdvisor
可以使用任何类型的Pointcut,以及几乎任何类型的Advice
advice
对通知的顶层抽象
BeforeAdvice(前置增强)
AfterAdvice(后置增强)
ThrowsAdvice(异常增强)
RoundAdvice(环绕增强)
IntroductionAdvice(引入增强)
一个类,没有实现A接口,在不修改类的情况下,使其具备A接口的功能
pointcut
对切点的抽象
JoinPoint和PointCut的区别
所有方法执行都是JoinPoint,而Pointcut是一个描述信息,修饰的是
JoinPoint,通过Pointcut,可以确定哪些JoinPoint可以被织入Advice
JoinPoint,通过Pointcut,可以确定哪些JoinPoint可以被织入Advice
1. 首先Advice通过Pointcut查询需要织入的JoinPoint
2. 然后Advice在查询到JoinPoint上执行逻辑
springboot
模块
spring-boot模块,核心实现
spring-boot-autoconfigure,根据类路径的内容,自动配置大部分
常用应用程序
常用应用程序
自动配置
@EnableAutoConfiguration
用于开启自动配置
@AutoConfigurationPackage
获取主程序类所在的包路径,并将包路径下
的所有组件注册到Spring IOC容器中
的所有组件注册到Spring IOC容器中
临时
BeanWrapper
对bean的包装,相当于一个代理器,提供用于分析和操作标准javabean的操作
接口定义
包括获取被包装的对象,获取被包装bean的属性描述器
ioc容器用来以统一的方式来访问bean的属性
InstantiationStrategy
策略接口,负责根据Bean类创建bean实例
提供了(默认构造方法,指定构造方法,指定工厂方法)三种策略创建bean实例
实现类
SimpleInstantiationStrategy
对InstantiationStrategy做了简单实现
如果工厂方法实例化直接用反射创建对象
如果是构造方法实例化则判断是否有methodOverrides,如果无也是直接用反射
如果有methodOverrides就需要用cglib实例化对象
CglibSubclassingInstantiationStrategy
通过cglib实例化的具体实现
ApplicationContextInitializer
用于在spring容器刷新之前初始化spring ConfigurableApplicationContext的
回调接口
回调接口
通常用于需要对应用程序上下文进行编程初始化的web应用程序,
例如:根据上下文环境注册属性源或激活配置文件等
例如:根据上下文环境注册属性源或激活配置文件等
ApplicationListener
接口实现ApplicationEvent的监听
spring内置事件
ContextRefreshEvent
ApplicationContext被初始化或刷新时,该事件被触发
ContextStartedEvent
当使用 ConfigurableApplicationContext (ApplicationContext子接口)接口中的 start() 方法启动 ApplicationContext 时,该事件被发布
ContextStoppedEvent
当使用 ConfigurableApplicationContext 接口中的 stop() 停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作
ContextClosedEvent
当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。
一个已关闭的上下文到达生命周期末端;它不能被刷新或重启
一个已关闭的上下文到达生命周期末端;它不能被刷新或重启
RequestHandledEvent
这是一个 web-specific 事件,告诉所有 bean HTTP 请求已经被服务。只能应用于使用DispatcherServlet的Web应用。
在使用Spring作为前端的MVC控制器时,当Spring处理用户请求结束后,系统会自动触发该事件
在使用Spring作为前端的MVC控制器时,当Spring处理用户请求结束后,系统会自动触发该事件
IOC
BeanDefinition
isLazy
是不是一个懒加载的bean
原型懒加载bean
没有意义
单例懒加载bean
非加载的单例bean是在spring启动时创建的
懒加载的单例bean不是在spring启动时候创建的,而时在第一次获取bean时创建
dependsOn
表示依赖的其他bean
autowireCandidate
当前bean是不是一个自动装配候选者
表示当前bean能不能自动注入给其他bean,默认true
primary
主bean
在进行自动注入时,通过属性类型,或方法参数可能会找到多个bean,如果多个bean存在一个主bean,
那么就直接把这个主bean注入给属性或方法
那么就直接把这个主bean注入给属性或方法
initMethodname
初始化方法
spring在创建bean的过程中会调用初始化方法
destroyMethodName
销毁方法
spring在销毁bean过程中会调用销毁方法
constructorArgumentValues
构造方法参数值
可以通过BeanDefinition中这个属性来给构造方法传递值
propertyValues
属性值
可以通过BeanDefinition中的这个属性来给bean的某些属性赋值
factoryBeanName
一个bean,可以通过另外一个bean的某个方法来创建
factoryMethodName
一个bean,可以通过另外一个bean的某个方法来创建
BeanFactory
bean工厂,可以根据某个bean的名字,或类型,或别名获取bean对象
BeanDefinitionRegistry
可以注册、保存、移除、获取某个BeanDefinition
SingletonBeanRegistry
可以直接注册、获取某个单例Bean
ListableBeanFactory
在BeanFactory的基础上,增加了其他功能,可以获取所有BeanDefinition的beanName,可以根据某个
类型获取对应的beanNames
类型获取对应的beanNames
HierarchicalBeanFactory
在BeanFactory的基础上,添加了获取父BeanFactory的功能
ConfigurableBeanFactory
在HierarchicalBeanFactory和SingletonBeanRegistry的基础上,添加了设置父BeanFactory,
类加载器、设置spring el表达式解析器、设置类型转化访问,可以添加BeanPostProcessor,
可以合并BeanDefinition,可以销毁Bean等等功能
类加载器、设置spring el表达式解析器、设置类型转化访问,可以添加BeanPostProcessor,
可以合并BeanDefinition,可以销毁Bean等等功能
AutowireCapableBeanFactory
是直接继承了BeanFactory,在BeanFactory继承上,支持在创建Bean的过程中对Bean
进行自动装配
进行自动装配
AbstractBeanFactory
实现了ConfigurableBeanFactory接口,继承了Factory有BeanRegistrySupport,这个BeanFactory的功能
已经很全面了,但是不能自动装配和获取beanNames
已经很全面了,但是不能自动装配和获取beanNames
ConfigurableListableBeanFactory
继承了ListableBeanFactory、AutowireCapableBeanFactory、ConfigurableBeanFactory
AbstractAutowireCapableBeanFactory
继承了AbstractBeanFactory,实现了AutowireCapableBeanFactory,拥有了
自动装配的功能
自动装配的功能
DefaultListableBeanFactory
继承了AbstractAutowireCapableBeanFactory,实现了ConfigurableListableBeanFactory接口和
BeanDefinitionRegistry接口
BeanDefinitionRegistry接口
ApplicationContext
特殊的BeanFactoy
继承了一些子接口
HierarchicalBeanFactory
拥有获取父B而安Factory的功能
ListableBeanFactory
拥有获取beanNames的功能
ResourcePatternResolver
资源加载器,可以一次性获取多个资源(文件资源等等)
EnvironmentCapable
可以获取运行时环境(没有设置运行时环境功能)
ApplicationEventPublisher
拥有广播事件的功能(没有添加事件监听器的功能)
MessageSource
拥有国际化功能
两个重要的实现类
AnnotationConfigApplicationContext
ConfigurableApplicationContext
继承了ApplicationContext接口,增加了添加事件监听器,添加BeanFactoryPostProcessor,设置
Environment,BeanFactory等功能
Environment,BeanFactory等功能
AbstractApplicationContext
实现了ConfigurableApplicationContext接口
GenericApplicationContext
继承了AbstractApplicationContext,实现了BeanDefinitionRegistry接口,拥有了所有
ApplicationContext的功能,并且可以注册BeanDefinition
ApplicationContext的功能,并且可以注册BeanDefinition
AnnotationConfigRegistry
可以单独注册某个为类的BeanDefinition(可以处理该类上的
@Configuration注解和@Bean注解)
@Configuration注解和@Bean注解)
AnnotationConfigApplicationContext
继承了GenericApplicationContext,实现了AnnotationConfigRegistry,拥有了以上所有接口
ClassPathXmlApplicationContext
继承了AbstractApplicationContext
BeanPostProcessor
允许干涉Bean的生命周期
本接口
初始化前调用
初始化后调用
子接口
InstantiationAwareBeanPostProcessor
在BeanPostProcessor的基础上增加了实例化前调用
在BeanPostProcessor的基础上增加了实例化后调用
在BeanPostProcessor的基础上增加了填充属性
DestructionAwareBeanPostProcessor
在BeanPostProcessor的基础上增加了销毁前
MergedBeanDefinitionPostProcessor
在BeanPostProcessor的基础上增加了实例化和实例化后之间
SmartInstantiationAwareBeanPostProcessor
在InstantiationAwareBeanPostProcessor基础上增加了推断构造方法
在InstantiationAwareBeanPostProcessor基础上增加了提前暴露引用
BeanFactoryPostProcessor
Bean工厂后置处理器
允许可以操作BeanFactory
本接口
可以获取BeanFactory,并操作
不能注册BeanDefinition,只能修改BeanDefinition
子接口
BeanDefinitionRegistryPostProcessor
可以注册BeanDefinition
TargetSource
proxy(代理对象)代理的不是target,而是TargetSource
一个proxy(代理对象)只能代理一个target,每次方法调用的目标也是唯一固定的target。但是,如果让proxy代理TargetSource,可以使得每次方法调用的target实例都不同
SingletonTargetSource
SingletonTargetSource通过构造方法传入一个目标bean对象,在使用getTarget()方法时,也只是将该对象直接返回;
并且这里isStatic()方法返回的是true,也就是说,Spring是可以缓存SingletonTargetSource的
并且这里isStatic()方法返回的是true,也就是说,Spring是可以缓存SingletonTargetSource的
PrototypeTargetSource
PrototypeTargetSource主要重写了getTarget()和releaseTarget()方法,
并且委托给newPrototypeInstance()和destroyPrototypeInstance()执行
并且委托给newPrototypeInstance()和destroyPrototypeInstance()执行
CommonsPool2TargetSource
池化的TargetSource
CommonsPool2TargetSource的实现是将其委托给了ObjectPool进行,具体的也就是GenericObjectPool,其实现了ObjectPool接口
ThreadLocalTargetSource
springmvc
HandlerAdapter(处理器适配器)
概念:HandlerAdapter 会根据适配器接口对后端控制器进行包装(适配),
包装后即可对处理器进行执行,通过扩展处理器适配器可以执行多种类型的处理器,这里使用了适配器设计模式
包装后即可对处理器进行执行,通过扩展处理器适配器可以执行多种类型的处理器,这里使用了适配器设计模式
SimpleControllerHandlerAdapter
如果我们开发的接口是通过实现 Controller 接口来完成的(不是通过注解开发的接口),
那么 HandlerAdapter 必须是 SimpleControllerHandlerAdapter
那么 HandlerAdapter 必须是 SimpleControllerHandlerAdapter
HttpRequestHandlerAdapter
http 请求处理器适配器,所有实现了 org.springframework.web.HttpRequestHandler 接口
的 Bean 通过此适配器进行适配、执行
的 Bean 通过此适配器进行适配、执行
RequestMappingHandlerAdapter
根据注解注释的bean根据该适配器执行
0 条评论
下一页