Spring相关

23.1.15 javaconfig


@Configuration:标记配置类
@ComponentScan(basePackage=“”):标记要扫描的包
@PropertySource():引入外部属性文件
@bean:标记普通bean
@Import(XXXConfiguration.class,…):可用于引入多个配置类
@Import(xxx.class):将类注册为bean
@Import(ImportSelector的实现类):可注册多个bean
@Import(ImportBeanDefinitionRrgistrar的实现类)

23.1.15 springAop


面向切面编程:在不修改原有的代码情况下,增强跟主要业务没有关系的 公共功能代码 到 之前写好方法的指定位置
Aop底层使用 代理 的设计模式
静态代理: 弊端:需要为每一个被代理的类创建一个代理类
动态代理:jdk动态代理 cglib动态代理 动态生成代理类
jdk动态代理:Proxy.newProxyInstance(classLoder,interfaces,handler)
classLoder参数:类加载器,通常为制定被代理类的接口的类加载器 接口.class.getClassLoader();
interfaces参数:类型,通常指定为被代理类的接口的类型
handler参数:委托处理的执行类 InvocationHandler handler=new 执行类(参数为被代理类的对象){}
ClassLoader classLoader = Player1.class.getClassLoader();
Class<?>[] interfaces=new Class[]{Player1.class};
InvocationHandler invocationHandler = new InvocationHandler(new PlayerImpl(“xu”));
Player1 player = (Player1) Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
player.start();
player.result();
缺点:代理类必须要有接口,而cglib不需要

23.1.23 springAop(cglib)
————————————————————
1.与业务逻辑没有直接关系的公共代码增强模块(before(),after(),afterException(),afterEnd())
springAop可以自由控制需要被增强的方法,形成连接点
aspectjweaver
spring-aspects
在增强模块的类上面标记(@Component,@Aspect)
切点表达式
aop:aspectsj-autoProxy</aop:aspectsj-autoProxy>:开启aop注解(xml方式)
@EnableAspectJAutoProxy:开启aop注解(javaConfig注解方式)

23.1.31 springAop详解
——————————————————
切点表达式:execution(访问修饰符? 返回值类型 包名.类名.方法名(参数类型(…表示任意参数)))
代表所有
例:execution(
com.jianhua.service.impl..(…)):表示访问修饰符省略,任意返回值,com.jianhua.service.impl下的任意类的任意参数类型的任意方法进行切入。
返回值类型:如果是JDK自带的类型可不写完整限定名,自定义的类型需要写完整限定名。
@Before(“@annotation(注解的完整限定名如:java.lang.override)”):可实现按注解切入
切点表达式的合并:&& || !(且或非)
JointPoint: jointPoint.getSignature.getName()获取方法名 jointPoint.getArgs()获取方法参数
基于xml的AOP实现:

Spring声明式事务:
加ORM入口依赖
JdbcTemplate
NamedParameterJdbcTemplate:具名参数处理.

23.2.1


事务的四大特性:原子性,一致性,隔离性,持久性
编程式事务:在代码中直接写事务处理代码
声明式事务:将事务管理代码从业务代码中分离处理,@Transactional,利用Aop设计思想
基于注解的声明式事务管理:
1.配置事务管理器bean(DataSourceTransactionManager),配置dataSouce属性
2.开启事务注解<tx:annotation-driven transaction-manager=“”/>
@Transactional:可以标记在类上(类中所有方法)
也可以标记在方法上(仅针对当前方法)
也可以类与方法都有:若都有,优先方法上的注解
建议应该写在业务逻辑类的方法上,控制粒度更细
@Transactional属性:
1.isolation:设置隔离级别,用来解决并发事务所产生的一些问题
脏读:@Transactional(isolation.READ_COMMIT)
不可重复读:解决:@Transactional(isolation.REAPTEABLE_READ)一次事务上行锁
幻读:解决:@Transactional(islation.isolation.SERILAZABLE)一次事务上表锁(性能低)如统计数据时
隔离级别:serilazable>repeat_read>read_commit
性能效率:serilazable<repeat_read<read_commit

2.事务的传播特性:一个事务被另一个事务方法调用,该事务方法如何进行?
3.超时属性(timeout):制定事务等待的最长时间

Integer integer = jdbcTemplate.queryForObject(“select count(*) from user”, Integer.class);
List query = jdbcTemplate.query(“select * from user where id=1”, new BeanPropertyRowMapper<>(User.class));

23.2.2spring源码
————————————————————————
如何看源码:
1.把spring项目源码直接下载下来,并解压文件。
2.打开gradle文件中的docs.gradle,注释掉dokka和asciidoctor两个配置项

springMVC:Controller,Model,View,分层,解耦
搭建:
1引入spring-webmvc依赖
2在web.xml中

关联springmvc.xml 1:启动web容器时就加载springmvc.xml /*和/都会拦截所有请求,/会拦截不包含.jsp的请求,而/*拦截范围更广 3.编写springmvc.xml(ioc):配置扫描包,配置控制器bean(也可用注解方式) 最后:使用idea开发时记得把jar导入到web-inf的lib中 核心关键:掌握Dispatcherservlet的设计 springmvc会自动匹配参数值

23.2.3 springboot
———————————————————————
配置类上加@SpringApplication注解
SpringApplication.run(配置类.class)获得spring容器: ConfigurableApplicationContext run = SpringApplication.run(javaConfiguration.class);
SpringApplication.run(配置类.class):执行启动spingBoot(web项目)
@Configuration作用与底层原理:定义bean 标记为配置类
springboot默认扫描的包是配置类所在的包()
@EnableAutoConfiguration,约定大于配置:
SpringBoot会提前配置一些bean,如果用户自己未配置该bean,则使用默认已经配置的,若用户已经配置,则使用用户自己的。
spring.factories:除了springboot默认扫描的包是(加了@SpringBootApplication)所在的包,springboot也会扫描META-INFO/spring.factories文件中的包进行自动配置。(相当于两条路扫描)
@SpringBootApplication注解(@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan三个注解的复合)
初始化器
条件注解:@ConditionOnBean(XX.class):在拿到XX.class的bean的前提下才能得到该类的bean
@ConditionOnMissingBean(XX.class):缺失XX.class的bean的前提。。。。
属性绑定:.properties文件的属性 创建一个类,给属性赋值,在类上面加@ConfigurationProperties注解,并声明为bean
.propertyies比.yml的优先级更高
@Profile:可用于使bean生效:在配置文件中加
profile:
active:profile名字

springboot源码篇:
1.首先生成springApplication的对象,再去执行这个对象的run方法

23.2.7 spring CloudAlibaba环境搭建
—————————————————————————————————
分布式服务调用:RestTemplate
微服务框架:SpringCloud Alibaba注意组件版本适配
远程服务调用时出现500时考虑是否使用负载均衡@LoadBalance

23.2.9 ribbon负载均衡
————————————————
目前主流:1.服务器负载均衡 2.客户端负载均衡
ribbon:客户端负载均衡(nacos默认的负载均衡器)
nginx:服务端的负载均衡
feign:进一步简化服务调用(netflix开发)使用springCloud 提供的openFeign,记得在配置类上面加@EnableFeignClient
sentinel:解决微服务中服务的可用性问题
sentinel熔断降级:通常应用于弱依赖中
seata:事务都是基于connection的。基于一个数据库连接的,分布式事务如何实现呢?
seata提供开源的分布式事务解决方案
分布式事务解决方案:seata,消息队列(分两个步骤完成)
步骤一:预处理,又中间协调者事务管理器向参与者发送请求检测是否可以满足事务提交操作,参与者准备回滚操作和正常提交操作数据
预处理成功后,参与者向事务管理器应答yes。此时事务管理器通知所有的参与者提交事务
步骤二:此时事务管理器向所有的参与者提交事务请求,参与者返回应答
分布式事务中无法保证100%的事务成功
gateway(网关):流量控制,权限验证,监控,路由转发 使用Spring Cloud Gateway
路由id:路由唯一标识
断言:用于路由规则匹配
过滤器
skywalking:链路追踪、快速定位问题,性能检测工具
非侵入性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值