Spring_整理


核心:ioc、aop、spel、mvc结构及web请求过程、http相关、异步请求/异步调用。

IOC

ioc基于xml、javaConfig配置bean,BeanFactory注册bean,Environment环境参数。
ApplicationContext包含BeanFactory、Environment。
三级缓存(实例化、属性注入、初始化),解决循环依赖。无参构造器实例化类,可避免循环依赖问题;但无法验证注入属性。

构建bean过程

  1. 环境准备(加载配置元数据、加载参数(commandArgs、local、system、env))
  2. bean配置元数据处理(BeanFactoryPostProcessor)、bean配置元数据占位符解析
  3. 注册bean(实例化、注入属性、初始化)
  4. bean处理(BeanPostProcessor,初始化前后处理),aop通过BeanPostProcessor实现。

环境Environment

A profile is a named, logical group of bean definitions to be registered with the container only if the given profile is active.
Environment,继承PropertyResolver(属性占位符解析),主要包括配置元数据profiles(Environment)、属性properties(PropertyResolver,cmd、配置文件、system、env)。
spring mvc实现类:StandardServletEnvironment。
1,Environment的存储容器
PropertySource;name-k/v结构,name为唯一标记。常用实现类:MapPropertySource、PropertiesPropertySource。
PropertySources;PropertySource集合,用作存储容器
2,资源加载
PropertySourceLoader;资源加载接口。实现类:PropertiesPropertySourceLoader、YamlPropertySourceLoader。
3,占位符解析
PropertyPlaceholderHelper;字符串操作,递归解析
get时解析,每次get都解析。
4,属性获取
PropertySourcesPropertyResolver;封装PropertySources,遍历查找获取值。

BeanFactory

读java bean配置元数据;构建BeanDefinition,存入BeanFactory。
BeanDefinition常用类:BeanDefinition、AnnotatedBeanDefinition、ScannedBeanDefinition
DefaultListableBeanFactory注入bean:

  1. registerSingleton()/registerBeanDefinition();
  2. BeanDefinitionBuilder;构建BeanDefinition

BeanFactoryPostProcessor

处理bean configuration metadata;实现类:PropertyPlaceholderConfigurer、PropertyOverrideConfigurer
配置文件加密?
jasypt加密:https://www.jianshu.com/p/b047ed4a8dfa;封装PropertySource

Bean相关

BeanDefinition属性:

  • class;类型
  • name;名称。默认类名/工厂方法名,或注解指定。
  • scope;范围。@Scope,值:singleton、prototype、request、session、application
  • constructor args、properties;需要注入的属性,构造器注入、属性注入。
  • autowiring mode;装配模式;值:no、byName、byType、constructor。
  • lazy init mode;懒加载;@Lazy
  • init/destroy method;初始化/销毁回调方法。@PostConstruct、@PreDestroy;先于接口执行。

bean装配顺序

  • @DependsOn、@AutoConfigureAfter/@AutoConfigureBefore、@AutoConfigureOrder;装配顺序
  • @Conditional族;装配条件

BeanPostProcessor、InitializingBean、DisposableBean
bean处理。@PostConstruct、@PreDestroy;先于接口执行。

AOP

散布于应用中多处的功能称为横切关注点。

什么是面向切面编程

术语:通知advice、连接点join point、切点pointcut、切面aspect、引入introduction、织入weaving。
Spring在运行时通知对象,只支持方法连接点(不支持字段、构造器);在加载bean时创建被代理的对象。

使用注解创建切面

  1. 开启AOP;@EnableAspectJAutoProxy+@Configuration。默认使用jdk,无接口时使用cglib。
  2. 声明切面;@Aspect+@Component
  3. 声明切点;@PointCut
  4. 连接点处理;@Before、@After、@AfterThrowing、@AfterReturning、@Around

通过注解引入新功能,被增强类不可为final类:

@DeclareParents( value="bonc.Performance+" //需要增加功能的类,+子类;*全部
defaultImpl = DefaultEncoreable.class ) //新增功能实现类
public Encoreable encoreable;  //新增功能接口

切点表达式

https://blog.csdn.net/LuQiaoYa/article/details/88233846#25_args_37
通配符:

  • .一层;
  • ..多层或任意参数;
  • *任意类名、方法名、单一参数、名称中任意字符

表达式

  • excution表达式格式:[modifier] reType package.class.method(argTypes) [throws]
  • excution(),匹配连接点;execution(* bonc.DataSourceConfig.getProperties(..))
  • * bonc.*.*(..),bonc包下所有类所有方法,形参列表为任意;返回类型任意,
  • int bonc..*.*(*),bonc包及其子包下所有类所有方法,形参列表只有一个参数;返回类型为int
  • public * bonc.*Controller.set*(..); 修饰符为public,类名以Controller结尾,方法名以set开始

限定

  • args()、@args();限定连接点参数类型、注解,args(…,java.lang.String);
  • args()、@args();也可用于参数传递。
  • this();限定aop代理对象的类型
  • target()、@target();限定连接点所在实例的类型、注解
  • within()、@within();限定连接点所在实例的类型、注解;只能为指定类型,不可为子类(前两者可为子类、实现类);@within()声明方法的类必须有指定注解。
  • @annotation;限定连接点注解

Spring指示器:bean(),筛选bean id。
运算符:and、or、not、&&(xml中使用and)、|、!;
例:excution(* bonc.DataSourceConfig.getProperties(…)) && within(bonc.*)

advice参数

环绕通知@Around,方法必须带参ProceedingJoinPoint jp;jp.proceed()执行被代理方法。其他通知只能带JoinPoint类型参数。@Around通知,必须有返回值。
传递被代理方法参数:

@Pointcut("execution(* bonc.CompactDisc.playTrack(int)) && args(trackNumber)")//切点
public void trackPlayed(trackNumber){}
@Before("trackPlayed(trackNumber)")//引入本类pointcut时,直接写方法名
public void countTrack(int trackNumber){}  //通过形参trackNumber接受参数

或者通过ProceedingJoinPoint/JoinPoint#getArgs()获取参数。

在XML中声明切面

使用aop命名空间,<aop: *>:

  • <aop: config>;顶层AOP配置,aop根标签
  • <aop: aspect>、<aop: advisor>;定义切面,advisor一般用于事务
  • <aop: before/ after/ after-returning/ after-throwing/ around>
  • <aop: pointcut>、<aop: aspectj-autoproxy>、<aop: declare-parents>

扩展接口

ApplicationContextAware
ResourceLoaderAware;资源加载,ResourceUtils获取file、转换url。
ApplicationEventPublisherAware;事件发布,可用ApplicationContext。@EventListener监听器
MessageSourceAware;国际化

SpEL

规则

字面量:1、true、“hi” ;
实例引用:person、person.name、person.getState()
静态引用:T(java.lang.Math).PI、T(Math).random()
运算符:

  • 算术运算:+、-、*、/、%、(方次,T(Math).PI2
  • 比较运算:>、<、==、>=、<=、gt、lt、eq、ge、le
  • 逻辑运算:and、or、not、|
  • 条件运算:?:;用于判定null时可简写,person.name?:‘ltl’
  • 正则表达式:matches;person.name matches ‘\w+’
  • 集合计算:
  1. [ num];引用元素
  2. .?[expr ];过滤元素,保留true元素
  3. .^[expr]、.$[expr];第一个/最后一个匹配
  4. .![ ];属性投影,类似Stream#map()

@Value注解使用

@Value中"#{expr}",spel运算;可嵌套占位符"${expr}"。
参数直接引用。

API使用

包:org.springframework.expression
核心类:ExpressionParser、Expression/EvaluationContext;
Expression#getValue(),重载,获取值;可传入Object作环境变量
格式:“expr”;“1==1”
参数:根对象rootObject属性直接使用(要求属性或getter为public),variables属性加#前缀

ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'1' == '12'");		
Object val=exp.getValue();
System.out.println("result:"+val);

WebServlet

web请求:filter、handlerMapping、servlet/handlerExecutionChain(handlerAdapter+interceptor)、databinder(converter+validation)、resource/controller、viewResolver/messageConverter
http相关:cors、csrf、method、header
工具类:RequestContextUtils、RequestContextHolder

HandlerMapping

声明:@Controller、@RestController
mvc组件:Servlet,WebMvcConfigurationSupport#addViewControllers()/addResourceHandlers()
url匹配
映射:@RequestMapping、@GetMapping、@PostMapping等;约束:value、accepts/produces、headers/parameters。
url通配符:?一个字符,*一层中的任意字符,**任意层;${}占位符
media type约束:consumes–Content-Type,produces–Accept;MediaType常量,支持!运算符
header、parameter约束:key/!key,有/没有key参数;key=value,key参数值必须为value

数据绑定

参数匹配
@PathVariable、@RequestParam、@RequestBody、@RequestHeader、@CookieValue、@ModelAttribute(标记方法参数)、@SessionAttribute、@RequestAttribute
默认无对应参数时报错。
RedirectAttributes d;//重定向属性集
ModelAndView d1;
BeanWrapper(Type Conversion)
bean构建,实现类:BeanWrapperImpl。
PropertyEditor;String-Object转换。实现类指定类型转换。自定义实现,继承PropertyEditorSupport。PropertyEditorManager,管理。
ConversionService,类型转换,无时使用PropertyEditor。
Converter;S-T转换。ConverterFactory,管理。
Formatter,格式化类型转换。
validation
1,Validator手动验证,结合AOP使用
Validator,ValidationUtils,BeanPropertyBindingResult
2,注解验证
@Valid;标记验证属性,支持嵌套;@Validated标记类(构建bean时校验)、方法,支持分组。
校验只在spring自动构建的对象实例有效;手动调用未扫描注解,无验证逻辑。
BindingResult;返回验证结果,每个属性均需单独标记验证属性和返回结果。
验证注解:

  • @Max、@Min;
  • @DecimalMax、@DecimalMin;
  • @Past、@Future;
  • @Null、@NotNull;
  • @AssertTrue、@AssertFalse;
  • @Pattern;正则
  • @Digits;小数
  • @Size;长度
  • @Email;

自定义注解:

  • 创建注解,@Constrains关联验证类。参考@Min
  • 实现ConstrainValidator,验证

执行结果

直接返回
response返回,@RestController返回。
ResponseBodyAdvice;注册bean,@RestController返回结果封装。
Model
@Controller返回,视图路径、重定向、model;
重定向,“redirect: /a/{b}”;{var}模板占位符。
跳转,“forward:”。
model,默认视图路径;@ModelAttribute;

  • 标记@RequestMapping方法时,声明返回值为model属性;
  • 标记普通方法,为所有@RequestMapping方法初始化Model;类似@InitBinder
  • 标记@RequestMapping方法参数,绑定Model属性。
    Exception
    @ControllerAdvice/@RestControllerAdvice,@ExceptionHandler;标记错误处理
    @ResponseStatus,错误码,HttpStatus常量。
    HTTP协议
    cors、cache等

其他

uri构建
URI uri=UriComponentsBuilder.fromUriString("").build(args);
异步请求
controller返回Callable、DefferedResult。
Callable由线程池执行,DefferedResult由其他线程赋值。获取之后通过DispatcherServlet返回。
WebMvcConfigurationSupport#configureAsyncSupport();配置线程池,拦截器等
异步调用
@EnableAsync、@Async;处理非请求返回相关逻辑,如日志、统计等
@Async可指定执行线程池。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值