Spring-常用扩展点接口
- BeanFactoryPostProcessor
- BeanDefinitionRegistryPostProcessor
- BeanPostProcessor
- InitializingBean
- ApplicationContextAware
- ApplicationListener
Springboot-自定义注解
Springboot自定义注解
BeanPostProcessor的应用案例
- 使用@interface定义注解
- 使用BeanPostProcessor处理注解
BeanPostProcessor为bean后置处理器. Spring启动过程中,所有的bean初始化的时候会调用bean的后置处理器.
自定义注解类
1 | import org.springframework.stereotype.Component; |
Spring-Bean实例化方式
常规方式
通过构造方法实例化
1
2
3
4
5
6
7
8
9
10<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="test" class="com.learn.Test" />
<bean id="test1" class="com.learn.Test">
<constructor-arg name="id" value="1"/>
</bean>
</beans>1
2
3
4
5
6
7
8import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DemoApplication {
public static void main(String[] args) {
ClassPathXmlApplicationContext ca=new ClassPathXmlApplicationContext("beans.xml");
Test testA=(Test)ca.getBean("test");
}
}
Spring-BeanDefinition构建与注册IOC
Spring中的BeanDefinition
BeanDefinition 是 Spring Framework 中定义 Bean 的配置元信息接口.BeanDefinition描述一个bean. 包括bean的属性,构造函数参数列表,依赖bean,是否是单例,bean的类名等等
BeanDefinition元信息
属性 (Property) | 说明 |
---|---|
Class | Bean全类名,必须是具体类,不能用抽象类或接口 |
Name | Bean的名称或者ID |
scope | Bean的作用域 (如: singleton, prototype 等) |
Constructor arguments | Bean构造器参数(用于依赖注入) |
Properties | Bean属性设置(用于依赖注入) |
Autowiring mode | Bean自动绑定模式(如:通过名称byName) |
Lazy initialization mode | Bean延迟初始化模式(延迟和非延迟) |
Initialization method | Bean初始化回调方法名称 |
Destruction method | Bean销毁回调方法名称 |
JAVA-List实现类对比
List
LinkedList vs ArrayList
Internal implementation
这两个集合都允许重复的元素并维持元素的插入顺序。
LinkedList
使用doubly-linked list LinkedList
实现它。 ArrayList
使用dynamically resizing array实现它。 这将导致性能上的进一步差异。
Performance
Add operation
如果不需要调整Array的大小,则在ArrayList中添加元素是O(1)
操作。 如果调整数组大小,则它变为O(log(n))
。
在LinkedList中添加元素是O(1)
操作,因为它不需要任何导航。
SpringCloud-面试题
什么是微服务架构
微服务架构就是将单体的应用程序分成多个应用程序,这多个应用程序就成为微服务,每个微服务运行在自己的进程中,并使用轻量级的机制通信。这些服务围绕业务能力来划分,并通过自动化部署机制来独立部署。这些服务可以使用不同的编程语言,不同数据库,以保证最低限度的集中式管理。
Spring Cloud 是什么
- Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
- Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
什么是Spring Cloud Alibaba?
Spring Cloud Alibaba 套件,阿里开源组件、阿里云商业组件整合进 Spring Cloud 体系当中,同时对 Spring Cloud Gateway、OpenFeign、Ribbon 等等进行集成。
主要功能如下:
- 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
- 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
- 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
- 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
- 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
Spring Cloud Alibaba和Spring Cloud 的区别和联系
Spring Cloud Alibaba是Spring Cloud的子项目,Spring Cloud Alibaba符合Spring Cloud标准。
随着Spring Cloud Netflix下的相关组件逐步进入维护模式,进入维护模式的意思就是从目前一直到以后一段时间Spring Cloud Netflix提供的服务和功能就这么多了,不再开发新的组件和功能了。同时Spring Cloud官方也在积极孵化其他替代品,以满足Spring Cloud版本迭代的需求。
Spring Cloud Alibaba生态下的各个组件其实在国内很多公司很早之前就有使用,它们在服务治理方面比Spring Cloud Netflix更加强大,而且比较符合国内互联网公司的业务特性,推荐使用。
SpringBoot-面试题
SpringBoot 面试题
Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含 了以下 3 个注解
:
@SpringBootConfiguration:
组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:
打开自动配置的功能,也可以关闭某个自动配置的选项
@ComponentScan
:Spring组件扫描。
SpringBoot 生命周期
SpringBoot应用的生命周期,整体上可以分为SpringApplication初始化阶段、SpringApplication运行阶段、SpringApplication结束阶段、SpringBoot应用退出四个阶段。
Spring-面试题
OepnFeign-Http组件
OpenFeign
介绍
Feign 就是一个 Http 客户端的模板,目标是减少 HTTP API 的复杂性,希望能将 HTTP 远程服务调用做到像 RPC 一样易用。
Feign 集成 RestTemplate、Ribbon 实现客户端的负载均衡,并对RestTemplate进行封装,开发者只需要声明一个接口并通过注解进行简单的配置即可完成服务调用,更加符合面向接口编程的宗旨。客户端在调用服务端时也不需要再关注请求的方式、地址以及是 forObject 还是 forEntity,结构明了,耦合低,简化开发。
在 Feign 的基础上,衍生出了 Spring Cloud OpenFeign
openFeign 在 Feign 的基础上支持了 SpringMVC 的注解,如 @RequestMapping 等。OpenFeign 的 @FeignClient 可以解析 SpringMVC 的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
总的就是,openFeign 作为微服务架构下服务间调用的解决方案,是一种声明式、模板化的 HTTP 的模板,使 HTTP 请求就像调用本地方法一样,通过 openFeign 可以替代基于 RestTemplate 的远程服务调用,并且默认集成了 Ribbon 进行负载均衡。
注解 | 说明 |
---|---|
@FeignClient | 该注解用于通知 OpenFeign 组件对 @RequestMapping 注解下的接口进行解析,并通过动态代理的方式产生实现类,实现负载均衡和服务调用。 |
@EnableFeignClients | 该注解用于开启 OpenFeign 功能,当 Spring Cloud 应用启动时,OpenFeign 会扫描标有 @FeignClient 注解的接口,生成代理并注册到 Spring 容器中。 |
@RequestMapping | Spring MVC 注解,在 Spring MVC 中使用该注解映射请求,通过它来指定控制器(Controller)可以处理哪些 URL 请求,相当于 Servlet 中 web.xml 的配置。 |
@GetMapping | Spring MVC 注解,用来映射 GET 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.GET) 。 |
@PostMapping | Spring MVC 注解,用来映射 POST 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.POST) 。 |