目录
常用端口:
3306:Mysql 默认端口
9066:Mysql 管理端口
8080:Tomcat 轻量级服务器
8080:Jetty 比Tomcat还轻量级的服务器
6379:Redis NoSql数据库,缓存
80:Nginx 负载均衡反向代理
2181:Zookeeper 注册中心
5672 (java链接) 15672(管理插件) 25672(集群间通信):RabbitMQ
9527:gateway 网关
9001:Eureka 注册中心
9411:zipkin (Sleuth链路追踪) 负责数据展示
8848:Nacos 注册与配置中心 (2.0需要 9848、9849)
8080:Sentinel 熔断与限流
8719:应用与Sentinel控制台交互的端口
27017 :MongoDB
9200 9300:ElasticSearch
5601:kibana
8066:myCat
9000:minio 服务端口
9001:minio 客户端端口(浏览器)
5044:logstash 日志收集
9876:rocketMq | nameserver
@FunctionalInterface:函数式接口
总结
一、Spring:IoC、AOP
- spring.xml 标签配置:
<!--指定注解扫描基准路径 会自动扫描base-package及其子包下的注解-->
<context:component-scan base-package="com.atguigu"></context:component-scan>
<!-- 开启基于注解的AOP功能 -->
<aop:aspectj-autoproxy/>
<!-- 启动AOP自动代理
proxy-target-class:底层采用什么动态代理技术
false: 默认 有接口使用JDK动态代理,没有接口使用CGLIB
true:不管是否有接口,都使用CGLIB-->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
- 创建Bean的注解:
@Component 标记该类,spring配置文件中base-package 扫描后会创建对象并装配到IoC容器
@Controller 标记控制器组件(控制层),MVC中进行了相关判断,不能换
@Service 标记业务逻辑组件(业务逻辑层)
@Repository 标记持久化层组件(持久化、数据访问层)
@Configuration 说明这是一个配置类,要达到全注解开发还需要使用 @ComponentScan
以上注解本质上相同,只是在@Component 基础上换了名字。提高了代码的可读性。
- 注入Bean的注解:
@Value 给基本类型的参数注入赋值,可以用在属性、set方法上,可以使用${} SpringEL表达式
前提:当前类需要在Spring容器中!
@Autowired 给引用类型参数注入赋值, 可以用在属性、set、构造方法上。(先byType再byName)
@Qualifier 根据指定的Bean的name进行匹配注入;不会单独使用,而是和@Autowired配合使用
(1)在使用@Autowire自动注入的时候,加上@Qualifier(“test”)可以指定注入哪个对象;
(2)可以作为筛选的限定符,我们在做自定义注解时可以在其定义上增加@Qualifier
@Resource 依赖注入,JDK提供,通用。 (先ByName再ByType)
- 全注解开发:
@ComponentScan() 组件扫描,根据定义的扫描路径,把符合扫描规则的类装配到IoC容器中。
- 整合Junit4 测试框架:
@RunWith(SpringJUnit4ClassRunner.class) 指定Spring为Junit提供的运行器
@ContextConfiguration 指定Spring配置文件的位置
单个文件
@ContextConfiguration(locations = {"classpath:spring.xml"})
@ContextConfiguration("classpath:spring.xml") (locations{}也可省略)
@ContextConfiguration(classes = SimpleConfiguration.class)
多个文件
@ContextConfiguration(locations = {"classpath:spring.xml","classpath:spring2.xml"})
- Junit5测试框架
@SpringJUnitConfig (locations = "classpath:spring.xml") 复合注解,底层包含 ExtendWith
@ExtendWith(SpringExtension.class) Junit4为RunWith,Junit5为ExtendWith
@ContextConfiguration(locations = "classpath:spring.xml")
@SpringJUnitConfig(locations = "classpath:springmvc.xml")
//@ExtendWith(SpringExtension.class)
//@ContextConfiguration(locations = "classpath:springmvc.xml")
- AOP 面向切面编程:声明切面类与通知方法
@Aspect 表示这个类是一个切面类
@Before(value) 前置通知方法
@AfterReturning(value) 返回通知方法
@AfterThrowing(value) 异常通知方法
@After(value) 后置通知方法
@Around(value):环绕通知方法 对应整个try...catch...finally结构,包括四种通知的所有功能。
需要在对应方法声明 ProceedingJoinPoint 类型的形参,proceed() 调用切入点的方法。
value()属性:指定切入点表达式,由切入点表达式控制当前通知方法要作用在哪一个目标方法上
@Aspect//这是一个切面类
public class LogAspect {
//前置通知: 指定的方法在执行之前要做什么 (切入点,表达式)
@Before("execution(* com.atguigu.service.impl.CalculatorImpl.*(..))")
public void beforeLog(){
System.out.println("[日志] xxx 方法开始执行,参数是:");
}
- 创建IOC容器对象
BeanFactory IoC容器的基本实现类
ApplicationContext BeanFactory 的子接口,更多功能。
ClassPathXmlApplicationContext 根据XML配置文件创建IoC容器对象
// ClassPathXmlApplicationContext根据XML配置文件创建IOC容器对象
private ApplicationContext iocContainer = new ClassPathXmlApplicationContext("applicationContext.xml");
AnnotationConfigApplicationContext 根据XML配置类创建IoC容器对象 (全注解开发)
// AnnotationConfigApplicationContext根据配置类创建IOC容器对象
private ApplicationContext iocContainerAnnotation = new AnnotationConfigApplicationContext(MyConfiguration.class);
WebApplicationContext Web项目
- 切入点表达式语法
execution (* com.atguigu...method(int i))
- 重用切入点
@Pointcut ("execution(切入点表达式)")
需要使用在一个方法上,使用时直接传入该方法即可
- 获取连接点信息
获取方法信息:通知方法加入形参JoinPoint joinPoint,方法内调用 getSignature()
获取方法返回值:@AfterReturning中通过 returning属性设置名称,通知方法中声明对应名称Object类型 形参
获取方法抛出异常:@AfterThrowing中声明 throwing 属性设定名称,通知方法中声明对应名称声明 Exception类型 形参
环绕通知:声明 ProceedingJoinPoint 类型的形参,里面包含各种方法,可通过proceed() 调用切入点的方法。
- 多个切面优先级
@Order(int i) 数值越小越早执行
- 声明式事物
@Transactional:对当前类所有方法、或当前方法应用事物
相关属性:
只读:readOnly = true
超时:timeout = ?
回滚异常类型:rollbackFor = Exception.class
事物隔离级别:Isolation
事物传播行为:propagation
- 配置事物管理器、注解驱动:
<!--配置事物管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置事物的注解驱动
transaction-manager: 指定事物管理器,如果事物名称是transactionManager,可以省略
proxy-target-class="true: 不管是否有接口,底层都使用CGLIB
false: 默认 有接口使用JDK动态代理,没有使用CGLIB
-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
//注意:要选tx命名空间的
二、SpringMVC
- web.xml 配置总控制器
<!--配置总控制器:springMVC中唯一的Servlet DispatcherServlet-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--读取配置文件-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--总控制器启动时机-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--Servlet映射路径-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--重点:总控制器访问路径-->
<!--<url-pattern>*.action</url-pattern>-->
<!--可用于 restful风格-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--过滤器: 解决post中文乱码问题-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<!--强制请求编码(可选)-->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<!--强制响应编码(可选)-->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!--过滤器映射-->
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern><!--过滤路径-->
</filter-mapping>
- springmvc.xml配置 (SpringMVC配置文件)
<!-- 自动扫描包 目前@Controller注解-->
<context:component-scan base-package="com.atguigu.controller"></context:component-scan>
<!--(检查员) 总控制器的路径如果是/,会导致静态资源无法访问,配置该选项可以访问 (但是动态又访问不了了)-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--启用mvc的注解驱动,这是标配 (使动态资源也可以访问)-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--·视图控制器,进行页面跳转,就不用专门写方法了-->
<mvc:view-controller path="/hello/toLogin" view-name="login"></mvc:view-controller>
<!-- 配置Thymeleaf视图解析器-->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>
- 日志
@Slf4j 生成日志记录器
底层自动生成
private Logger logger = LoggerFactory.getLogger(HelloController.class)
- 接收请求
@RequestMapping() 映射请求路径,接收所有请求,声明在类上表示所有方法的请求前缀
@GetMapping() 只接收Get请求
@PostMapping() 只接收POST请求
@PutMapping ("/{empId}") 处理put请求
@DeleteMapping ("/{empId}") 处理delete请求
- 获取请求参数
@RequestParam() 接收请求路径问号后的参数,参数名和形参名一致可以省略
required = false 请求参数必须,有则传入,没有不报错。默认为 true
defaultValue = "missing" 请求参数默认值
@RequestHeader ("Referer") 获取请求消息头中的具体数据。
@RequestBody 获取请求体
@CookieValue(value = "JSESSIONID") 获取当前请求中的 Cookie 数据,注意:参数还需加上 HttpSession。cookie数据存放在客户的浏览器上,session数据放在服务器,session的id存储在cookie中。
@PathVariable("empId") 映射 URL 绑定的占位符('/'),绑定到xxx传参中。资源环境变量(资源所在的位置)。一般与 @GetMapping(/abc/{xxx}) 一起使用。
- 页面跳转控制
@RequestMapping() 映射请求路径,接收
return,默认为请求转发。
转发、重定向路径前添加 forward:、redirect: 后,路径不会再拼接前后缀(不会被thymeleaf解析)
//请求转发
@RequestMapping("/dispatcher2")
public String dispatcher2(){
return "forward:/WEB-INF/templates/result.html";
}
//重定向
@RequestMapping("/redirect1")
public String redirect1(){
return "redirect:/WEB-INF/templates/result.html";
- Restful风格
@PathVariable("empId") 映射 URL 绑定的占位符('/'),绑定到xxx传参中。资源环境变量(资源所在的位置)。一般与 @GetMapping(/abc/{xxx}) 一起使用。
@GetMapping ("/{empId}") 处理get请求
@PostMapping ("/{empId}") 处理post请求
@PutMapping ("/{empId}") 处理put请求
@DeleteMapping ("/{empId}") 处理delete请求
传统的方式:@RequestMapping(value = “/get/{id}”, method = RequestMethod.GET)
- lombok
@Data 集成了@Getter和@Setter、@ToString、@EqualsAndHashCode
@RequiredArgsConstructor这几个注解与一身,是一个非常强大的注解,这个注解更可以简化注解的代码量
@NoArgsConstructor 在JavaBean中使用,注解会生成对应的无参构造方法
@AllArgsConstructor 在JavaBean中使用,注解会生成对应的有参构造方法
- Ajax
@ResponseBody 响应体。将方法的返回值以特定的格式写入到response的body区域,进而将数据返回给客户端,不再进行请求转发页面跳转。异步获取数据时使用。
类上的 @ResponseBody 注解可以和 @Controller 注解合并为 @RestController 注解。所以使用了 @RestController 注解就相当于给类中的每个方法都加了 @ResponseBody 注解。
- 异常映射
@ExceptionHandler 声明为异常处理类
- Dubbo 框架
@Service 发布项目到订阅中心
@Reference 调用远程服务: RPC,从注册中心订阅服务 (Autowired只能注入本项目的bean,Reference可以远程调用。dubbo底层tcp网络编程实现)
三、SpringBook
@SpringBootApplication 声明当前项目是一个SpringBoot项目 在主程序类声明
主程序类其实也是配置类,@SpringBootApplication底层有@SpringBootConfiguration
参数:exclude = DataSourceAutoConfiguration.class)//取消数据源 排除自动配置类
@SpringBootConfiguration 声明一个配置类
@Bean 主要用在@Configuration注解的类里,等同于在xml中配置
@ConfigurationProperties(prefix = "xxx") 可以将一些配置属性批量注入到bean对象(需要提供get set方法)
@Value("${spring.jdbc.datasource.url}") 给基本属性赋值 (无需getset方法) 可以使用SpringEL表达式
@ConfigurationProperties(prefix = "spring.jdbc.datasource") 设置相关类生效,即创建对象初始化。
@EnableConfigurationProperties(value = {DataSourceProperties.class}) 启用属性配置类,带@ConfigurationProperties属性的类要先生效 (条件化配置)
@EnableTransactionManagement 开启声明式事务
- Spring Data JPA (底层是hibernate)
@Entity //声明实体类
@Table (name = "t_user") //推荐使用JPA提供的注解,声明表
@Id //当前属性为主键
@GeneratedValue (strategy = GenerationType.IDENTITY) //设置主键生成方式: auto_increment 由数据库生成
@Column (name = "id",unique = false) //字段名,长度,不为空 字段的约束
@ConditionalOnExpression
@ConditionalOnExpression(“'true”) 当括号中的内容为true时 ,使用该注解的类被实例化
它可以和@Service、@Component、@Controller、@Repository 、@Bean 、@Configuration 等注解一起使用。可以通过SPEL 表达式、读取配置文件属性来让IOC容器选择性的扫描加入指定的某个Bean。而不是将所有实现类Bean都加入到IOC。简单来说就是按需加载,而不是全部加载。
@Slf4j
@ConditionalOnExpression("'${PROVINCE_SERVICE}'.equals('jiangxi')")
@Service
public class JxLocationServiceImpl implements ZjLocationService {
...
}
- JUint 测试
@RunWith (SpringRunner.class) 指定Junit核心运行类
@SpringBootTest 指定这是一个Spring Boot的测试类, 运行时会自动加载Spring Boot运行环境
约定大于配置:测试类为主程序的子包,配置自动生效,否则通过可以通过classes属性指定
//@ContextConfiguration (locations = "classpath:/spring/spring-*/xml") 普通xml文件的方式
- 健康监控 服务端 SpringBoot Admin组件 健康监控图形化界面
@EnableAdminServer 开启管理服务
- SpringBoot Admin组件
@MapperScan (basePackages = "com.atguigu.dao") 通用Mapper,编译之后会生成相应的接口实现类
@MapperScan和@ComponentScan 区别
@ComponentScan是组件扫描注解,用来扫描@Controller @Service @Repository等,封装到spring容器中
@MapperScan 是扫描mapper类的注解
@MapperScan和@ComponentScan一起使用,可能会导致mapper扫描不到
需要改为@MapperScan(basePackages = {})的形式。
或者只使用@MapperScan()去扫描mapper包,让项目启动自己去扫描swagger配置类的包
- Rabbit
@RabbitListener(queues = {“”}) 监听的队列
@QueueBinding 定义一个队列、它要绑定到的交换机和一个可选的绑定键
@Queue(value=) 指定绑定的队列
@Exchange(value=) 指定绑定的交换机
//接收消息
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = MqConst.QUEUE_MSM_ITEM, durable = "true"),
exchange = @Exchange(value = MqConst.EXCHANGE_DIRECT_MSM),
key = {MqConst.ROUTING_MSM_ITEM}
))
public void send(MsmVo msmVo, Message message, Channel channel) {
msmService.send(msmVo);
}
/**
* 发送消息
* @param exchange 交换机
* @param routingKey 路由键
* @param message 消息
*/
public boolean sendMessage(String exchange, String routingKey, Object message) {
rabbitTemplate.convertAndSend(exchange, routingKey, message);
return true;
}
- Rocket
@RocketMQMessageListener(consumerGroup = "CONSUMER_GPS_LOCATION_GROUP"
, topic = "topic-iot-gps-location"
, consumeMode = ConsumeMode.CONCURRENTLY
, enableMsgTrace = false)
监听器,需要实现 RocketMQListener<MessageExt>
四、SpringCloud
- Eureka 注册中心
@EnableEurekaServer 声明当前应用为Eureka服务端 声明在主启动类
@EnableEurekaClient 声明当前应用80为Eureka(7001)的客户端 声明在主启动类
- Ribbon 负载均衡
@LoadBalanced RestTemplate + Ribbon 实现远程调用和负载均衡(轮询) 声明在配置类RestEmplate (Feign、Gateway 底层集成Ribbon,无需声明)
@RibbonClient (name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class) 自定义负载均衡规律 用在主启动类 传入自定义配置类
- OpenFeign 服务接口远程调用
@EnableFeignClients 启用OpenFeign组件远程调用功能 用在主启动类
@FeignClient("CLOUD-PAYMENT-SERVICE") 指定调用微服务的名称 用在服务接口上
- hystrix 降级熔断限流
@EnableCircuitBreaker 开启降级熔断功能 声明在主启动类
@EnableHystrix 底层组合代替了@EnableCircuitBreaker),消费者feign远程调用 声明在主启动类
@HystrixCommand (fallbackMethod = "payment_TimeoutHandler",commandProperties = {
//指定降级方法名,5秒钟后超时执行
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="5000")
}) 声明在要降级处理的方法上
@DefaultProperties (defaultFallback = "globalHandler") 指定全局处理方法 声明在类上
@HystrixCommand 开启降级熔断功能(配置,开启断路器)
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //是否开启断路器
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "20"), //当快照时间窗(默认10秒)内达到此数量才有资格打开断路,默认20个
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "50000"), //断路多久以后开始尝试是否恢复,默认5s
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "50"), //出错百分比阈值,当达到此阈值后,开始短路。默认50%
})涉及到断路器的三个重要参数:快照时间窗、请求总数阈值、错误百分比阈值。
- hystrixDashboard 服务监控
@EnableHystrixDashboard 启用监控功能 声明在启动类
- Gateway
没有相关注解,导入Jar包自动开启,进行yml路由配置即可
- Alibaba Nacos服务注册和配置中心
@EnableDiscoveryClient 作用: 与 @EnableEurekaClient作用相同,声明注册中心客户端,更加通用,适用于Eureka,Nacos,Consul,Zookeeper。 声明在启动类 (spring cloud提供)
@RefreshScope 实现配置自动更新(热部署) (spring cloud提供) 声明在Controller类上
配合@Value使用
- Alibaba Sentinal熔断与限流
@SentinelResource (value = "testHotKey",blockHandler = "deal_testHotKey") 与Hystrix中@HystrixCommand注解作用一致,降级熔断处理。指定资源映射名称
参数- blockHandler:处理配置违规。 fallback:处理程序代码异常
//降级方法定义在独立的处理类中,必须是static修饰的,其他要求一致 // 1.public // 2.返回值类型和目标方法一致 // 3.参数列表要一致,并且最后多一BlockException类型参数 // 4.方法名任意,与上面blockHandler指定一致
//注意:处理代码异常的降级方法,参数要与目标方法一致,最后多一个Throwable类型参数 (可加可不加)
- MyBatisPlus (baomidou)
@TableName("order_info") 指定类绑定的数据库 (声明在类)
@TableId(type = IdType.ASSIGN_ID) 配置主键策略
@TableField(fill = FieldFill.INSERT) MP实现自动填充
@Version MP实现乐观锁 ,还需要注册 OptimisticLockerInterceptor 乐观锁插件
@TableLogic 逻辑删除(软删除)
value = "" 未删除的值,默认值为0
delval = "" 删除后的值,默认值为1
- Swagger2
常用注解
@EnableSwagger2 Swagger支持。声明在配置类“@Configuration”
@Api(description = "医院设置接口") 定义接口说明
@ApiOperation(value = "医院设置列表") 定义方法说明
@ApiModelProperty(value = "是否成功") 定义属性说明
@ApiParam(name = "id", value = "讲师ID", required = true) 定义参数说明
- Spring 异常处理
@ControllerAdvice spring AOP面向切面编程,对Controller进行切面环绕。作用:全局异常处理、全局数据预处理、全局数据绑定
@ExceptionHandler (Exception.class) 异常拦截器(自定义异常处理器),需要结合@ControllerAdvice一起使用 统一异常处理
- 解决跨域问题
@CrossOrigin controller类上加入,解决跨域问题
- EasyExcel
@ExcelProperty (value = "学生编号",index = 0) 设置表头名称,指定映射关系(第0行)
- Redis
@EnableCaching 配置类,开启缓存功能
@Cacheable 根据方法对其返回结果进行缓存
@CachePut 每次都会执行,并将结果存入指定的缓存中
@CacheEvict 声明在方法,清空指定的缓存。
属性/方法名 | 解释 |
value | 缓存名,必填,它指定了你的缓存存放在哪块命名空间 |
cacheNames | 与 value 差不多,二选一即可 |
key | 可选属性,可以使用 SpEL 标签自定义缓存的key |
allEntries | 是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存 |
beforeInvocation | 是否在方法执行前就清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存 |
- mongoDB
@Document ("User") 指定集合;标识需要持久化到MongoDB的域对象
@Id 主键
@Transient //被该注解标注的,将不会被录入到数据库中。只作为普通的javaBean属性
- 定时任务 七域表达式
@EnableScheduling //开启定时任务
@Scheduled 指定七域表达式
@ConfigurationProperties(prefix = "elasticsearch") 通过前缀,注入属性。要求属性名相同
- ElasticSearch
实体类加入注解,会自动创建索引库 (Text才会分词 keyWord不分词)
@Document(indexName = "product",shards = 1, replicas = 1) 指定索引名、主分片、副分片,声明在映射对象上
@Id 声明主键ID
@Field(type = FieldType.Text, analyzer = "ik_max_word") 指定类型,分词词库,声明在成员变量上
type:字段类型,取值是枚举:FieldType
index:是否索引,布尔类型,默认是true
store:是否存储,布尔类型,默认是false
analyzer:分词器名称:ik_max_word (Text才会分词 keyWord不分词)
- Seata 分布式事务
@GlobalTransactional 开启全局事务
@PostConstruct 指定一个初始化方法
@Valid 数据校验,controller中 dto类
使用@Valid相关注解非常简单,只需要在参数的实体类属性上添加如@NotBlank,@Max,@Min等注解对字段进行限制。如下
public class User{
@NotBlank(message = "姓名不为空")
private String username;
@NotBlank(message = "密码不为空")
private String password;
}