spring 核心
2021-05-26 10:03:29 0 举报
AI智能生成
spring 核心概念
作者其他创作
大纲/内容
核心特性
依赖注入(DI)
对象的依赖关系由系统在创建对象的时候设定,对象无需自行创建或者管理他们的依赖关系。
有助于对象直接的解耦
面向切面编程(AOP)
实现横切关注点与它们所影响的对象之间解耦
容器
应用中的对象生存于spring容器,容器负责创建对象,装配它们,并管理它们的生命周期
分类
bean工厂
由BeanFactory定义,是最简单的容器,提供最基本的DI支持。
应用上下文
ApplicationContext接口定义,基于BeanFactory构建,提供框架及服务
应用上下文
AnnotationConfigApplicationContext
从一个或多个基于java的配置类中加载spring上下文
AnnontationConfigWebApplicaionContext
从一个或多个基于java的配置类中加载spring web上下文
ClassPathXmlApplicationContext
从类路径下的一个或多个xml配置文件中加载上下文定义,吧应用上下文的定义文件作为类资源
FileSystemXmlApplicationContext
从文件系统下的一个或多个xml配置文件中加载上下文定义
XmlWebApplicationContext
从web应用下的一个或多个xml配置文件中加载上下文定义
bean生命周期
spring对bean实例化
spring将值和bean的引用注入到bean对应的属性中
bean实现了BeanNameAware接口
将bean的ID传递给setBeanName方法
bean实现了BeanFactoryAware接口
将BeanFactory容器传入setBeanFactory方法
bean实现了ApplicationContextAware接口
将bean上下文传入
bean实现了BeanPostProcessor接口
调用PostProcessBeforeInitialization方法
调用PostProcessAfterInitialization方法
bean实现了InitializingBean接口
调用afterPropertiesSet方法
DI
xml配置
java配置
@Configuration
作用与类上,表明该类为配置类
@Bean
作用与方法上,告诉spring该方法会返回一个对象,该对象要注册到上下文中
默认Bean的id与该注解所在方法名一致,可以通过name属性重新命名
spring会拦截对拥有@Bean的方法调用,确保直接返回该方法所创建的Bean,而不是每次都进行实际调用
自动装配
组件扫描
spring自动发现应用上下文中所创建的bean
@ComponentScan
启用组件扫描
默认扫描与该注解同级的包(子包)
可设置组件扫描包、basePackages属性、basePackagesClasses等
@Component
作用与类上,表明该类会作为组件类,并告知spring要为这个类创建bean
bean名称默认为类名第一个字母变为小写
@Named
与@Component同义,java注解
自动装配
spring自动满足bean之间的依赖
@Autowired
作用在构造器
作用在Setter方法上
作用在类的任何方法上,与在Setter方法上相同
@Inject
与@Autowired相同
java注解
高级
环境
@Profile
作用于类或方法上,表明bean生效的环境
激活profile
spring.profiles.active
优先级高
spring.profiles.default
优先级低
没有设置,则不激活包含profile的bean
条件化bean
@Conditional(xxx.class)
作用于带有@Bean注解的方法上
如果xxx.class matches 方法返回为true,则创建bean
xxx.class 实现 Condition接口,重写matches方法
matches入参
ConditionContext
getRegistry 方法返回BeanDefinitionRegistry 可以检查bean定义
getBeanFactory 返回ConfigurableListableBeanFactory 可以检查bean是否存在,及bean的属性
getEnvironment 返回Environment检查环境变量及值
getResourceLoader 返回ResourceLoader检查所加载的资源
getClassLoader 返回ClassLoader加载并检查类是否存在
AnnotatedTypeMetadata
检查@Bean方法上还有其它注解及其属性
处理装配歧义
标示首选bean
@Primary
作用于声明的bean上,自动注入时优先使用
限定自动装配的bean
@Qualifier("限定符")
注入时使用(@Autowired)
使用(如果没有设置,则默认为bean的小驼峰命名)
声明bean时使用,为该bean设置特定限定符(@Component)
设置
bean作用域
@Scope
单例(默认)@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
整个应用中只创建一个bean的实例
原型 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
每次注入或者通过spring上下文获取时都会创建一个新的实例
web
会话@Scope(WebApplicationContext.SCOPE_SESSION)
在web应用中,为每个会话创建一个bean实例
请求@Scope(WebApplicationContext.SCOPE_REQUEST)
在web应用中,为每个请求创建一个bean实例
值注入
Environment
获取配置文件的值
属性占位符
@Value("${...}")
注入属性
需配置PropertySourcesPlaceholderConfigurer (springboot 已自动配置)
SpEL(Spring Expression Language)
spring语言表达式
#{...}
字面值
#{1}、#{"aaa"}、#{false}
引用bean,属性和方法
#{beanId}、#{beanId.属性}
#{beanid.方法}、#{beanid.方法?.方法}
?. 前面的为空,则返回空,不调用后面的
调用静态类
T(java.lang.Math)
返回class
T(java.lang.Math).random()
运算符
算术/比较/逻辑/条件/正则
操作集合/数组
AOP
某些功能需要用到应用程序的多个地方,但我们又不想在某个点都明确调用他们
日志,安全,事务管理,缓存等
概念
切面(Aspect)
通知(advice)
什么时候用、做什么事情
前置通知(Before)
在目标方法被调用之前调用通知功能
后置通知(After)
在目标方法完成之后调用通知,此时不会关心方法的输出是什么
返回通知(After-returning)
在目标方法成功执行之后调用通知
异常通知(After-throwing)
在目标方法抛出异常后调用通知
环绕通知(Around)
包裹了目标方法,在目标方法调用之前和调用之后执行通知
切点(pointcut)
定义了在什么地方使用通知,会匹配通知所要织入的一个或多个连接点
连接点(joinpoint)
应用执行过程中能够插入切面的一个点(应用一步步执行的过程)
可以是调用方法时,抛出异常时,修改字段时等
引入(Introduction)
在不修改现有类的情况下,添加新的方法或属性
织入(Weaving)
吧切面应用到目标对象,并创建新的代理对象的过程
织入的时机
编译期
切面在目标类编译时被织入
AspectJ织入编译器
类加载期
切面在目标类加载到JVM时被织入,在目标类被引入应用之前增强该类的字节码
AspectJ5加载时织入
运行期
创建代理对象
spring aop
spring基于代理完成aop,在运行时通知对象
spring只支持方法级别的连接点
aspect支持构造器及属性级别的连接点
切点表达式语言
执行匹配
execution()
用于配置是连接点的执行方法
限制匹配
arg()
限制连接点匹配参数为指定类型的执行方法
@args()
限制连接点匹配参数为由指定注释标注的执行方法
this()
限制连接点匹配aop代理的bean引用为指定类型的类
target
限制连接点匹配目标对象为指定类型的类
@target()
限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注释
within()
限制连接点匹配指定的类型
@within()
限制连接点匹配指定注解所标注的类型(当使用spring aop时,方法定义在由指定的注解所标注的类里)
@annontation
限制匹配带有指定注解的连接点
例子
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)
execution(public * com.spring.service.BusinessObject.businessService(java.lang.String,..))
execution(* com.spring.service.BusinessObject.*())
execution(* com.spring.service.Business*.*())
execution(* com.spring.service..*.businessService())
execution(* com.spring.service.BusinessObject.businessService(java.lang.String,..))
args
args(param-pattern)
args(java.lang.String)
args(java.lang.String,..,java.lang.Integer)
@args
@args(annotation-type)
@args(com.spring.annotation.FruitAspect)
this
只能指定类或者接口
表示匹配调用当前切点表达式所指代对象方法的对象
target
只能指定类或者接口
表示匹配切点表达式指定类型的对象
within
within(declaring-type-pattern)
within(com.spring.service.BusinessObject)
within(com.spring.service.*)
within(com.spring.service..*)
@within
@within表示匹配带有指定注解的类
@within(annotation-type)
@within(com.spring.annotation.BusinessAspect)
@Around("@within(com.business.annotation.FruitAspect)")
@annotation
使用@annotation指定注解标注的方法将会被环绕(与@within的相似)
@annotation(annotation-type)
@Around("@annotation(com.business.annotation.FruitAspect)")
bean()
允许我们在切点表达式中使用bean的id来标识bean
使用beandi或bean名称作为参数来限制切点只能匹配特定的bean
execution(。。。)and bean('bean名称')
@DeclareParents
为指定的目标类引入新的属性和方法
@DeclareParents(value = "TargetType", defaultImpl = WeaverType.class)
private WeaverInterface attribute;
private WeaverInterface attribute;
perthis和pertarget
@Aspect("perthis(this(com.spring.service.Apple))")
注解
@EnableAspectJAutoProxy
启用自动代理功能
springboot已经开启
@Aspect
作用与类上,表明该类不仅仅是一个pojo,还是一个切面
@Pointcut
作用与切面类的方法上,定义可重用的切点
值为一个切点表达式,作用的方法的方法体为空
声明通知方法
前置通知(@Before)
在目标方法被调用之前调用通知功能
后置通知(@After)
在目标方法完成之后调用通知,此时不会关心方法的输出是什么
返回通知(@After-returning)
在目标方法成功执行之后调用通知
异常通知(@After-throwing)
在目标方法抛出异常后调用通知
环绕通知(@Around)
包裹了目标方法,在目标方法调用之前和调用之后执行通知
入参为ProceedingJoinPoint pjp
其它作用
阻塞对被通知方法的访问,不调用proceed()方法
重试逻辑,多次调用,如果抛出异常,多次调用proceed()方法
处理通知中的参数
0 条评论
下一页