大部分知识点来源于该博主——骆昊
知识点来源于网络,知道的可以在评论区贴上来源喔

《零散知识点总结1》
该文章涉及:Dubbo、HTTP和HTTPS、Mybatis、Hibernate、 Zookeeper、Kafka、Elasticsearch、Redis

《零散知识点总结2》
该文章涉及:MySQL、Java并发编程、Java IO 和 NIO、JUnit单元测试

《零散知识点总结3》
该文章涉及 :Java Web、Spring、SpringMVC、Springboot、Springcloud、微服务

《零散知识点总结4》
该文章涉及:JVM和GC、Linux、Git、RabbitMQ

《零散知识点总结5》
该文章涉及:多线程、反射、对象拷贝、异常、容器

零散知识点总结3

  • Java Web
    • JSP 有哪些内置对象?作用分别是什么?
    • 说一下 JSP 的 4 种作用域?
    • session 和 cookie 有什么区别?
    • 说一下 session 的工作原理?
    • 如果客户端禁止 cookie 能实现 session 还能用吗?
    • spring mvc 和 struts 的区别是什么?
    • 如何避免 SQL 注入?
    • 什么是 XSS 攻击,如何避免?
    • 什么是 CSRF 攻击,如何避免?
  • Spring
    • AOP、IOC
    • Spring的IOC有三种注入方式 :构造器注入、setter方法注入、根据注解注入
    • Spring支持的几种bean的作用域?
    • 基础问题(什么是 Spring Framework?不同版本的 Spring Framework 有哪些主要功能?)
    • 列举 Spring Framework 的优点,有哪些不同的功能?
    • Spring上下文,什么是 Spring 配置文件? Spring 应用程序有哪些不同组件?
    • 使用 Spring 有哪些方式?
    • IoC(控制反转)
    • Beans
      • spring 提供了哪些配置方式?spring 支持集中 bean scope?
      • spring bean 容器的生命周期是什么样的?什么是 spring 的内部 bean?
      • 什么是 spring 装配( bean 装配)? 什么是 bean 的自动装配?自动装配有哪些方式? 自动装配有什么局限?
    • 如何给 Spring 容器提供配置元数据? 你怎样定义类的作用域?
      • 哪些是重要的 bean 生命周期方法?你能重载它们吗?在 Spring 中如何注入一个 java 集合?
    • 注解
      • 什么是基于Java 的 Spring注解的容器配置
    • @Required 、@Qualifier 、@RequestMapping、 @Reference、@Autowired、@Resource注解
    • 数据访问
      • spring DAO 有什么用?列举 Spring DAO 抛出的异常。
      • 在 Spring 框架中如何更有效地使用 JDBC?使用 Spring 访问 Hibernate 的方法有哪些?
      • spring 事务
      • spring 支持哪些 ORM (对象关系映射)框架
    • Spring 面向切面编程——AOP(切面、切点、通知)
      • AOP 有哪些实现方式?(动态代理、静态代理)
      • 什么是目标对象? 什么是代理?如何理解 Spring 中的代理?有几种不同类型的自动代理?
      • 什么是编织(Weaving)?(或者什么叫织入?)什么是织入应用的不同点?
    • 依赖注入
      • 什么是spring的依赖注入?有哪些不同类型的 IOC(依赖注入)方式?推荐哪种注入方式?
    • 简单工厂和抽象工厂有什么区别?
    • 说一下你熟悉的设计模式
    • 为什么说spring是一个容器?
    • 你怎样定义类的作用域?
    • 怎样开启注解装配?
  • Spring的MVC
    • SpringMVC框架的优点
    • 描述一下 DispatcherServlet 的工作流程
    • spring mvc 有哪些组件?
  • Spring Boot
    • SpringBoot 自动装配的原理
    • spring boot 核心配置文件是什么?配置文件有哪几种类型?它们有什么区别?
    • 如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?(热部署)
    • spring boot 有哪些方式可以实现热部署?
    • Spring Boot 中的监视器是什么?
    • 如何在 Spring Boot 中禁用 Actuator 端点安全性?
    • 如何在自定义端口上运行 Spring Boot 应用程序?
    • 什么是 YAML?
    • 什么是 CSRF 攻击?
    • 我们如何监视所有 Spring Boot 微服务?
    • jpa 和 hibernate 有什么区别?
  • Spring Cloud
    • spring cloud 的核心组件有哪些?
    • 服务注册和发现是什么意思?Spring Cloud 如何实现?负载平衡的意义是什么?
    • feign如何实现负载均衡,与Ribbon的负载均衡有什么区别?
    • 什么是 Hystrix?它如何实现容错?
    • 什么是 Hystrix 断路器?我们需要它吗?
    • 什么是 Netflix Feign?它的优点是什么?
    • 什么是Spring Cloud Bus ?我们需要它吗?
    • Dubbo 和Spring Cloud的区别
  • 微服务
    • 微服务与微服务架构
    • 微服务优缺点
    • 微服务技术栈有那些?
    • 为什么选择SpringCloud作为微服务架构?
    • 微服务架构如何运作?
    • 单片,SOA 和微服务架构有什么区别?
    • 在使用微服务架构时,您面临哪些挑战?
    • SOA 和微服务架构之间的主要区别是什么?
    • 微服务有什么特点?
    • 什么是领域驱动设计?(DDD原理)
    • 为什么需要域驱动设计(DDD)?(我们需要 DDD 的因素)
    • 什么是 REST / RESTful 以及它的用途是什么?
    • 你对 Spring Boot 有什么了解?
    • Spring Cloud 解决了哪些问题?
    • 在 Spring MVC 应用程序中使用 WebMvcTest 注释有什么用处?
    • 你能否给出关于休息和微服务的要点?
    • 什么是不同类型的微服务测试?
    • 您对 Distributed Transaction 有何了解?
    • 什么是 Idempotence 以及它在哪里使用?
    • 什么是有界上下文?
    • 什么是双因素身份验证?
    • 双因素身份验证的凭据类型有哪些?
    • 什么是客户证书?
    • PACT 在微服务架构中的用途是什么?
    • 什么是 OAuth?
    • 康威定律是什么?( Conway 定律的表示)
    • 合同测试你懂什么?
    • 什么是端到端微服务测试?(测试层次)
    • Container (容器)在微服务中的用途是什么?
    • Mock(Stub ) 或 Stub (存根)有什么区别?
    • 您对 Mike Cohn 的测试金字塔了解多少?
    • Docker 的目的是什么?

Java Web

Java Web学习:TomcatHttpMavenServletSession、 CookieJSP三层架构:表示层(UI)主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问业务逻辑层(BLL)主要负责对数据层的操作。也就是说把一些数据层的操作进行组合。数据访问层(DAL)主要看数据层里面有没有包含逻辑处理,实际上它的各个函数主要完成各个对数据文件的操作。而不必管其他操作JSTL、EL表达式过滤器 filter(后面会学spring自带有【filter】,自己编写拦截器【interceptor】)监听器文件上传邮件发送【扩展】富文本编辑器

JSP 和 servlet 有什么区别?

JSP 是 servlet 技术的扩展,本质上就是 servlet 的简易方式。

servlet 和 JSP 最主要的不同点在于,servlet 的应用逻辑是在 Java 文件中,并且完全从表示层中的 html 里分离开来,而 JSP 的情况是 Java 和 html 可以组合成一个扩展名为 JSP 的文件。

JSP 侧重于视图,servlet 主要用于控制逻辑

JSP 有哪些内置对象?作用分别是什么?

JSP 有 9 大内置对象:

  • request:封装客户端的请求,其中包含来自 get 或 post 请求的参数;
  • response:封装服务器对客户端的响应;
  • pageContext:通过该对象可以获取其他对象;
  • session:封装用户会话的对象;
  • application:封装服务器运行环境的对象;
  • out:输出服务器响应的输出流对象;
  • config:Web 应用的配置对象;
  • page:JSP 页面本身(相当于 Java 程序中的 this);
  • exception:封装页面抛出异常的对象。

说一下 JSP 的 4 种作用域?

  • page:代表与一个页面相关的对象和属性。
  • request:代表与客户端发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。
  • session:代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。
  • application:代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。

session 和 cookie 有什么区别?

  • 存储位置不同:session 存储在服务器端;cookie 存储在浏览器端。
  • 安全性不同:cookie 安全性一般,在浏览器存储,可以被伪造和修改。
  • 容量和个数限制:cookie 有容量限制,每个站点下的 cookie 也有个数限制。
  • 存储的多样性:session 可以存储在 Redis 中、数据库中、应用程序中;而 cookie 只能存储在浏览器中。

说一下 session 的工作原理?

session 的工作原理是客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把 session 的 id 发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着 sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了。

如果客户端禁止 cookie 能实现 session 还能用吗?

可以用,session 只是依赖 cookie 存储 sessionid,如果 cookie 被禁用了,可以使用 url 中添加 sessionid 的方式保证 session 能正常使用。

spring mvc 和 struts 的区别是什么?

  • 拦截级别:struts2 是类级别的拦截;spring mvc 是方法级别的拦截。
  • 数据独立性:spring mvc 的方法之间基本上独立的,独享 request 和 response 数据,请求数据通过参数获取,处理结果通过 ModelMap 交回给框架,方法之间不共享变量;而 struts2 虽然方法之间也是独立的,但其所有 action 变量是共享的,这不会影响程序运行,却给我们编码和读程序时带来了一定的麻烦。
  • 拦截机制:struts2 有以自己的 interceptor 机制,spring mvc 用的是独立的 aop 方式,这样导致struts2 的配置文件量比 spring mvc 大。
  • 对 ajax 的支持:spring mvc 集成了ajax,所有 ajax 使用很方便,只需要一个注解 @ResponseBody 就可以实现了;而 struts2 一般需要安装插件或者自己写代码才行。

如何避免 SQL 注入?

  • 使用预处理 PreparedStatement 【java.sql包中的接口,预备声明】。
  • 使用正则表达式过滤掉字符中的特殊字符。

什么是 XSS 攻击,如何避免?

  • XSS 攻击:即跨站脚本攻击,它是 Web 程序中常见的漏洞。原理是攻击者往 Web 页面里插入恶意的脚本代码(css 代码、Javascript 代码等),当用户浏览该页面时,嵌入其中的脚本代码会被执行,从而达到恶意攻击用户的目的,如盗取用户 cookie、破坏页面结构、重定向到其他网站等。
    预防 XSS 的核心是必须对输入的数据做过滤处理。

什么是 CSRF 攻击,如何避免?

CSRF:Cross-Site Request Forgery(中文:跨站请求伪造),可以理解为攻击者盗用了你的身份,以你的名义发送恶意请求,比如:以你名义发送邮件、发消息、购买商品,虚拟货币转账等。

防御手段:

  • 验证请求来源地址;
  • 关键操作添加验证码;
  • 在请求地址添加 token (令牌)并验证。

Spring

 Spring学习:IOC理论推导spring概述IOC-Beans.xmlDI-Set/cp【重点】  DI(Dependency Injection):依赖注入代理模式(静态、动态)【重点】AOP注解开发 springJavaConfig【半重点】整合mybatis:事务【重点】声明式事务

Spring官网
Spring参考文档

spring组成

Spring Framework 中有多少个模块,它们分别是什么?


Spring优点

  • Spring 是一个开源免费的容器(框架)
  • Spring是一个轻量级的框架 , 非侵入式的 (导包就可以用不会影响你整个项目)
  • 控制反转 IoC (inversion of control), 面向切面 Aop(Aspect Oriented Programming)
  • 对事物的支持 , 对框架的支持

使用 Spring 框架的好处是什么?

  • 轻量级:Spring 是轻量的,基本的版本大约 2MB。
  • 控制反转(IOC):Spring 通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
  • 面向切面的编程(AOP):Spring 支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
  • 容器:Spring 包含并管理应用中对象的生命周期和配置。
  • MVC 框架:Spring 的 WEB 框架是个精心设计的框架,是 Web 框架的一个很好的替代品。
  • 事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
  • 异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO 抛出的)转化为一致的 unchecked 异常。

总结一句话:Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。

AOP、IOC

  • AOP:aop 是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

      简单来说就是统一处理某一“切面”(类)的问题的编程思想,比如统一处理日志、异常等。
    
  • IOC:ioc:Inversionof Control(中文:控制反转)是 spring 的核心,对于 spring 框架来说,就是由 spring 来负责控制对象的生命周期和对象间的关系。

      简单来说,控制指的是当前对象对内部成员的控制权;控制反转指的是,这种控制权不由当前对象管理了,由其他(类,第三方容器)来管理
    

解释AOP模块
AOP(Aspect-Oriented Programming)指一种程序设计范型,该范型以一种称为切面(aspect)的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点(crosscutting concern)。

Spring的IOC有三种注入方式 :构造器注入、setter方法注入、根据注解注入

  • 构造器注入
    原理 : 为目标对象提供一个构造方法,在构造方法中添加一个依赖对象对应的参数。ioc容器解析时,实例化目标对象时会自动调用构造方法,ioc只需要为构造器中的参数进行赋值;将ioc实例化的依赖对象作为构造器的参数传入。

【构造器依赖注入: 构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖】

```kotlin
package com.jpeony.spring.setter;
import com.jpeony.spring.common.HelloServiceImpl;public class HelloWord {private HelloService helloService;// 构造方法注入public HelloWord (HelloService helloService) {this.helloService = helloService;}
}
```
`applicationContext.xml`:```kotlin
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd"><!--Bean声明:该bean类似于javaConfig中的@Bean注解;用于创建bean的类通过class属性来指定,并且需要使用全限定的类名。通过id指定bean的ID。如果不显示指定,默认使用class的全限定名进行命名。eg:com.jpeony.spring.common.HelloServiceImpl#0,其#0是一个计数器的形式,用来区分相同类型的其他bean。使用自动化命名很方便,但是没有多少实际用处,还是建议自己给bean显示设定ID。--><bean id="helloService" class="com.jpeony.spring.common.HelloServiceImpl"/><!-- 构造方法注入bean --><bean id="HelloWord" class="com.jpeony.spring.setter.HelloWord"><constructor-arg><ref bean-"helloService"/><constructor-arg/></bean>
</beans>
```
  • setter方法注入
    原理 : 在目标对象中,定义需要注入的依赖对象对应的属性和setter方法;“让ioc容器调用该setter方法”,将ioc容器实例化的依赖对象通过setter注入给目标对象,封装在目标对象的属性中。
    【Setter方法注入: Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。】

    package com.jpeony.spring.setter;import com.jpeony.spring.common.HelloServiceImpl;public class HelloWord {private HelloService helloService;// setter方式注入Beanpublic void setHelloService(HelloService helloService) {this.helloService = helloService;}@Overridepublic void selfIntroduction() {// 向大家打招呼helloService.sayHello("大家好!");}
    }
    

    applicationContext.xml

    <?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 http://www.springframework.org/schema/beans/spring-beans.xsd"><!--Bean声明:该bean类似于javaConfig中的@Bean注解;用于创建bean的类通过class属性来指定,并且需要使用全限定的类名。通过id指定bean的ID。如果不显示指定,默认使用class的全限定名进行命名。eg:com.jpeony.spring.common.HelloServiceImpl#0,其#0是一个计数器的形式,用来区分相同类型的其他bean。使用自动化命名很方便,但是没有多少实际用处,还是建议自己给bean显示设定ID。--><bean id="helloService" class="com.jpeony.spring.common.HelloServiceImpl"/><!-- setter注入bean --><bean id="HelloWord" class="com.jpeony.spring.setter.HelloWord"><property name="helloService" ref="helloService"/></bean>
    </beans>
  • 注解注入
    注解方式实现IOC注入,主要涉及以下几个注解

     @Configuration:添加该注解的类被视为上下文,里面带有@Bean注解的都将被注入到IOC容器@ComponentScan:扫描注定包下的所有带@Component的类,注入到IOC容器@Bean:添加该注解的方法将返回一个实例,并被注入到IOC容器@Component:添加该注解的方法自动被注入到IOC容器,需要被@ComponentScan扫描到@Scope:指定实例的作用域@PostConstruct:添加该注解的方法在实例初始化的时候被执行@PreDestory:添加该注解的方法在实例销毁的时候被执行
    

案例
第一步:@Configuration配置一个上下文环境,并在里面使用@Bean注解返回需要注入的对象,指定beanId

@Configuration
public class BeanConfiguration {//将一个bean交由spring创建并管理@Bean(value = "bean1")public Bean1 getBean1() {return new Bean1();}
}

第二步:根据beanId获取需要的实例对象

public class IoCAnnotationTest {@Testpublic void test() {//获取Spring上下文AnnotationConfigApplicationContext context =new AnnotationConfigApplicationContext(BeanConfiguration.class);//获取bean
//        Bean1 bean1 = (Bean1) context.getBean("getBean1");//beanId默认为方法名Bean1 bean1 = (Bean1) context.getBean("bean1");//通过@Bean value属性设置beanIdSystem.out.println(bean1);}
}

如果有很多bean要注入,那么要写很多@Bean注解吗,这里有更方便的写法

//创建一个class配置文件
@Configuration
//扫描指定包下的所有带@Component的bean,交由Spring管理
@ComponentScan(value = "com.kingja.iocannotation.bean")
public class BeanScanConfiguration {......
}

在需要注入的类上添加@Component注解,并设置beanId

//通过value设置beanId
@Component(value = "bean2")
//默认beanId是类名(首字母小写bean2)
public class Bean2 {}

IOC的作用域

实际需求中,我们可能需要每次返回的对象是同一个,也可能每次创建不同的实例对象,也可能根据不同的场景,比如不同请求,不同会话等返回不同实例,这就涉及到Bean的作用域。

Spring支持的几种bean的作用域?

Spring容器中的bean可以分为5个范围:

  • singleton:(默认)单例模式,创建的实例是同一个,单例的模式由BeanFactory自身来维护。
  • prototype:每次创建不同的实例
  • request:每次请求创建不同的实例,在请求完成以后,bean会失效并被垃圾回收器回收
  • session:每个会话周期内创建同一个实例,与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效
  • global-session:全局作用域,global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同。

application:服务器运行周期内创建内一个实例
websocket:每次websocket连接创建同一个实例

《Spring–IOC注解方式注入》

基础问题(什么是 Spring Framework?不同版本的 Spring Framework 有哪些主要功能?)

什么是 Spring Framework?

Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度。它是轻量级、松散耦合的。它具有分层体系结构,允许用户选择组件,同时还为 J2EE 应用程序开发提供了一个有凝聚力的框架。它可以集成其他框架,如Structs、Hibernate、EJB 等,所以又称为框架的框架。

不同版本的 Spring Framework 有哪些主要功能?

version feature
Spring 2.5 发布于 2007 年。这是第一个支持注解的版本。
Spring 3.0 发布于 2009 年。它完全利用了 Java5 中的改进,并为 JEE6 提供了支持。
Spring 4.0 发布于 2013 年。这是第一个完全支持 JAVA8 的版本。
Spring 5.0 推荐1:5.0各模块功能介绍;推荐2:5.0 的一些特性

列举 Spring Framework 的优点,有哪些不同的功能?

由于 Spring Frameworks 的分层架构,用户可以自由选择自己需要的组件。
Spring Framework 支持 POJO(Plain Old Java Object) 编程,从而具备持续集成和可测试性。由于依赖注入和控制反转,JDBC 得以简化。它是开源免费的。

Spring Framework 有哪些不同的功能?

  • 轻量级 - Spring 在代码量和透明度方面都很轻便。

  • IOC - 控制反转

  • AOP - 面向切面编程可以将应用业务逻辑和系统服务分离,以实现高内聚。

  • 容器 - Spring 负责创建和管理对象(Bean)的生命周期和配置。

  • MVC - 对 web 应用提供了高度可配置性,其他框架的集成也十分方便。

  • 事务管理 - 提供了用于事务管理的通用抽象层。Spring 的事务支持也可用于容器较少的环境。

  • JDBC 异常 - Spring的 JDBC 抽象层提供了一个异常层次结构,简化了错误处理策略。

Spring上下文,什么是 Spring 配置文件? Spring 应用程序有哪些不同组件?

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

ApplicationContext.xml

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!-- services --><bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl"><property name="accountDao" ref="accountDao"/><property name="itemDao" ref="itemDao"/><!-- additional collaborators and configuration for this bean go here --></bean><!-- more bean definitions for services go here -->
</beans>

核心容器(应用上下文) 模块
这是基本的 Spring 模块,提供 spring 框架的基础功能,BeanFactory 是 任何以 spring 为基础的应用的核心。Spring 框架建立在此模块之上,它使 Spring 成为一个容器。

什么是 Spring 配置文件?

Spring 配置文件是 XML 文件。该文件主要包含类信息。它描述了这些类是如何配置以及相互引入的。但是,XML 配置文件冗长且更加干净。如果没有正确规划和编写,那么在大项目中管理变得非常困难。

Spring 应用程序有哪些不同组件?

Spring 应用一般有以下组件:

  • 接口 - 定义功能。
  • Bean 类 - 它包含属性,setter 和 getter 方法,函数等。
  • Spring 面向切面编程(AOP) - 提供面向切面编程的功能。
  • Bean 配置文件 - 包含类的信息以及如何配置它们。
  • 用户程序 - 它使用接

使用 Spring 有哪些方式?

使用 Spring 有以下方式:

  • 作为一个成熟的 Spring Web 应用程序。
  • 作为第三方 Web 框架,使用 Spring Frameworks 中间层。
  • 用于远程使用。
  • 作为企业级 Java Bean,它可以包装现有的 POJO(Plain Old Java Objects)。

BeanFactory – BeanFactory 实现举例。

Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。最常用的 BeanFactory 实现是 XmlBeanFactory 类

XMLBeanFactory

最常用的就是 org.springframework.beans.factory.xml.XmlBeanFactory ,它根据 XML 文件中的定义加载 beans。该容器从 XML 文件读取配置元数据并用它去创建一个完全配置的系统或应用。

解释 AOP 模块

AOP 模块用于发给我们的 Spring 应用做面向切面的开发, 很多支持由 AOP 联盟提供,这样就确保了 Spring 和其他 AOP 框架的共通性。这个模块将元数据编程引入 Spring。

解释 JDBC 抽象和 DAO 模块。

通过使用 JDBC 抽象和 DAO 模块,保证数据库代码的简洁,并能避免数据库资源错误关闭导致的问题,它在各种不同的数据库的错误信息之上,提供了一个统一的异常访问层。它还利用 Spring 的 AOP 模块给 Spring 应用中的对象提供事务管理服务。

解释对象/关系映射集成模块。

Spring 通过提供 ORM (对象关系映射)模块,支持我们在直接 JDBC 之上使用一个对象/关系映射(ORM)工具,Spring 支持集成主流的 ORM 框架,如 Hiberate,JDO 和 iBatis
SQL Maps。Spring 的事务管理同样支持以上所有 ORM 框架及 JDBC。

解释 WEB 模块。

Spring 的 WEB 模块是构建在 application context 模块基础之上,提供一个适合 web 应用的上下文。这个模块也包括支持多种面向 web 的任务,如透明地处理多个文件上传请求和程序级请求参数的绑定到你的业务对象。它也有对 Jakarta Struts 的支持。

Spring 配置文件

Spring 配置文件是个 XML 文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。

ApplicationContext 通常的实现是什么?

  • FileSystemXmlApplicationContext :此容器从一个 XML 文件中加载 beans 的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。
  • ClassPathXmlApplicationContext:此容器也从一个 XML 文件中加载 beans 的定义,这里,你需要正确设置 classpath 因为这个容器将在 classpath里找 bean 配置。
  • WebXmlApplicationContext:此容器加载一个 XML 文件,此文件定义了一个 WEB 应用的所有 bean。

一个 Spring 的应用看起来像什么?

一个定义了一些功能的接口。这实现包括属性,它的 Setter , getter 方法和函数等。 Spring AOP。Spring 的 XML 配置文件。
使用以上功能的客户端程序

IoC(控制反转)

控制反转(Inversion of Control,缩写为IoC)是一种设计思想,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。

其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),DI是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

IOC 的优点是什么?

IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和 JNDI 查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。

什么是Spring IOC容器?

Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。

Spring 框架的核心是 Spring 容器。容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期。
Spring 容器使用依赖注入来管理组成应用程序的组件。容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的指令。该元数据可以通过 XML,Java 注解或 Java 代码提供。

什么是依赖注入?

在依赖注入中,您不必创建对象,但必须描述如何创建它们。您不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由 IoC容器将它们装配在一起。

可以通过多少种方式完成依赖注入?

通常,依赖注入可以通过三种方式完成,即:

  • 构造函数注入
  • setter 注入
  • 接口注入

在 Spring Framework 中,仅使用构造函数和 setter 注入。

区分构造函数注入和 setter 注入。

构造函数注入 setter注入
没有部分注入 有部分注入
不会覆盖setter属性 会覆盖setter属性
任意修改都会创建一个新的实例 任意修改不会创建一个新的实例
适用于设置很多属性 适用于设置少量属性

spring 中有多少种 IOC 容器?

BeanFactory - BeanFactory 就像一个包含 bean 集合的工厂类。它会在客户端要求时实例化 bean。

ApplicationContext - ApplicationContext 接口扩展了 BeanFactory 接口。它在 BeanFactory 基础上提供了一些额外的功能。

区分 BeanFactory 和 ApplicationContext。(Bean 工厂和 Application contexts 有什么区别?)

Application contexts 提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜像),它们可以向注册为监听器的 bean 发布事件。另外,在容器或容器内的对象上执行的那些不得不由 bean 工厂以程序化方式处理的操作,可以在Application contexts 中以声明的方式处理。Application contexts 实现了MessageSource 接口,该接口的实现以可插拔的方式提供获取本地化消息的方法。

BeanFactory ApplicationContext
使用懒加载 使用及时加载
使用语法显式提供资源对象 自己创建和管理对象
不支持国际化 支持国际化
不支持基于依赖的注解 支持基于依赖的注解

列举 IoC 的一些好处。

IoC 的一些好处是:

  • 它将最小化应用程序中的代码量。
  • 它将使您的应用程序易于测试,因为它不需要单元测试用例中的任何单例或 JNDI 查找机制。
  • 它以最小的影响和最少的侵入机制促进松耦合。
  • 它支持即时的实例化和延迟加载服务。

Spring IoC 的实现机制

Spring 中的 IoC 的实现原理就是工厂模式加反射机制。

interface Fruit {public abstract void eat();
}class Apple implements Fruit {public void eat(){System.out.println("Apple");}}class Orange implements Fruit {public void eat(){System.out.println("Orange");}
}class Factory {public static Fruit getInstance(String ClassName) {Fruit f=null;try {f=(Fruit)Class.forName(ClassName).newInstance();} catch (Exception e) {e.printStackTrace();}return f;}}class Client {public static void main(String[] a) { Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");if(f!=null){f.eat();}}
}

Beans

什么是 spring bean?

  • 它们是构成用户应用程序主干的对象。
  • Bean 由 Spring IoC 容器管理。
  • 它们由 Spring IoC 容器实例化,配置,装配和管理。
  • Bean 是基于用户提供给容器的配置元数据创建。

Spring 框架定义的 beans 都是单例 beans。在 bean tag 中有个属性”singleton”,如果它被赋为 TRUE,bean 就是单例 ,否则就是一个 prototype bean。默认是 TRUE,所以所有在 Spring 框架中的 beans 缺省都是单件。

spring 提供了哪些配置方式?spring 支持集中 bean scope?

基于 xml 配置
bean 所需的依赖项和服务在 XML 格式的配置文件中指定。这些配置文件通常包含许多 bean 定义和特定于应用程序的配置选项。它们通常以 bean 标签开头。例如:

<bean id="studentbean" class="org.edureka.firstSpring.StudentBean"><property name="name" value="Edureka"></property>
</bean>

基于注解配置
您可以通过在相关的类,方法或字段声明上使用注解,将 bean 配置为组件类本身,而不是使用 XML 来描述 bean 装配。默认情况下,Spring 容器中未打开注解装配。因此,您需要在使用它之前在 Spring 配置文件中启用它。例如:

<beans><context:annotation-config/><!-- bean definitions go here -->
</beans>

基于 Java API 配置
Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。

  1. @Bean 注解扮演与 元素相同的角色。
  2. @Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。
    例如:

    @Configuration
    public class StudentConfig {@Beanpublic StudentBean myStudent() {return new StudentBean();}
    }
    

spring 支持集中 bean scope?(解释 Spring 支持的几种 bean 的作用域。)

Spring bean 支持 5 种 scope(Spring 框架支持以下五种 bean 的作用域):

  • Singleton(单例模式) - 每个 Spring IoC 容器仅有一个单实例。
  • Prototype(原型模式) - 每次请求都会产生一个新的实例。
  • Request - 每一次 HTTP 请求都会产生一个新的实例,并且该 bean 仅在当前 HTTP 请求内有效(作用域仅在基于 web 的 Spring ApplicationContext 情形下有效)。
  • Session - 每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效。在一个 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效。
  • Global-session - 类似于标准的 HTTP Session 作用域,不过它仅仅在基于portlet 的 web 应用中才有意义。在一个全局的 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效

Portlet 规范定义了全局 Session 的概念,它被所有构成某个 portlet web 应用的各种不同的 portlet 所共享。在 global session 作用域中定义的 bean 被限定于全局 portlet Session 的生命周期范围内。如果你在 web 中使用 global session 作用域来标识 bean,那么 web会自动当成 session 类型来使用。

仅当用户使用支持 Web 的 ApplicationContext 时,最后三个才可用。【缺省的 Spring bean 的作用域是 Singleton】

spring bean 容器的生命周期是什么样的?什么是 spring 的内部 bean?

spring bean 容器的生命周期流程如下:

  1. Spring 容器根据配置中的 bean 定义中实例化 bean。
  2. Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。
  3. 如果 bean 实现BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用setBeanName()。
  4. 如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()。
  5. 如果存在与 bean 关联的任何BeanPostProcessors,则调用 preProcessBeforeInitialization() 方法。
  6. 如果为 bean 指定了 init 方法( 的 init-method 属性),那么将调用它。
  7. 最后,如果存在与 bean 关联的任何 BeanPostProcessors,则将调用 postProcessAfterInitialization() 方法。
  8. 如果 bean 实现DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。
  9. 如果为bean 指定了 destroy 方法( 的 destroy-method 属性),那么将调用它。

什么是 spring 的内部 bean?

只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean,Spring 的基于 XML 的配置元数据在 <property><constructor-arg> 中提供了 <bean> 元素的使用。内部 bean 总是匿名的,它们总是作为原型。

例如,假设我们有一个 Student 类,其中引用了 Person 类。这里我们将只创建一个 Person 类实例并在 Student 中使用它。

Student.java
public class Student {private Person person;//Setters and Getters
}Person.java
public class Person {private String name;private String address;//Setters and Getters
}bean.xml
<bean id=“StudentBean" class="com.edureka.Student"><property name="person"><!--内部 bean (This is inner bean)  --><bean class="com.edureka.Person"><property name="name" value=“Scott"></property><property name="address" value="Bangalore"></property></bean></property>
</bean>

什么是 spring 装配( bean 装配)? 什么是 bean 的自动装配?自动装配有哪些方式? 自动装配有什么局限?

装配或 bean 装配是指在 Spring 容器中把 bean 组装到一起,前提是容器需要知道 bean 的依赖关系,如何通过依赖注入来把它们装配到一起。

什么是 bean 的自动装配?自动装配有哪些方式?

Spring 容器能够自动装配相互合作的 bean,也就是说,可以通过检查 BeanFactory 的内容让 Spring 自动解析 bean 的协作者,这意味着容器不需要配置什么,就能通过 Bean 工厂自动处理 bean 之间的协作。

自动装配的不同模式(5种)

  • no :默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配

  • byName:通过参数名 自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。

  • byType::通过参数类型自动装配,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byType,之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多个 bean 符合条件,则抛出错误。

  • constructor(构造函数):这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。

  • autodetect(自动检测):首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式

自动装配有什么局限?

自动装配的局限性是:

  • 重写:你仍需用 和 配置来定义依赖,意味着总要重写自动装配。
  • 基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。
  • 模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。

如何给 Spring 容器提供配置元数据? 你怎样定义类的作用域?

一个 Spring Bean 定义 包含什么?
一个 Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。

这里有三种重要的方法给 Spring 容器提供配置元数据。

  • XML 配置文件。
  • 基于注解的配置。
  • 基于 java 的配置。

你怎样定义类的作用域?

当定义一个 在 Spring 里,我们还能给这个 bean 声明一个作用域。它可以通过bean 定义中的 scope 属性来定义。如,当 Spring 要在需要的时候每次生产一个新的 bean 实例,bean 的 scope 属性被指定为 prototype。另一方面,一个 bean 每次使用的时候必须返回同一个实例,这个 bean 的 scope 属性 必须设为singleton。

Spring 框架中的单例 bean 是线程安全的吗?

不,Spring 框架中的单例 bean 不是线程安全的。

解释 Spring 框架中 bean 的生命周期。

  • Spring 容器 从 XML 文件中读取 bean 的定义,并实例化 bean。
  • Spring 根据 bean 的定义填充所有的属性。
  • 如果 bean 实现了 BeanNameAware 接口,Spring 传递 bean 的 ID 到setBeanName 方法。
  • 如果 Bean 实现了 BeanFactoryAware 接口, Spring 传递beanfactory 给 setBeanFactory 方法。
  • 如果有任何与 bean 相关联的 BeanPostProcessors,Spring 会在postProcesserBeforeInitialization()方法内调用它们。
  • 如果 bean 实现 IntializingBean 了,调用它的 afterPropertySet 方法,如果 bean 声明了初始化方法,调用此初始化方法。
  • 如果有 BeanPostProcessors 和 bean 关联,这些 bean 的postProcessAfterInitialization() 方法将被调用。
  • 如果 bean 实现了 DisposableBean,它将调用 destroy()方法。

哪些是重要的 bean 生命周期方法?你能重载它们吗?在 Spring 中如何注入一个 java 集合?

有两个重要的 bean 生命周期方法,
第一个是 setup , 它是在容器加载 bean的时候被调用。
第二个方法是 teardown 它是在容器卸载类的时候被调用。

The bean 标签有两个重要的属性(init-methoddestroy-method)。用它们你可以自己定制初始化和注销方法。它们也有相应的注(@PostConstruct 和@PreDestroy)。

在 Spring 中如何注入一个 java 集合?

Spring 提供以下几种集合的配置元素:

  • 类型用于注入一列值,允许有相同的值。
  • 类型用于注入一组值,不允许有相同的值。
  • 类型用于注入一组键值对,键和值都可以为任意类型。
  • 类型用于注入一组键值对,键和值都只能为 String 类型。

你可以在 Spring 中注入一个 null 和一个空字符串吗?

可以。

注解

什么是基于Java 的 Spring注解的容器配置

不使用 XML 来描述 bean 装配,开发人员通过在相关的类,方法或字段声明上使用注解将配置移动到组件类本身。它可以作为 XML 设置的替代方案。(基于 Java 的配置,允许你在少量的 Java 注解的帮助下,进行你的大部分 Spring配置而非通过 XML 文件。)

例如:
Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现

@Bean 注解扮演与 元素相同的角色。 @Configuration 类允许通过简单地调
用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。
例如:

@Configuration
public class StudentConfig {@Beanpublic StudentBean myStudent() {return new StudentBean();}
}

什么是基于注解的容器配置?

相对于 XML 文件,注解型的配置依赖于通过字节码元数据装配组件,而非尖括号的声明。
开发者通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用 xml 表述 bean 的装配关系。

如何在 spring 中启动注解装配?

默认情况下,Spring 容器中未打开注解装配。因此,要使用基于注解装配,我们必须通过配置 <context:annotation-config/> 元素在 Spring 配置文件中启用它。

@Component注解和3个衍生注解@Repository,@Service,@Controller有何区别?

  • @Component :这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。

web开发,提供3个@Component注解衍生注解(功能一样)取代

  • @Repository(“名称”):dao层——这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。

  • @Service(“名称”):service层——此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用@Service 而不是 @Component,因为它以更好的方式指定了意图。

  • @Controller(“名称”):web层——这将一个类标记为 Spring Web MVC 控制器。标有它的Bean 会自动导入到 IoC 容器中。

其他注解
@Resource(“名称”)
@ PostConstruct 自定义初始化
@ PreDestroy 自定义销毁

@Required 、@Qualifier 、@RequestMapping、 @Reference、@Autowired、@Resource注解

Required注释为为了保证所对应的属性必须被设置,@Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException (bean初始化异常 )异常

《Spring 的@Required注释》

@Required 注解有什么用?

@Required 应用于 bean 属性 setter 方法。此注解仅指示必须在配置时使用
bean 定义中的显式属性值或使用自动装配填充受影响的 bean 属性。如果尚未填充受影响的 bean 属性,则容器将抛出 BeanInitializationException。
示例:

public class Employee {private String name;@Requiredpublic void setName(String name){this.name=name;}public string getName(){return name;}
}

@Autowired 注解有什么用?( 自动根据类型注入)

@Autowired 可以更准确地控制应该在何处以及如何进行自动装配。此注解用于在 setter 方法,构造函数,具有任意名称或多个参数的属性或方法上自动装配bean。默认情况下,它是类型驱动的注入。

public class Employee {private String name;@Autowiredpublic void setName(String name) {this.name=name;}public string getName(){return name;}
}

@Qualifier 注解有什么用?(指定自动注入的id名称)

当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,您可以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean来消除歧义。
例如,这里我们分别有两个类,Employee 和 EmpAccount。在 EmpAccount
中,使用@Qualifier 指定了必须装配 id 为 emp1 的 bean。
Employee.java

public class Employee {private String name;@Autowiredpublic void setName(String name) {this.name=name;}public string getName() {return name;}
}

EmpAccount.java

public class EmpAccount {private Employee emp;@Autowired@Qualifier(emp1)public void showName() {System.out.println(“Employee name : ”+emp.getName);}
}

@RequestMapping 注解有什么用?

@RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可应用于两个级别:

类级别:映射请求的 URL
方法级别:映射 URL 以及 HTTP 请求方法

//类级别:映射请求的 URL
@RequestMapping("/dept")
public class DeptController {// 方法级别:映射 URL 以及 HTTP 请求方法     //http://localhost:8081/dept/ad@RequestMapping("/ad")public boolean addDept(Dept dept) {return deptService.addDept(dept);}
}

@Reference、@Autowired和@Resource的区别

  • @Reference:是dubbo的注解,也是注入,他一般注入的是分布式的远程服务的对象,需要dubbo配置使用。

  • @Autowired( 自动根据类型注入):org.springframework.beans.factory.annotation.Autowired
    SpringBoot项目中常用。简单来说就是引入由Spring容器管理的bean。

  • @Resource:javax.annotation.Resource
    作用相当于@Autowired,只不过@Autowired是byType自动注入,而@Resource默认byName自动注入。

    简单来说他们的区别:
    @Reference注入的是分布式中的远程服务对象,
    @Resource和@Autowired注入的是本地spring容器中的对象。

web开发,提供3个@Component注解衍生注解(功能一样)取代

@Repository(“名称”):dao层
@Service(“名称”):service层
@Controller(“名称”):web层

@Autowired:自动根据类型注入
@Qualifier(“名称”):指定自动注入的id名称

@Resource(“名称”)
@ PostConstruct 自定义初始化
@ PreDestroy 自定义销毁

数据访问

spring DAO 有什么用?列举 Spring DAO 抛出的异常。

Spring DAO 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许您在编写代码时,无需考虑捕获每种技术不同的异常。

列举 Spring DAO 抛出的异常。


推荐:Spring的DAO异常-你可能忽视的异常

spring JDBC API 中存在哪些类?

  • JdbcTemplate
  • SimpleJdbcTemplate
  • NamedParameterJdbcTemplate
  • SimpleJdbcInsert
  • SimpleJdbcCall

在 Spring 框架中如何更有效地使用 JDBC?使用 Spring 访问 Hibernate 的方法有哪些?

使用 SpringJDBC 框架,资源管理和错误处理的代价都会被减轻。所以开发者只需写 statements 和 queries 从数据存取数据,JDBC 也可以在 Spring 框架提供的模板类的帮助下更有效地被使用,这个模板叫 JdbcTemplate

JdbcTemplate
JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处理。

使用 Spring 访问 Hibernate 的方法有哪些?

我们可以通过两种方式使用 Spring 访问 Hibernate:

  1. 使用 Hibernate 模板和回调(Callback)进行控制反转
  2. 扩展继承 HibernateDAOSupport 并提供一个 AOP 拦截器节点

spring 事务

列举 spring 支持的事务管理类型

Spring 支持两种类型的事务管理:

  1. 程序化事务管理:在此过程中,在编程的帮助下管理事务。它为您提供极大的灵活性,但维护起来非常困难。

  2. 声明式事务管理:在此,事务管理与业务代码分离。仅使用注解或基于 XML的配置来管理事务。

Spring中的事务管理

回顾事务
把一组业务当成一个业务来做;要么都成功,要么都失败!事务在项目开发中,十分重要,涉及到数据的一致性问题,不能马虎确保完整性和一致性

事务的ACID原则:

  • 原子性(atomicity)
    事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用
  • 一致性(consistency)
    一旦所有事务动作完成,事务就要被提交。数据和资源处于一种满足业务规则的一致性状态中
  • 隔离性(isolation)
    多个业务可能操作同一个资源,防止数据损坏
  • 持久性(durability)
    事务一旦提交,无论系统发生什么问题,结果都不会再被影响,被持久化的写到存储器中!

Spring 支持的事务管理类型

  • 声明式事务:AOP ,一般情况下比编程式事务好用。
    将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。(你只需用注解和 XML 配置来管理事务。)
    将事务管理作为横切关注点,通过aop方法模块化。Spring中通过Spring AOP框架支持声明式事务管理
    总结:对应用代码影响最小,符合轻量级的思想【推荐】

  • 编程式事务:需要在代码中,进行事务的管理
    将事务管理代码嵌到业务方法中来控制事务的提交和回滚
    缺点:必须在每个事务操作业务逻辑中包含额外的事务管理代码
    总结:灵活性大,但是维护难

使用Spring管理事务,注意头文件的约束导入 : tx

    xmlns:tx="http://www.springframework.org/schema/tx"http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd">

事务管理器
无论使用Spring的哪种事务管理策略(编程式或者声明式)事务管理器都是必须的 就是 Spring的核心事务管理抽象,管理封装了一组独立于技术的方法。
JDBC事务

 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean>

配置事务的通知

<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!--配置哪些方法使用什么样的事务,配置事务的传播特性--><tx:method name="add" propagation="REQUIRED"/><tx:method name="delete" propagation="REQUIRED"/><tx:method name="update" propagation="REQUIRED"/><tx:method name="search*" propagation="REQUIRED"/><tx:method name="get" read-only="true"/><tx:method name="*" propagation="REQUIRED"/></tx:attributes>
</tx:advice>

spring事务传播特性:

事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。spring支持7种事务传播行为:

  • propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
  • propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
  • propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
  • propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
  • propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
  • propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

Spring 框架的事务管理有哪些优点?

  1. 它为不同的事务 API 如 JTA,JDBC,Hibernate,JPA 和 JDO,提供一个不变的编程模式。
  2. 它为编程式事务管理提供了一套简单的 API 而不是一些复杂的事务 API
  3. 它支持声明式事务管理。
  4. 它和 Spring 各种数据访问抽象层很好得集成

你更倾向用那种事务管理类型?

大多数 Spring 框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。

spring 支持哪些 ORM (对象关系映射)框架

  • Hibernate
  • iBatis(mybatis)
  • JPA (Java Persistence API)
  • JDO (Java Data Objects)
  • OJB
  • TopLink

如何通过HibernateDaoSupport将Spring和Hibernate结合起来?

用 Spring 的 SessionFactory 调用 LocalSessionFactory。集成过程分三步:

  1. 配置 the Hibernate SessionFactory。
  2. 继承 HibernateDaoSupport 实现一个 DAO。
  3. 在 AOP 支持的事务中装配。

Spring 面向切面编程——AOP(切面、切点、通知)

什么是 AOP?

AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与OOP 不同的抽象软件结构的视角. 在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面)

AOP通过 预编译方式 和 运行期动态代理 实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

Aop在Spring中的作用
提供声明式事务;允许用户自定义切面

以下名词需要了解下:

  • 横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志 , 安全 , 缓存 , 事务等等

  • 切面(ASPECT):横切关注点 被模块化 的特殊对象。即,它是一个类。Log

  • 通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。Log方法

  • 目标(Target):被通知对象。接口

  • 代理(Proxy):向目标对象应用通知之后创建的对象。代理类

  • 切入点(PointCut):切面通知 执行的 “地点”的定义。method

  • 连接点(JointPoint):与切入点匹配的执行点。invoke

SpringAOP中,通过Advice定义横切逻辑,Spring中支持5种类型的Advice:

通知类型 连接点 实现接口
前置通知    方法前 org.springframework.aop.MethodBeforeAdvice
后置通知    方法后 org.springframework.aop.AfterReturningAdvice
环绕通知    方法前后    org.aopalliance.intercept.MethodInterceptor
异常抛出通知  方法抛出异常  org.springframework.aop.ThrowsAdvice
引介通知    类中增加新的方法属性  org.springframework.aop.IntroductionInterceptor
即 Aop 在 不改变原有代码的情况下 , 去增加新的功能 .

什么是 Aspect(切面)?

AOP 核心就是切面(Aspect),它将多个类的通用行为封装成可重用的模块,该模块含有一组 API 提供横切功能。比如,一个日志模块可以被称作日志的 AOP 切面。根据需求的不同,一个应用程序可以有若干切面。在 Spring AOP 中,切面通过带有@Aspect 注解的类实现。

《AspectJ的切入点表达式—execution表达式详解》

aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定的连接点中

AOP 的工作重心在于如何将增强编织目标对象的连接点上, 这里包含两个工作:

  1. 如何通过 pointcut 和 advice 定位到特定的 joinpoint 上
  2. 如何在advice 中编写切面代码


可以简单地认为, 使用 @Aspect 注解的类就是切面.

什么是切点(JoinPoint)

程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理. 在 Spring AOP 中, join point 总是方法的执行点。
【切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。】

什么是通知(Advice)?

特定 JoinPoint 处的 Aspect 所采取的动作称为 Advice。Spring AOP 使用一
个 Advice 作为拦截器,在 JoinPoint “周围”维护一系列的拦截器。

有哪些类型的通知(Advice)?

  • Before - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用@Before 注解标记进行配置。
  • After Returning - 这些类型的 Advice 在连接点方法正常执行后执行,并使用@AfterReturning 注解标记进行配置。
  • After Throwing - 这些类型的 Advice 仅在 joinpoint 方法通过抛出异常退出并使用 @AfterThrowing 注解标记配置时执行。
  • After (finally) - 这些类型的 Advice 在连接点方法之后执行,无论方法退出是正常还是异常返回,并使用 @After 注解标记进行配置。
  • Around - 这些类型的 Advice 在连接点之前和之后执行,并使用@Around 注解标记进行配置。

在 Spring AOP 中,关注点和横切关注的区别是什么?连接点?通知?

  • 关注点 :concern 关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。。

  • 横切关注点:cross-cutting concern 横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

  • 连接点:连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个 AOP 切面,它实际上是个应用程序执行 Spring AOP 的位置。

  • 通知:通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP 框架触发的代码段。

Spring 切面可以应用五种类型的通知:

  • before:前置通知,在一个方法执行前被调用。
  • after: 在方法执行之后调用的通知,无论方法执行是否成功。
  • after-returning: 仅当方法成功完成后执行的通知。
  • after-throwing: 在方法抛出异常退出时执行的通知。
  • around: 在方法执行之前和之后调用的通知。

什么是引入?

引入允许我们在已存在的类中增加新的方法和属性。

AOP 有哪些实现方式?(动态代理、静态代理)

实现 AOP 的技术,主要分为两大类:动态代理、静态代理

静态代理:指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强

  • 编译时编织(特殊编译器实现)

  • 类加载时编织(特殊的类加载器实现)。

    好处
    可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
    公共也就交给代理角色!实现了业务的分工!
    公共业务发生扩展的时候,方便集中管理!

    缺点
    一个真实角色就会产生一个代理角色;
    代码量会翻倍-开发效率会变低

动态代理:在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强

  • JDK 动态代理(基于接口)

  • CGLIB(基于类)

    动态代理
    1. 动态代理和静态代理角色一样
    2. 动态代理的代理类是动态生成的,不是 我们直接写好的!
    3. 动态代理分为两大类:基于接口的动态代理、基于类的动态代理
    4. 基于接口:JDK动态代理【我们在这里使用】
    5. 基于类:cglib
    6. java字节码实现:javasist

需要了解两个类:Proxy:代理;InvocationHandler:调用处理程序

  • 动态代理的好处
    可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
    公共也就交给代理角色!实现了业务的分工!
    公共业务发生扩展的时候,方便集中管理!
    一个动态代理类代理的是一个接口,一般就是对应的一类业务
    一个动态代理类可以代理多个类,只要是实现了同一个接口即可【核心】

Spring AOP and AspectJ AOP 有什么区别?

Spring AOP 基于动态代理方式实现;AspectJ 基于静态代理方式实现。Spring AOP 仅支持方法级别的 PointCut;提供了完全的 AOP 支持,它还支持属性级别的 PointCut。

什么是目标对象? 什么是代理?如何理解 Spring 中的代理?有几种不同类型的自动代理?

被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知
(advised)对象。

什么是代理?

代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

如何理解 Spring 中的代理?

将 Advice 应用于目标对象后创建的对象称为代理。在客户端对象的情况下,目标对象和代理对象是相同的。
Advice + Target Object = Proxy

有几种不同类型的自动代理?

  • BeanNameAutoProxyCreator
  • DefaultAdvisorAutoProxyCreator
  • Metadata autoproxying

什么是编织(Weaving)?(或者什么叫织入?)什么是织入应用的不同点?

织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程。
织入可以在编译时,加载时,或运行时完成。
请参考下图:

配置AOP(导入aop的头文件!)

<!--配置aop织入事务-->
<aop:config><aop:pointcut id="txPointcut" expression="execution(* nuc.ss.dao.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>

解释基于 XML Schema 方式的切面实现

在这种情况下,切面由常规类以及基于 XML 的配置实现。

解释基于注解的切面实现

在这种情况下(基于@AspectJ 的实现),涉及到的切面声明的风格与带有 java5 标注的普通 java 类一致。

依赖注入

什么是spring的依赖注入?有哪些不同类型的 IOC(依赖注入)方式?推荐哪种注入方式?

依赖注入,是 IOC(控制反转) 的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC 容器)负责把他们组装起来。

有哪些不同类型的 IOC(依赖注入)方式?

  • 构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。

  • Setter 方法注入:Setter 方法注入是容器通过调用无参构造器或无参static 工厂 方法实例化 bean 之后,调用该 bean 的 setter 方法,即实现了基于 setter 的依赖注入。

哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入?

你两种依赖方式都可以使用,构造器注入和 Setter 方法注入。最好的解决方案是用构造器参数实现强制依赖,setter 方法实现可选依赖。

简单工厂和抽象工厂有什么区别?

  • 简单工厂:用来生产同一等级结构中的任意产品,对于增加新的产品,无能为力。
  • 工厂方法:用来生产同一等级结构中的固定产品,支持增加任意产品。
  • 抽象工厂:用来生产不同产品族的全部产品,对于增加新的产品,无能为力;支持增加产品族。

说一下你熟悉的设计模式

  • 单例模式:保证被创建一次,节省系统开销。

  • 工厂模式(简单工厂、抽象工厂):解耦代码。

  • 观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。

  • 外观模式:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。

  • 模版方法模式:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。

  • 状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

为什么说spring是一个容器?

Spring的核心理念就是更方便地管理Java Bean,而被管理的Java Bean存缓存在一个Map中,这个Map就可以理解为用来装Java Bean的容器,即IOC容器

你怎样定义类的作用域?

当定义一个 在Spring里,我们还能给这个bean声明一个作用域。它可以通过bean 定义中的scope属性来定义。如,当Spring要在需要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。另一方面,一个bean每次使用的时候必须返回同一个实例,这个bean的scope 属性 必须设为 singleton(单例)。
《类的作用域》

怎样开启注解装配?

默认不开启 为了使用注解装配,我们必须在Spring配置文件中配置 <context:annotation-config/>元素。

Spring的MVC

SpringMVC学习:SpringMVC执行流程【重点】回顾MVCHelloSpringMVC执行原理结果跳转的方式数据如何处理乱码问题ControllerRestFul风格【重点】整合 SSM项目【重点】JSONAjax拦截器

SpringMVC官方文档
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。
Spring 配备构建 Web 应用的全功能 MVC 框架。Spring 可以很便捷地和其他MVC 框架集成,如 Struts,Spring 的 MVC 框架用控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声明的方式把请求参数和业务对象绑定。

Spring MVC的特点:

  1. 轻量级,简单易学
  2. 高效 , 基于请求响应的MVC框架
  3. 与Spring兼容性好,无缝结合
  4. 约定优于配置
  5. 功能强大:Restful、数据验证、格式化、本地化、主题等
  6. 简洁灵活

SpringMVC框架的优点

(1)SpringMVC框架提供了一整套完善的组件。
(2)SpringMVC是以强大的Spring容器为基础的框架。
(3)框架的配置简单又不失灵活性。
(4)代码的可重用性很高。
(5)可扩展性好。

我们为什么要学习SpringMVC呢?

正因为SpringMVC好 , 简单 , 便捷 , 易学 , 天生和Spring无缝集成(使用SpringIoC和Aop) , 使用约定优于配置 . 能够进行简单的junit测试 . 支持Restful风格 .异常处理 , 本地化 , 国际化 , 数据验证 , 类型转换 , 拦截器 等等…所以我们要学习

Spring MVC 框架有什么用?

Spring Web MVC 框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。

SpringMVC执行原理

原图:

中文图:

我对执行原理的理解(图解)

控制器接收用户的请求,然后调用model层来完成业务,model将处理结果返回给控制层,控制层根据model返回的结果调用view视图层,进行渲染视图,然后视图层返回控制到控制层,最后控制层将view的页面结果展示给客户。

图解1(自己作的图):

SpringMVC常用的注解有哪些?

  • @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
  • @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
  • @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
    案例代码来自:https://blog.csdn.net/originations/article/details/89492884后台 Controller类中对应的方法:
    @RequestMapping("/login.do")
    @ResponseBody
    public Object login(String name, String password, HttpSession session) {user = userService.checkLogin(name, password);session.setAttribute("user", user);return new JsonResult(user);
    }@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml格式 或者 json等】封装为对应的 JavaBean 对象,
    封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
    如上面的登录后台代码可以改为:
    @RequestMapping("/login.do")//以该地址作为请求该方法的父路径
    @ResponseBody //注解实现将controller方法返回对象转化为json对象响应给客户
    public Object login(@RequestBody User loginUuser, HttpSession session) {//@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。user = userService.checkLogin(loginUser);session.setAttribute("user", user);return new JsonResult(user);
    }
    

图解2(来源于网络):

描述一下 DispatcherServlet 的工作流程

DispatcherServlet (分发器)的工作流程可以用一幅图来说明:

1、向服务器发送 HTTP 请求,请求被前端控制器 DispatcherServlet 捕获。
2、DispatcherServlet 根据 -servlet.xml 中的配置对请求的 URL 进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用 HandlerMapping获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
3、 DispatcherServlet 根据获得的 Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得 HandlerAdapter 后,此时将开始
执行拦截器的 preHandler(...)方法)。
4、提取 Request 中的模型数据,填充 Handler 入参,开始执行 Handler( Controller)。在填充 Handler 的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:- HttpMessageConveter:将请求消息(如 Json、xml 等数据)转换成一个对象,将对象转换为指定的响应信息。- 数据转换:对请求消息进行数据转换。如 String 转换成 Integer、Double 等。-  数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。-  数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult 或 Error 中。
5、Handler(Controller)执行完成后,向 DispatcherServlet 返回一个ModelAndView 对象;
6、根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver)返回给DispatcherServlet。
7、 ViewResolver 结合 Model 和 View,来渲染视图。
8、视图负责将渲染结果返回给客户端。

介绍一下 WebApplicationContext(上下文对象)

WebApplicationContext 继承了 ApplicationContext 并增加了一些 WEB 应用
必备的特有功能,它不同于一般的 ApplicationContext ,因为它能处理主题,并找到被关联的 servlet。
英文原文链接

什么是 Spring MVC 框架的控制器?

控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring 用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。

@Controller 、@RequestMapping 、@Autowired 注解

  • @Controller:该注解表明该类扮演控制器的角色,Spring 不需要你继承任何其他控制器基类或引用 Servlet API。

  • @RequestMapping:该注解是用来映射一个 URL 到一个类或一个特定的方处理法上。(将 http 请求映射到相应的类/方法上。)

  • @Autowired :它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,通过@Autowired 的使用来消除 set/get 方法。

spring mvc 有哪些组件?

  • DispatcherServlet:前置控制器(前台控制器 / 控制中心 / 中央处理器)
  • HandlerMapping :映射控制器(处理器映射器)
  • Controller:处理器 (后台控制器)。
  • ModelAndView:模型和视图 。
  • ViewResolver:视图解析器。

Spring Boot

 Spring Boot学习:Spring Boot是什么yaml配置自动装配继承web开发【业务的核心】继承数据库 Druid分布式开发:Dubbo(RPC)+zookeeperswagger:接口文档任务调度SpringSecurity:Shiro

什么是springboot?

Spring Boot是Spring家族的一个子项目,其设计初衷是为了简化Spring配置,从而可以轻松构建独立运行的程序,并极大提高开发效率。

  • Spring Boot是基于Spring框架开发的全新框架,其设计目的是简化新Spring应用的初始化搭建和开发过程。
  • Spring Boot整合了许多框架和第三方库配置,几乎可以达到“开箱即用”。

为什么要使用springboot?

  1. 独立运行:Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。
  2. 简化配置:spring-boot-starter-web启动器自动依赖其他组件,简少了maven的配置
  3. 自动配置:Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。
  4. 无代码生成和XML配置:Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。
  5. 应用监控:Spring Boot提供一系列端点可以监控服务及应用,做健康检测。

springBoot优点

  1. 减少开发,测试时间和努力。
  2. 使用 JavaConfig 有助于避免使用 XML
  3. 避免大量的 Maven 导入和各种版本冲突。
  4. 提供意见发展方法。
  5. 通过提供默认值快速开始开发。
  6. 没有单独的 Web 服务器需要。这意味着你不再需要启动 Tomcat,Glassfish或其他任何东西。
  7. 需要更少的配置 因为没有 web.xml 文件。只需添加用@ Configuration 注释的类,然后添加用@Bean 注释的方法,Spring 将自动加载对象并像以前一样对其进行管理。您甚至可以将@Autowired 添加到 bean 方法中,以使 Spring 自动装入需要的依赖关系中。
  8. 基于环境的配置 使用这些属性,您可以将您正在使用的环境传递到应用程序:
    -Dspring.profiles.active = {enviornment}。在加载主应用程序属性文件后,Spring 将在(application{environment} .properties)中加载后续的应用程序属性文件。

什么是 JavaConfig?

Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC 容器的纯Java 方法。因此它有助于避免使用 XML 配置。
使用 JavaConfig 的优点在于:

  1. 面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean 方法等。

  2. 减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XML 和 Java 之间来回切换。JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。从技术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将JavaConfig 与 XML 混合匹配是理想的。

  3. 类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。由于 Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。

SpringBoot 自动装配的原理

@SpringBootApplication(主启动类注解):@SpringBootConfiguration(springboot的配置类):@Configuration@Component@ComponentScan(扫描组件【扫描包并注入】)@EnableAutoConfiguration( 自动装配,导入包)【核心】:@AutoConfigurationPackage(自动配置包):@Import({Registrar.class}) 自动注册表:@Import(AutoConfigurationPackages.Registrar.class) ,导⼊了⼀个Registrar 的组件,这个注解的作用就是将主配置类(@SpringBootConfiguration标注的类)所在的包及其下面所有子包里面所有的组件扫描到IOC容器中。所以说,默认情况下主配置类所在包及其子包以外的组件,Spring IOC容器是扫描不到的。@Import({AutoConfigurationImportSelector.class})(自动导入包的核心):通过@Import导入了AutoConfigurationImportSelector类,而这个类的selectImports方法会通过SpringFactoriesLoader得到大量的配置类。而每个配置类则根据条件化配置类做出决策,以实现自动配置的功能.(重点是 AutoConfigurationImportSelector 选择了什么东西)getAutoConfigurationEntry()获得自动配置的实体getCandidateConfigurations()获取候选的配置public static List<String> loadFactoryNames()获取所有的加载配置loadSpringFactories()项目资源:classLoader.getResources(FACTORIES_RESOURCE_LOCATION)  "META-INF/spring.factories" 从这里获取 :spring-boot-autoconfigure\2.5.6\spring-boot-autoconfigure-2.5.6.jar ——META-INF—— spring.factories   所有的自动配置类都在这里       思考:这么多自动配置为什么没有生效,需要导入对应的 start 才能有作用!!!  核心注解:@ConditionalOnXXX:如果这里面的(判断)条件都满足就生效系统资源:classLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION)从这些资源中遍历了所有的元素  nextElement(自动配置),遍历完后封装为properties供我们使用-----------------------------
getCandidateConfigurations()   获取候选的配置:
//标注了 EnableAutoConfiguration 注解的类
protected Class<?> getSpringFactoriesLoaderFactoryClass() {return EnableAutoConfiguration.class;
}
-----------------------

自动装配主要做了3件事:

  1. 从classpath下获取所有META-INF/spring.factories这个文件下的信息。
  2. 将上面获取到的信息封装成Enumeration返回
  3. 遍历Enumeration,然后获取key为EnableAutoConfiguration下的所有值。

概述整个自动装配的过程:
位于META_INF目录下的spring.factories,存放相关组件的配置工厂类;@EnableAutoConfiguration核心配置注解,
里面有一个AutoConfigurationImportSelector(自动配置文件收集器),收集配置文件中的配置工厂类,
然后SpringFactoriesLoader加载组件工厂(抽象工厂模式),进行实例化,在spring上下文中,生成bean。

结论:springboot所有的自动配置都是在启动的时候扫描并加载:spring.factories 所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入对应的start,就有对应的启动器了,有了启动器自动装配才会生效,然后就配置成功了!

spring boot 核心配置文件是什么?配置文件有哪几种类型?它们有什么区别?

spring boot 核心的两个配置文件:

  • bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,且 boostrap 里面的属性不能被覆盖;

  • application (. yml 或者 . properties):用于 spring boot 项目的自动化配置。

spring boot 配置文件有哪几种类型?它们有什么区别?

配置文件有 . properties 格式和 . yml 格式,它们主要的区别是书法风格不同。
. properties 配置如下:

# -----------数据库数据源相关配置-------------
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&userUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#整合mybatis
mybatis.type-aliases-package=com.hh.pojo
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

. yml 配置如下:

server:port: 8081
spring:profiles:active: dev
---
server:port: 8082
spring:profiles: dev---
server:port: 8083
spring:profiles: test

. yml 格式不支持 @PropertySource 注解导入。

如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?(热部署)

这可以使用 dev工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式tomcat 将重新启动。Spring Boot 有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力。Java 开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务器。开发人员可以重新加载 Spring Boot 上的更改,而无需重新启动服务器。这将消除每次手动部署更改的需要。Spring Boot 在发布它的第一个版本时没有这个功能。这是开发人员最需要的功能。DevTools 模块完全满足开发人员的需求。该模块将在生产环境中被禁用。它还提供 H2 数据库控制台以更好地测试应用程序。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional>
</dependency>

spring boot 有哪些方式可以实现热部署?

  • 使用 devtools 启动热部署,添加 devtools 库,在配置文件中把 spring. devtools. restart. enabled 设置为 true;

  • 使用 Intellij Idea 编辑器,勾上自动编译或手动重新编译。

<!--热部署工具-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId>
</dependency><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

热部署就是当应用程序正在运行的时候升级软件或修改某一部分代码、配置文件时,无需重新启动应用, 即可使升级的软件和修改后的代码、配置文件生效。

Spring Boot 中的监视器是什么?

Spring boot actuator 是 spring 启动框架中的重要功能之一。
Spring boot 监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为 HTTP URL 访问的REST 端点来检查状态。

如何在 Spring Boot 中禁用 Actuator 端点安全性?

默认情况下,所有敏感的 HTTP 端点都是安全的,只有具有 ACTUATOR 角色的用户才能访问它们。
安全性是使用标准的 HttpServletRequest.isUserInRole 方法实施的。
我们可以使用来禁用安全性。只有在执行机构端点在防火墙后访问时,才建议禁用安全性。

如何在自定义端口上运行 Spring Boot 应用程序?

为了在自定义端口上运行 Spring Boot 应用程序,您可以在
application.properties 中指定端口server.port = 8090

什么是 YAML?

YAML是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。YAML 的配置文件后缀为 .yml,如:runoob.yml

基本语法

大小写敏感
使用缩进表示层级关系
缩进不允许使用tab,只允许空格
缩进的空格数不重要,只要相同层级的元素左对齐即可
'#'表示注释

数据类型
YAML 支持以下几种数据类型:

对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
纯量(scalars):单个的、不可再分的值

如何实现 Spring Boot 应用程序的安全性?

为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter 并覆盖其方法。

如何集成 Spring Boot 和 ActiveMQ?

对于集成 Spring Boot 和 ActiveMQ,我们使用
依赖关系。 它只需要很少的配置,并且不需要样板代码。

如何使用 Spring Boot 实现分页和排序?

使用 Spring Boot 实现分页非常简单。使用 Spring Data-JPA 可以实现将可分页的传递给存储库方法。

什么是 Swagger?你用 Spring Boot 实现了它吗?

Swagger 广泛用于可视化 API,使用 Swagger UI 为前端开发人员提供在线沙箱。
Swagger 是用于生成 RESTful Web 服务的可视化表示的工具,规范和完整框架实现。它使文档能够以与服务器相同的速度更新。当通过 Swagger 正确定义时,消费者可以使用最少量的实现逻辑来理解远程服务并与其进行交互。因此,Swagger消除了调用服务时的猜测。

什么是 Spring Profiles?

Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因 此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 production中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于 QA 环 境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot 使得使用配置文件非常简单。

什么是 Spring Batch?

Spring Boot Batch 提供可重用的函数,这些函数在处理大量记录时非常重要,包括日志/跟踪,事务管理,作业处理统计信息,作业重新启动,跳过和资源管理。它还提供了更先进的技术服务和功能,通过优化和分区技术,可以实现极高批量和高性能批处理作业。简单以及复杂的大批量批处理作业可以高度可扩展的方式利用框架处理重要大量的信息。

什么是 FreeMarker 模板?

FreeMarker 是一个基于 Java 的模板引擎,最初专注于使用 MVC 软件架构进行动态网页生成。使用 Freemarker 的主要优点是表示层和业务层的完全分离。程序员可以处理应用程序代码,而设计人员可以处理 html 页面设计。最后使用freemarker 可以将这些结合起来,给出最终的输出页面。

如何使用 Spring Boot 实现异常处理?

Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。 我们通过实现一个 ControlerAdvice 类,来处理控制器类抛出的所有异常。

您使用了哪些 starter maven 依赖项?

使用了下面的一些依赖项

  • spring-boot-starter-activemq
  • spring-boot-starter-security

这有助于增加更少的依赖关系,并减少版本的冲突。

什么是 CSRF 攻击?

CSRF 代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的Web 应用程序上执行不需要的操作。CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。

什么是 WebSockets?

\WebSocket 是一种计算机通信协议,通过单个 TCP 连接提供全双工通信信道。

  1. WebSocket 是双向的 -使用 WebSocket 客户端或服务器可以发起消息发送。
  2. WebSocket 是全双工的 -客户端和服务器通信是相互独立的。
  3. 单个 TCP 连接 -初始连接使用 HTTP,然后将此连接升级到基于套接字的连接。然后这个单一连接用于所有未来的通信
  4. Light -与 http 相比,WebSocket 消息数据交换要轻得多。

什么是 AOP?

在软件开发过程中,跨越应用程序多个点的功能称为交叉问题。这些交叉问题与应用程序的主要业务逻辑不同。因此,将这些横切关注与业务逻辑分开是面向方面编程(AOP)的地方。

什么是 Apache Kafka?

Apache Kafka 是一个分布式发布 - 订阅消息系统。它是一个可扩展的,容错的发布 - 订阅消息系统,它使我们能够构建分布式应用程序。这是一个 Apache 顶级项目。Kafka 适合离线和在线消息消费。

我们如何监视所有 Spring Boot 微服务?

Spring Boot 提供监视器端点以监控各个微服务的度量。这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件(如数据库等)是否正常运行很有帮助。但是,使用监视器的一个主要缺点或困难是,我们必须单独打开应用程序的知识点以了解其状态或健康状况。想象一下涉及 50 个应用程序的微服务,管理员将不得不击中所有 50 个应用程序的执行终端。

为了帮助我们处理这种情况,单个在Spring boot 中,需要引入spring-boot-starter-actuator。
增加了这个spring-boot-starter-actuator依赖后,可以对Spring boot进行监控,可以收集一些微服务的运行状况,指标,信息,转储,环境,具体你可以去看文档。
配置maven的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

同时还需要配置bean

@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {return http.authorizeExchange().pathMatchers("/actuator/**").permitAll().anyExchange().authenticated().and().build();
}

当正常服务后,你可以访问服务所在端口 加上路径,如/health /info 查看相关信息

SpringBootApplication 自动配置原理分析

结论:springboot所有自动装配都是在启动的时候扫描并加载:spring.factories 所有的自动装配类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有了对应的启动器了,有了启动器,我们的自动装配就会生效,然后配置成功

jpa 和 hibernate 有什么区别?

jpa 全称 Java Persistence API,是 Java 持久化接口规范,hibernate 属于 jpa 的具体实现。

Spring Cloud

 Spring Cloud学习:什么是 Spring Cloud?微服务和微服务架构基础工程  RestTempleteRestful核心组件:1.Eureka(注册中心) ---AP集群配置对比zookeeper ----CP2.Ribbon---负载均衡(基于客户端)          IRule3.Feign---负载均衡(基于服务端)====Feign默认集成了Ribbon接口、社区要求、更加面向接口编程4.Hystrix(断路器)熔断(服务熔断—>服务端):某个服务超时或异常,引起熔断~,类似于保险丝(自我熔断)降级(服务降级—>客户端)--FallBackFactory(返回一个默认的值(缺省值)。会导致整体的服务下降,但是好歹能用,比直接挂掉强)dashboard(监控页面)5.Zuul(路由网关)Spring Cloud Config(分布式的配置):CS架构(C:client 客户端;S:server 服务器)C-->S-->Git ;GIT1.导入依赖;2.编写配置;3.开启注解 @Enablexxx

什么是 Spring Cloud?

spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。

使用 Spring Cloud 有什么优势?

使用 Spring Boot 开发分布式微服务时,我们面临以下问题

  1. 与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。
  2. 服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。
  3. 冗余-分布式系统中的冗余问题。
  4. 负载平衡 --负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机集群,网络链路,中央处理单元,或磁盘驱动器的分布。
  5. 性能-问题 由于各种运营开销导致的性能问题。
  6. 部署复杂性-Devops 技能的要求。

spring cloud 的核心组件有哪些?

  • Eureka:服务注册于发现。
  • Feign(基于服务端):基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
  • Ribbon(基于客户端):实现负载均衡,从一个服务的多台机器中选择一台。
  • Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
  • Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。

服务注册和发现是什么意思?Spring Cloud 如何实现?负载平衡的意义是什么?

当我们开始一个项目时,我们通常在属性文件中进行所有的配置。随着越来越多的服务开发和部署,添加和修改这些属性变得更加复杂。有些服务可能会下降,而某些位置可能会发生变化。手动更改属性可能会产生问题。 Eureka 服务注册和发现可以在这种情况下提供帮助。由于所有服务都在 Eureka 服务器上注册并通过调用 Eureka 服务器完成查找,因此无需处理服务地点的任何更改和处理。

负载平衡的意义是什么?

在计算中,负载平衡可以改善跨计算机,计算机集群,网络链接,中央处理单元或磁盘驱动器等多种计算资源的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载平衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。

feign如何实现负载均衡,与Ribbon的负载均衡有什么区别?

  • Ribbon:负载均衡(基于客户端)
  • Feign:负载均衡(基于服务端)

Ribbon是什么?

  • Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。
  • 简单的说,Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将 Netflix 的中间层服务连接在一起。Ribbon 的客户端组件提供一系列完整的配置项,如:连接超时、重试等。简单的说,就是在配置文件中列出 LoadBalancer (简称LB:负载均衡) 后面所有的及其,Ribbon 会自动的帮助你基于某种规则 (如简单轮询,随机连接等等) 去连接这些机器。我们也容易使用 Ribbon 实现自定义的负载均衡算法!

Ribbon能干嘛?

  • LB,即负载均衡 (LoadBalancer) ,在微服务或分布式集群中经常用的一种应用。

  • 负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA (高用)。
    常见的负载均衡软件有 Nginx、Lvs 等等。

  • Dubbo、SpringCloud 中均给我们提供了负载均衡,SpringCloud 的负载均衡算法可以自定义

  • 负载均衡简单分类:

      集中式LB即在服务的提供方和消费方之间使用独立的LB设施,如Nginx,由该设施负责把访问请求通过某种策略转发至服务的提供方!进程式LB将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选出一个合适的服务器。Ribbon 就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址!
    


Feign简介
Feign是声明式Web Service客户端,它让微服务之间的调用变得更简单,类似controller调用service。SpringCloud集成了Ribbon和Eureka,可以使用Feigin提供负载均衡的http客户端

只需要创建一个接口,然后添加注解即可~
Feign,主要是社区版,大家都习惯面向接口编程。这个是很多开发人员的规范。调用微服务访问两种方法:
1. 微服务名字 【ribbon】
2. 接口和注解 【feign】

Feign能干什么?

  • Feign旨在使编写Java Http客户端变得更容易
  • 前面在使用Ribbon + RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一个客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步的封装,由他来帮助我们定义和实现依赖服务接口的定义,在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它 (类似以前Dao接口上标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon 时,自动封装服务调用客户端的开发量。

Feign默认集成了Ribbon

  • 利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。

Feign和Ribbon如何选择?
根据个人习惯而定,如果喜欢REST风格使用Ribbon;如果喜欢社区版的面向接口风格使用Feign.

什么是 Hystrix?它如何实现容错?

Hystrix 是一个延迟和容错库,旨在隔离远程系统,服务和第三方库的访问点,当出现故障是不可避免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。通常对于使用微服务架构开发的系统,涉及到许多微服务。这些微服务彼此协作。思考以下微服务

假设如果上图中的微服务 9 失败了,那么使用传统方法我们将传播一个异常。但这仍然会导致整个系统崩溃。
随着微服务数量的增加,这个问题变得更加复杂。微服务的数量可以高达 1000。这是 hystrix 出现的地方 我们将使用 Hystrix 在这种情况下的 Fallback 方法功能。
我们有两个服务 employee-consumer 使用由 employee-consumer 公开的服务。

简化图如下所示:

现在假设由于某种原因,employee-producer 公开的服务会抛出异常。我们在这种情况下使用 Hystrix 定义了一个回退方法。这种后备方法应该具有与公开服务相同的返回类型。如果暴露服务中出现异常,则回退方法将返回一些值。

什么是 Hystrix 断路器?我们需要它吗?

由于某些原因,employee-consumer 公开服务会引发异常。在这种情况下使用Hystrix 我们定义了一个回退方法。如果在公开服务中发生异常,则回退方法返回一些默认值。

如果 firstPage method() 中的异常继续发生,则 Hystrix 电路将中断,并且员工使用者将一起跳过 firtsPage 方法,并直接调用回退方法。 断路器的目的是给第一页方法或第一页方法可能调用的其他方法留出时间,并导致异常恢复。可能发生的情况是,在负载较小的情况下,导致异常的问题有更好的恢复机会

spring cloud 断路器的作用是什么?

在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。

什么是 Netflix Feign?它的优点是什么?

Feign 是受到 Retrofit,JAXRS-2.0 和 WebSocket 启发的 java 客户端联编程序。
Feign 的第一个目标是将约束分母的复杂性统一到 http apis,而不考虑其稳定性。 在 employee-consumer 的例子中,我们使用了 employee-producer 使用 REST模板公开的 REST 服务。
但是我们必须编写大量代码才能执行以下步骤

  1. 使用功能区进行负载平衡。

  2. 获取服务实例,然后获取基本 URL。

  3. 利用 REST 模板来使用服务。 前面的代码如下

    @Controller
    public class ConsumerControllerClient {@Autowiredprivate LoadBalancerClient loadBalancer;public void getEmployee() throws RestClientException, IOException {ServiceInstance serviceInstance=loadBalancer.choose("employee-producer");System.out.println(serviceInstance.getUri());String baseUrl=serviceInstance.getUri().toString();baseUrl=baseUrl+"/employee";RestTemplate restTemplate = new RestTemplate();ResponseEntity<String> response=null;try{response=restTemplate.exchange(baseUrl,HttpMethod.GET, getHeaders(),String.class);}catch (Exception ex){System.out.println(ex);}System.out.println(response.getBody}}
    }
    

    之前的代码,有像 NullPointer 这样的例外的机会,并不是最优的。我们将看到如何使用 Netflix Feign 使呼叫变得更加轻松和清洁。如果 Netflix Ribbon 依赖关系也在类路径中,那么 Feign 默认也会负责负载均衡。

什么是Spring Cloud Bus ?我们需要它吗?

考虑以下情况:我们有多个应用程序使用 Spring Cloud Config 读取属性,而Spring Cloud Config 从 GIT 读取这些属性。
下面的例子中多个员工生产者模块从 Employee Config Module 获取 Eureka 注册的财产。

如果假设 GIT 中的 Eureka 注册属性更改为指向另一台 Eureka 服务器,会发生什么情况。在这种情况下,我们将不得不重新启动服务以获取更新的属性。还有另一种使用执行器端点/刷新的方式。但是我们将不得不为每个模块单独调用这个 url。
例如,如果 Employee Producer1 部署在端口 8080 上,则调用
http:// localhost:8080 / refresh。同样对于 Employee Producer2 http://localhost:8081 / refresh 等等。这又很麻烦。这就是 Spring Cloud Bus 发挥作用的地方。

Spring Cloud Bus 提供了跨多个实例刷新配置的功能。因此,在上面的示例中,如果我们刷新 Employee Producer1,则会自动刷新所有其他必需的模块。如果我们有多个微服务启动并运行,这特别有用。这是通过将所有微服务连接到单个消息代理来实现的。无论何时刷新实例,此事件都会订阅到侦听此代理的所有微服务,并且它们也会刷新。可以通过使用端点/总线/刷新来实现对任何单个实例的刷新

Dubbo 和Spring Cloud的区别

Dubbo Spring Cloud
通信方式 RPC通信 HTTP RestFul方式
注册中心 Dubbo 使用 ZooKeeper(官方推荐),还有 Redis、Multicast、Simple 注册中心,但不推荐。 Spring Cloud 使用的是 Spring Cloud Netflix Eureka
监控 Dubbo-monitor Spring Boot admin
断路器 不完善 使用的是 Spring Cloud Netflix Hystrix

主要围绕着四个关键点来说:通信方式、注册中心、监控、断路器,其余像 Spring 分布式配置、网关服务、服务跟踪、消息总线、批量任务等都要了解一下。

微服务

什么是微服务?

微服务(Microservice Architecture) 是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。
原文:https://martinfowler.com/articles/microservices.html
汉化:https://www.cnblogs.com/liuning8023/p/4493156.html
就目前而言,对于微服务,业界并没有一个统一的,标准的定义。
但通常而言,微服务架构是一种架构模式,或者说是一种架构风格,它体长将单一的应用程序划分成一组小的服务,每个服务运行在其独立的自己的进程内,服务之间互相协调,互相配置,为用户提供最终价值,服务之间采用轻量级的通信机制(HTTP)互相沟通,每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境中,另外,应尽量避免统一的,集中式的服务管理机制(使用分布式),对具体的一个服务而言,应该根据业务上下文,选择合适的语言,工具(Maven)对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。

再来从技术维度角度理解下:
微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事情,从技术角度看就是一种小而独立的处理过程,类似进程的概念,能够自行单独启动或销毁,拥有自己独立的数据库。

微服务的四个核心问题?

  1. 服务很多,客户端怎么访问?
  2. 这么多服务?服务之间如何通信?
  3. 这么多服务?如何治理?
  4. 服务挂了怎么办?

解决方案: Spring Cloud 生态! SprintBoot

  1. Spring Cloud NetFlix 一站式解决方案 (2018停止维护了)
    api网关:zuul组件
    通信:Feign (/feɪn/ )---- HttpClient ---- Http通信方式,同步,阻塞
    服务注册和发现:Eureka
    熔断机制:Hystrix

  2. Apache Dubbo Zookeeper:半自动!需要整合别人的
    API网关:没有,找第三方组件(比如整合zull组件),或者自己实现
    通信:Dubbo 是一个基于Java的高性能的RPC通信框架(性能比Feign强大)
    服务注册和发现:Zookeeper
    熔断机制:没有,需要借助Hystrix

    Dubbo这个方案并不完善

  3. Spring Cloud Alibaba:目前最新的一站式解决方案!可解决上述4个核心问题,更简单(腾讯) Spring Cloud Alibaba学习
    API网关: Gateway
    通信: Dubbo RPC
    服务注册和发现: 阿里巴巴的 Nacos
    熔断机制: Alibaba Sentinel

新概念:服务网格~ Server Mesh istio 万变不离其宗4个问题:
1.API网关 2. HTTP,RPC通信 3. 注册和发现 4. 熔断机制

网络不可靠!

微服务与微服务架构

微服务
强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题/提供落地对应服务的一个服务应用,狭义的看,可以看作是IDEA中的一个个微服务工程,或者Moudel。
IDEA 工具里面使用Maven开发的一个个独立的小Moudel,它具体是使用SpringBoot开发的一个小模块,专业的事情交给专业的模块来做,一个模块就做着一件事情。强调的是一个个的个体,每个个体完成一个具体的任务或者功能。

微服务架构
一种新的架构形式,Martin Fowler 于2014年提出。
微服务架构是一种架构模式,它体长将单一应用程序划分成一组小的服务,服务之间相互协调,互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务之间采用轻量级的通信机制**(如HTTP)互相协作,每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境中,另外,应尽量避免统一的,集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具(如Maven)**对其进行构建。

答微服务架构的六种常用设计模式

  • 代理设计模式
  • 聚合设计模式
  • 链条设计模式
  • 聚合链条设计模式
  • 数据共享设计模式
  • 异步消息设计模式

微服务优缺点

优点

  • 独立开发——所有的微服务都可以根据各自的功能轻松开发
  • 独立部署——基于其服务,可以在任何应用程序中单独开发它们
  • 故障隔离——即使应用程序的一项服务不起作用,系统仍可继续运行
  • 混合技术堆栈——可以使用不同的语言和技术来构建同一应用程序的不同服务
  • 粒度缩放——来个组件可以根据需要进行缩放,无需将所有组件放在一起

特点

  • 解耦——系统内的服务很大程度上是分离的。因此整个应用程序可以轻松构建、更改和扩展

  • 组件化——微服务被视为可以轻松更换和升级的独立组件

  • 业务能力——为服务非常简单,专注于单一的功能

  • 自治——开发人员和团队可以独立开发工作,从而提高速度

  • 持续交付——通过软件创建、测试和批准的系统自动化,允许频繁发布软件

  • 责任——微服务不关注应用程序作为项目。相反,他们将应用程序视为他们负责的产品

  • 分散治理——重点是使用正确的工具来做正确的工作,这意味着没有标准化模式或任何技术模式。开发人员可以自由选择最有用的工具来解决他们的问题

  • 敏捷——微服务支持敏捷开发。任何新功能都可以快速开发并再次丢弃

      单一职责原则;每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个指定的业务功能或业务需求;开发简单,开发效率高,一个服务可能就是专一的只干一件事;微服务能够被小团队单独开发,这个团队只需2-5个开发人员组成;微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的;微服务能使用不同的语言开发;易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如jenkins,Hudson,bamboo;微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果,无需通过合作才能体现价值;微服务允许利用和融合最新技术;微服务只是业务逻辑的代码,不会和HTML,CSS,或其他的界面混合;每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一的数据库;
    

缺点

  • 开发人员要处理分布式系统的复杂性;
  • 多服务运维难度,随着服务的增加,运维的压力也在增大;
  • 系统部署依赖问题;
  • 服务间通信成本问题;
  • 数据一致性问题;
  • 系统集成测试问题;
  • 性能和监控问题;
优点 缺点
自由使用不同的技术 增加故障排除挑战
每个微服务都侧重于单一功能 由于远程呼叫而增加延迟
支持单个可部署单元 增加了配置和其他操作的工作量
允许经常发布软件 难以保持交易安全
确保每项服务的安全性 艰难的跨越各种边界跟踪数据
多个服务是并行开发和部署的 难以在服务间进行编码

微服务技术栈有那些?

为什么选择SpringCloud作为微服务架构?

  1. 选型依据
    整体解决方案和框架成熟度
    社区热度
    可维护性
    学习曲线
  2. 当前各大IT公司用的微服务架构有那些?
    阿里:dubbo+HFS
    京东:JFS
    新浪:Motan
    当当网:DubboX
  3. 各微服务框架对比

微服务架构如何运作?

  • 客户端——来自不同设备的不同用户发送请求
  • 身份提供商——验证用户或客户身份并颁发安全令牌
  • API网关——处理客户端请求
  • 静态内容——容纳系统的所有内容
  • 管理——在节点上平衡服务并识别故障
  • 服务发现——查找服务之间通信路径的指南
  • 内容交付网络——代理服务器及其数据中心的分布式网络
  • 远程服务——启用驻留在IT设备网络上的远程访问信息

单片,SOA 和微服务架构有什么区别?


单片 SOA 和微服务之间的比较 – 微服务访谈问题

  • 单片架构类似于大容器,其中应用程序的所有软件组件组装在一起并紧密封装。
  • 一个面向服务的架构是一种相互通信服务的集合。通信可以涉及简单的数据传递,也可以涉及两个或多个协调某些活动的服务。
  • 微服务架构是一种架构风格,它将应用程序构建为以业务域为模型的小型自治服务集合

在使用微服务架构时,您面临哪些挑战?

开发一些较小的微服务听起来很容易,但开发它们时经常遇到的挑战如下。

  • 自动化组件:难以自动化,因为有许多较小的组件。因此,对于每个组件,我们必须遵循 Build(创建),Deploy(部署) 和 Monitor(监视) 的各个阶段。
  • 易感性:将大量组件维护在一起变得难以部署,维护,监控和识别问题。它需要在所有组件周围具有很好的感知能力。
  • 配置管理:有时在各种环境中维护组件的配置变得困难。
  • 调试:很难找到错误的每一项服务。维护集中式日志记录和仪表板以调试问题至关重要

SOA 和微服务架构之间的主要区别是什么?

SOA 和微服务之间的主要区别如下:

微服务有什么特点?

什么是领域驱动设计?(DDD原理)

为什么需要域驱动设计(DDD)?(我们需要 DDD 的因素)

什么是无所不在的语言?

如果您必须定义泛在语言(UL),那么它是特定域的开发人员和用户使用的通用语言,通过该语言可以轻松解释域。

无处不在的语言必须非常清晰,以便它将所有团队成员放在同一页面上,并以机器可以理解的方式进行翻译。

什么是凝聚力?

模块内部元素所属的程度被认为是凝聚力。

什么是耦合?

组件之间依赖关系强度的度量被认为是耦合。一个好的设计总是被认为具有高内聚力和低耦合性。

什么是 REST / RESTful 以及它的用途是什么?

Representational State Transfer(REST)/ RESTful Web 服务是一种帮助计算机系统通过 Internet 进行通信的架构风格。这使得微服务更容易理解和实现。

微服务可以使用或不使用 RESTful API 实现,但使用 RESTful API 构建松散耦合的微服务总是更容易。

你对 Spring Boot 有什么了解?

事实上,随着新功能的增加,弹簧变得越来越复杂。如果必须启动新的 spring 项 目,则必须添加构建路径或添加 maven 依赖项,配置应用程序服务器,添加 spring配置。所以一切都必须从头开始。

Spring Boot 是解决这个问题的方法。使用 spring boot 可以避免所有样板代码和配置。因此,基本上认为自己就好像你正在烘烤蛋糕一样,春天就像制作蛋糕所需的成分一样,弹簧靴就是你手中的完整蛋糕。

什么是 Spring 引导的执行器?

Spring Boot 执行程序提供了 restful Web 服务,以访问生产环境中运行应用程序的当前状态。在执行器的帮助下,您可以检查各种指标并监控您的应用程序。

什么是springcloud?

根据 Spring Cloud 的官方网站,Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,领导选举,分布式会话,集群状态)。

Spring Cloud 解决了哪些问题?

在使用 Spring Boot 开发分布式微服务时,我们面临的问题很少由 Spring Cloud解决。

  • 与分布式系统相关的复杂性 – 包括网络问题,延迟开销,带宽问题,安全问题。
  • 处理服务发现的能力 – 服务发现允许集群中的进程和服务找到彼此并进行通信。
  • 解决冗余问题 – 冗余问题经常发生在分布式系统中。
  • 负载均衡– 改进跨多个计算资源(例如计算机集群,网络链接,中央处理单元)的工作负载分布。
  • 减少性能问题 – 减少因各种操作开销导致的性能问题。

在 Spring MVC 应用程序中使用 WebMvcTest 注释有什么用处?


在测试目标只关注 Spring MVC 组件的情况下,WebMvcTest 注释用于单元测试Spring MVC 应用程序。在上面显示的快照中,我们只想启动 ToTestController。执行此单元测试时,不会启动所有其他控制器和映射。

你能否给出关于休息和微服务的要点?

虽然您可以通过多种方式实现微服务,但 REST over HTTP 是实现微服务的一种方式。REST 还可用于其他应用程序,如 Web 应用程序,API 设计和 MVC 应用程序,以提供业务数据。
微服务是一种体系结构,其中系统的所有组件都被放入单独的组件中,这些组件可以单独构建,部署和扩展。微服务的某些原则和最佳实践有助于构建弹性应用程序。
简而言之,您可以说 REST 是构建微服务的媒介。

什么是不同类型的微服务测试?

在使用微服务时,由于有多个微服务协同工作,测试变得非常复杂。因此,测试分为不同的级别。

  • 在底层,我们有面向技术的测试,如单元测试和性能测试。这些是完全自动化的。
  • 在中间层面,我们进行了诸如压力测试和可用性测试之类的探索性测试。
  • 在顶层, 我们的 验收测试数量很少。这些验收测试有助于利益相关者理解和验证软件功能。

您对 Distributed Transaction 有何了解?

分布式事务是指单个事件导致两个或多个不能以原子方式提交的单独数据源的突变的任何情况。在微服务的世界中,它变得更加复杂,因为每个服务都是一个工作单元,并且大多数时候多个服务必须协同工作才能使业务成功。

什么是 Idempotence 以及它在哪里使用?

幂等性是能够以这样的方式做两次事情的特性,即最终结果将保持不变,即好像它只做了一次。

用法:在远程服务或数据源中使用 Idempotence,这样当它多次接收指令时,它只处理指令一次。

什么是有界上下文?

有界上下文是域驱动设计的核心模式。DDD 战略设计部门的重点是处理大型模型和团队。DDD 通过将大型模型划分为不同的有界上下文并明确其相互关系来处理大型模型。

什么是双因素身份验证?

双因素身份验证为帐户登录过程启用第二级身份验证。

因此,假设用户必须只输入用户名和密码,那么这被认为是单因素身份验证。

双因素身份验证的凭据类型有哪些?

这三种凭证是:

什么是客户证书?

客户端系统用于向远程服务器发出经过身份验证的请求的一种数字证书称为客户端证书。客户端证书在许多相互认证设计中起着非常重要的作用,为请求者的身份提供了强有力的保证。

PACT 在微服务架构中的用途是什么?

PACT 是一个开源工具,允许测试服务提供者和消费者之间的交互,与合同隔离,从而提高微服务集成的可靠性。

微服务中的用法

  • 用于在微服务中实现消费者驱动的合同。
  • 测试微服务的消费者和提供者之间的消费者驱动的合同。

查看即将到来的批次

什么是 OAuth?

OAuth 代表开放授权协议。这允许通过在 HTTP 服务上启用客户端应用程序(例如第三方提供商 Facebook,GitHub 等)来访问资源所有者的资源。因此,您可以在不使用其凭据的情况下与另一个站点共享存储在一个站点上的资源。

康威定律是什么?( Conway 定律的表示)

“任何 设计 系统 的组 织( 广泛 定义 )都 将产 生一 种设 计, 其结 构是 组织 通信 结构的副 本。” – Mel Conway

该法律基本上试图传达这样一个事实:为了使软件模块起作用,整个团队应该进行良好的沟通。因此,系统的结构反映了产生它的组织的社会边界。

合同测试你懂什么?

根据 Martin Flower 的说法,合同测试是在外部服务边界进行的测试,用于验证其是否符合消费服务预期的合同。

此外,合同测试不会深入测试服务的行为。更确切地说,它测试该服务调用的输入&输出包含所需的属性和所述响应延迟,吞吐量是允许的限度内。

什么是端到端微服务测试?(测试层次)

端到端测试验证了工作流中的每个流程都正常运行。这可确保系统作为一个整体协同工作并满足所有要求。

通俗地说,你可以说端到端测试是一种测试,在特定时期后测试所有东西。

Container (容器)在微服务中的用途是什么?

容器是管理基于微服务的应用程序以便单独开发和部署它们的好方法。您可以将微服务封装在容器映像及其依赖项中,然后可以使用它来滚动按需实例的微服务,而无需任何额外的工作。

什么是微服务架构中的 DRY?

DRY 代表不要重复自己。它基本上促进了重用代码的概念。这导致开发和共享库,这反过来导致紧密耦合。

什么是消费者驱动的合同(CDC)?

这基本上是用于开发微服务的模式,以便它们可以被外部系统使用。当我们处理微服务时,有一个特定的提供者构建它,并且有一个或多个使用微服务的消费者。通常,提供程序在 XML 文档中指定接口。但在消费者驱动的合同中,每个服务消费者都传达了提供商期望的接口。

Web,RESTful API 在微服务中的作用是什么?

微服务架构基于一个概念,其中所有服务应该能够彼此交互以构建业务功能。因此,要实现这一点,每个微服务必须具有接口。这使得 Web API 成为微服务的一个非常重要的推动者。RESTful API 基于 Web 的开放网络原则,为构建微服务架构的各个组件之间的接口提供了最合理的模型。

您对微服务架构中的语义监控有何了解?

语义监控,也称为 综合监控, 将自动化测试与监控应用程序相结合,以检测业务失败因素。

我们如何进行跨功能测试?

跨功能测试是对非功能性需求的验证,即那些无法像普通功能那样实现的需求。

我们如何在测试中消除非决定论?

非确定性测试(NDT)基本上是不可靠的测试。所以,有时可能会发现它们通过,显然有时它们也可能会失败。当它们失败时,它们会重新运行通过。
从测试中删除非确定性的一些方法如下:

  1. 隔离
  2. 异步
  3. 远程服务
  4. 隔离
  5. 时间
  6. 资源泄漏

Mock(Stub ) 或 Stub (存根)有什么区别?

  • 存根
    一个有助于运行测试的虚拟对象。
    在某些可以硬编码的条件下提供固定行为。
    永远不会测试存根的任何其他行为。
    例如,对于空堆栈,您可以创建一个只为 empty()方法返回 true 的存根。
    因此,这并不关心堆栈中是否存在元素。

  • 嘲笑
    一个虚拟对象,其中最初设置了某些属性。
    此对象的行为取决于 set 属性。
    也可以测试对象的行为。

例如,对于 Customer 对象,您可以通过设置名称和年龄来模拟它。您可以将 age设置为 12,然后测试 isAdult()方法,该方法将在年龄大于 18 时返回 true。因此,您的 Mock Customer 对象适用于指定的条件。

您对 Mike Cohn 的测试金字塔了解多少?

Mike Cohn 提供了一个名为 Test Pyramid 的模型。这描述了软件开发所需的自动化测试类型。


根据金字塔,第一层的测试数量应该最高。在服务层,测试次数应小于单元测试级别,但应大于端到端级别。

Docker 的目的是什么?

Docker 提供了一个可用于托管任何应用程序的容器环境。在此,软件应用程序和支持它的依赖项紧密打包在一起。

因此,这个打包的产品被称为 Container,因为它是由 Docker 完成的,所以它被称为 Docker 容器!

什么是金丝雀释放?

Canary Releasing 是一种降低在生产中引入新软件版本的风险的技术。这是通过将变更缓慢地推广到一小部分用户,然后将其发布到整个基础架构,即将其提供给每个人来完成的。

什么是持续集成(CI)?

持续集成(CI)是每次团队成员提交版本控制更改时自动构建和测试代码的过程。这鼓励开发人员通过在每个小任务完成后将更改合并到共享版本控制存储库来共享代码和单元测试。

什么是持续监测?

持续监控深入监控覆盖范围,从浏览器内前端性能指标,到应用程序性能,再到主机虚拟化基础架构指标。

架构师在微服务架构中的角色是什么?

微服务架构中的架构师扮演以下角色:

  • 决定整个软件系统的布局。
  • 帮助确定组件的分区。因此,他们确保组件相互粘合,但不紧密耦合。
  • 与开发人员共同编写代码,了解日常生活中面临的挑战。
  • 为开发微服务的团队提供某些工具和技术的建议。
  • 提供技术治理,以便技术开发团队遵循微服务原则。

我们可以用微服务创建状态机吗?

我们知道拥有自己的数据库的每个微服务都是一个可独立部署的程序单元,这反过来又让我们可以创建一个状态机。因此,我们可以为特定的微服务指定不同的状态和事件。

例如,我们可以定义 Order 微服务。订单可以具有不同的状态。Order 状态的转换可以是 Order 微服务中的独立事件。

什么是微服务中的反应性扩展?

Reactive Extensions 也称为 Rx。这是一种设计方法,我们通过调用多个服务来收集结果,然后编译组合响应。这些调用可以是同步或异步,阻塞或非阻塞。Rx是分布式系统中非常流行的工具,与传统流程相反。

希望 这些 微服 务面 试问 题可 以帮 助您 进行 微服 务架 构师 访谈 。
翻译来源

【零散知识点总结3】相关推荐

  1. 【零散知识点总结2】

    大部分知识点来源于该博主--骆昊 知识点来源于网络,知道的可以在评论区贴上来源喔 <零散知识点总结1> 该文章涉及:Dubbo.HTTP和HTTPS.Mybatis.Hibernate. ...

  2. 【零散知识点总结1】

    大部分知识点来源于该博主--骆昊 知识点来源于网络,知道的可以在评论区贴上来源喔 <零散知识点总结1> 该文章涉及:Dubbo.HTTP和HTTPS.Mybatis.Hibernate. ...

  3. 【零散知识点总结4】

    大部分来源于网络 <零散知识点总结1> 该文章涉及:Dubbo.HTTP和HTTPS.Mybatis.Hibernate. Zookeeper.Kafka.Elasticsearch.Re ...

  4. Effective C++ -- 零散知识点整理

    Effective C++ --1让自己习惯C++ Effective C++ --2构造/析构/赋值运算 Effective C++ --3资源管理 Effective C++ --4设计与声明 E ...

  5. 零散知识点小结(nginx/linux/mycat/redis/douubo/zookeeper)

    maven中jar包传输原则(了解) 问题:jar包文件 如何保证在远程传输的过程中不被别人篡改??? 算法介绍: SHA1算法 SHA-1(英语:Secure Hash Algorithm 1,中文 ...

  6. 【数据库】兴唐第二十八节课零散知识点汇总

    1.group by order by等都要放到语句的最后 2.表格标签: <table> <tr>表示行 <td>表示一个行里的单元格 </table> ...

  7. Thinkphp 零散知识点(caa/js路径,引入第三方类,ajax返回,session/cookie)

    一.关于JS和CSS路径问题 1.找路径是从入口文件index.php来找的,而不是从文件本身所在位置来找, 因为我们访问时是访问的入口文件 2.在存放JS和CSS的时候可以放到public文件夹下 ...

  8. Python零散知识点记录

    1.关于setdefaultencoding之前必须reload(sys): 要在调用setdefaultencoding时必须要先reload一次sys模块,因为这里的import语句其实并不是sy ...

  9. 系统分析师零散知识点

    数据库连接池技术 是指在系统初期或者初次使用时,完成数据库的连接,以后不再释放此连接,在处理后面的请求时,反复使用这些已经建立的连接. 这种方式可以大大减少数据库的处理时间,有利于提高系统的整体性能. ...

最新文章

  1. 一个同步github上fork过来的项目的批处理脚本
  2. HtmlAgilityPack 总结(一)
  3. java web系统拆分_Java系统中如何拆分同步和异步
  4. 七大排序算法的个人总结(二)
  5. C++ Primer 5th笔记(chap 18 大型程序工具)noexcept
  6. 解决标签回车后产生的空格
  7. 我的iOS学习历程 - UISlider(简单的设置一组图片动画)
  8. C语言spirograph算法图形绘制(附完整源码)
  9. linux无后缀名程序运行,linux – 如何在Ubuntu上运行无扩展(也许是ELF)文件?
  10. 视频盒子APP视频播放源代码安卓+IOS双端源码
  11. python自动翻译excel某一列_【python excel实例教程】怎样用Python将excel的某一列生成一个列表?...
  12. 洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree...
  13. 【开源】开发者新闻APP+新闻Restful服务+博客园新闻采集程序+infoq新闻采集程序+36kr新闻采集程序+oschina新闻采集程序+51cto新闻采集程序+csdn新闻采集程序...
  14. Screen - BOM对象
  15. 数据分析项目实战—信用卡客户违约概率预测
  16. vue中设置外部链接
  17. arcgis多面体数据转面_多面体转 Collada (转换)
  18. netcat工具简单使用
  19. kingcms php 漏洞,kingcms5.0/5.1漏洞
  20. 51单片机入门学习 第八天

热门文章

  1. Loadrunner监控windows服务器资源
  2. 计算机考研380分能上什么学校,考研380分相当于高考多少分的难度
  3. 自由落体球C语言编程,C 练习实例20 – 小球自由下落 | 菜鸟教程
  4. 线下开始 | 高级转录组分析和R数据可视化
  5. 轨道运营管理专业自荐书_单招面试自我介绍,我报的是:城市轨道交通运营管理,谁可以给我一篇自我介绍的范文啊?谢谢!...
  6. 当下美容销售该如何做?
  7. AngularJS培训教程
  8. 2014-12-30
  9. python try语句例题_在Python中,一个try语句只能和一个except语句搭配。_学小易找答案...
  10. MySQL查询不区分大小写