Spring
- 是一个分层的一站式轻量级框架;
- spring属于低侵入式设计,代码的污染极低;
- spring的DI(依赖注入)机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;
- Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。
- spring对于主流的应用框架提供了集成支持。
- 涉及到的注解:
- 声明bean的注解
- @Controller 在展现层使用,控制器的声明(控制层)
- @Service 在业务逻辑层使用(service层)
- @Repository 在数据访问层使用(dao层)
- @Component 组件,没有明确的角色
- 注入bean的注解(一般用在属性上,也可以用在set方法上)
- @Autowired:由Spring提供
- @Resource:由JSR-250提供
- java配置类相关注解
- @Bean 注解在方法上,声明当前方法的返回值为一个bean(方法上)
- @Configuration 声明当前类为配置类,其中内部组合了@Component注解,表明这个类是一个bean(类上)
- @ComponentScan 用于对Component(组件)进行扫描(类上)
- @WishlyConfiguration 为@Configuration与@ComponentScan的组合注解,可以替代这两个注解
- 切面(AOP)相关注解(通知注解见下文)
- @Aspect 声明一个切面(类上)
- @PointCut 声明切点
- SpringMVC注解
- @RequestMapping 用于映射Web请求,包括访问路径和参数(类或方法上)
- @ResponseBody 支持将返回值放在response内,而不是一个页面,通常用户返回json数据(返回值旁或方法上)
- @RequestBody 允许request的参数在request体中,而不是在直接连接在地址后面。(放在参数前)
- @RestController 该注解为一个组合注解,相当于@Controller和@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都默认加上了@ResponseBody。
- Springboot注解
- @Configuration 用于定义配置类,指出该类是 Bean 配置的信息源
- @EnableAutoConfiguration 允许 Spring Boot 自动配置注解
- @SpringBootApplication 等同于同时使用@Configuration、@EnableAutoConfiguration和@ComponentScan及其默认属性。
- @Cacheable
- @Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略,这个稍后会进行说明。需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。@Cacheable可以指定三个属性,value、key和condition。
- @CachePut
- 与@Cacheable不同的是,@CachePut不会取检查缓存中是否存在,而是直接执行方法,然后结果入缓存(只存不用)。
- @CacheEvict
- 是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。
- 声明bean的注解
- 涉及到的注解:
Spring的AOP和IOC
- AOP:核心:动态代理
- 例子:
- 事务管理(spring 的事务就是用AOP实现的,xml文件形式是JDK代理,因为有接口,否则是Cglib代理)
- 权限验证
- 提高了功能代码的重用性和可维护性。
- Spring框架的AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代码。在业务流程执行过程中,Spring框架会根据业务流程要求,自动把独立编写的功能代码切入到流程的合适位置。
- Spring AOP并不是一套完整的AOP方案,例如在spring事务管理中,会有AOP自调用问题,但是spring AOP可以应对大部分的情况。如果需要完整的AOP方案,可以使用AspectJ。
- 切面,切点,连接点,(织入),通知。
- 切面:切面是通知和切入点的结合。(切面类一定要交给spring管理)
@Aspect //声明切面,标记类 - 切点:需要在前后添加通知操作的业务方法
@Pointcut(“execution(* *.perform(…))”) //定义切点,标记方法 - 连接点:连接点可以说是切点的全集,可以引入通知的地方都是连接点(不用太过关心连接点)
- 通知:横向抽取出来的操作
//下列注解默认属性pointcut(连接点) @Before("execution(void *User(..))") //前置通知 @AfterReturning("execution(void *User(..))") //后置通知 @Around("execution(void *User(..))")//环绕通知 @AfterThrowing("execution(void *User(..))")//异常通知 @After("execution(void *User(..))")//最终通知
- 切面:切面是通知和切入点的结合。(切面类一定要交给spring管理)
- 例子:
- IOC
- 简要说明:IOC核心思想是依赖注入(DI)或控制反转(IOC),就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
- 解释:以往的方式是不管会不会用到,先将需要的对象new好,这样就造成资源的浪费,而且如果其中一个对象new的时候出现问题,那么不管用不用到这个对象,程序都会受到影响,也就是耦合度较高。IOC容器技术就是需要的时候就注入,不需要的时候就不注入。这样就将类和对象解耦,一个对象有问题,没有使用到这个对象的地方依然可以正常运行。注入的主要方式有:set注入,构造器注入,注解注入。
- 优点:实现对象之间的解耦。
- 缺点:
- 由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗(反射创建对象的速度大概是正常生成对象速度的1-2倍),所以对于强调运行效率的项目,不太适用IOC容器技术。
- 对于IOC框架产品(比如:Spring)来讲,需要配置工作,对于一些小的项目而言,客观上也可能加大一些工作成本。
SpringMVC
Spring MVC 提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet(前端控制器)和 ViewResolver(视图解析器) 等一些简单的概念,开发 Web 应用将会变的非常简单。
- 工作流程
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
- 执行处理器(Controller,也叫后端控制器)。
- Controller执行完成返回ModelAndView
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器
- ViewReslover解析后返回具体View
- DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户
- 主要组件
- 前端控制器 DispatcherServlet(不需要程序员开发):接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
- 处理器映射器HandlerMapping(不需要程序员开发):根据请求的URL来查找Handler
- 处理器适配器HandlerAdapter(手写路径):在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
- 处理器Handler(需要程序员开发):具体调用模块处理请求。
- 视图解析器 ViewResolver(不需要程序员开发):进行视图的解析,根据视图逻辑名解析成真正的视图(view)
- 视图View(前端开发):View是一个接口, 它的实现类支持不同的视图类型(jsp,html,vue等等)
- springMVC和struts2的区别
- springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。
- springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
SpringBoot
-
特点:
- 快速构建项目。(最主要的作用)
- 对主流开发框架的无配置集成。
- 项目可独立运行,无须外部依赖Servlet容器。
- 提供运行时的应用监控。
- 极大地提高了开发、部署效率。
- 支持各种开发工具,如 IntelliJ IDEA,Eclipse
-
springboot的上下文环境:Environment
- Environment这个概念是与spring的容器container集成在一起的一个抽象概念。主要为我们的应用程序环境的两个方面的支持:profiles and properties。
- 配置文件中的属性之所以能被程序发现并使用,是因为spring boot在启动时已经帮我们把这些值都放在了Spring的Environment里面了。
- 配置文件读取顺序
- 在jar包的同一目录下建一个config文件夹,然后把配置文件放到这个文件夹下。
- 直接把配置文件放到jar包的同级目录。
- 在classpath下建一个config文件夹,然后把配置文件放进去。
- 是在classpath下直接放配置文件(默认的yml文件和properties文件其实是优先级最低的)。
- profile的概念:profile的作用就是符合这个给定profile配置的bean的集合。我们在定义一个bean的时候是可以将其分配到一个指定的profile(如注解方式指定bean时可以使用@Profile注解来指定)。当有多个profile存在时,我们可以指定哪一个profile生效(active),不指定spring会根据默认的profile去运行。
-
组件
- Spring Actuator:监视应用程序及交互
- Spring Initializer:Spring Initializer是一个网络应用程序,它可以生成一个Spring Boot项目,包含快速启动所需的一切。和往常一样,我们需要一个好的项目框架;它有助于你正确创建项目结构/框架。
-
jar包启动的执行命令:
nohup java -jar *.jar --spring.config.location=config/application.properties >*.log&- nohup ==> 守护进程
- java -jar *.jar ==> jar包启动
- –spring.config.location=配置文件路径 ==> 指定jar包读取的外部配置文件路径
- >*.log ==> 日志输出位置
- & ==> 守护进程(仅当前连接linux终端用户在线时,一旦该用户断开连接,项目将自动停止,因此需要使用nohup)
-
springboot自动装配:
- springboot帮我们引入了208种可以自动装配的框架
- 但是对于mybatis,并没有被集成到其中,因此需要在pom文件中手动添加mybatis与springboot集成依赖
- springboot帮我们引入了208种可以自动装配的框架
SpringCloud
- Eureka——各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
- Ribbon——服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
- Feign——基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
- Hystrix——发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
- Zuul——如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务