美文网首页
hello world

hello world

作者: 赵铁柱啊 | 来源:发表于2018-07-23 22:53 被阅读0次

    1.什么是spring

    spring是一个开源框架,它是为了解决企业应用开发复杂性而创建的。使用基本的JavaBean代替复杂的EJB完成的事情。

    2.spring框架有哪些优点

    • 使用spring的IOC容器,将对象之间的关系交给Spring,降低组件之间的耦合。
    • 对主流框架有很好的集成,如JPA、mybatis等
    • AOP编程的支持,通过spring AOP,方便进行面向切面编程,许多不容易用传统面向对象实现的功能可以通过AOP轻松应付。
    • 声明式事务的支持,将业务逻辑代码与事务管理分离。
    • 方便程序测试

    3.spring的基本模块

    模块名称 描述
    spring core Spring Core模块是Spring的核心容器,它实现了IOC模式,提供了Spring框架的基础功能。此模块中包含的BeanFactory类是Spring的核心类,负责JavaBean的配置与管理。
    spring context Spring Context模块继承BeanFactory(或者说Spring核心)类,并且添加了事件处理、国际化、资源装载、透明装载、以及数据校验等功能。
    spring DAO DAO模块提供了JDBC的抽象层,简化了数据库厂商的异常错误(不再从SQLException继承大批代码),大幅度减少代码的编写,并且提供了对声明式事务和编程式事务的支持。
    spring ORM 对Hibernate提供了完美的整合功能,同时也支持其他ORM工具。注意这里Spring是提供各类的接口(support),目前比较流行的下层数据库封闭映射框架,如 ibatis, Hibernate等。
    spring AOP AOP从功能的角度来讲,可能看作OOP编程方式的一种补充,提供了一种不同的代码或者系统组织方式。
    spring web 此模块建立在Spring Context 基础之上,它提供了Servlet监听器的Context 和 Web应用的上下文。
    spring web mvc Spring WebMVC模块建立在Spring核心功能之上,这使它能拥有Spring框架的所有特性,能够适应多种多视图、模板技术、国际化和验证服务,实现控制逻辑和业务逻辑的清晰分离。

    4.BeanFactory – BeanFactory 实现举例

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

    5.什么是Spring IOC 容器

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

    IOC的优点:实现组件之间的解耦,提高程序的灵活性和可维护性。

    6.Bean Factory和Application Contexts有什么区别

    BeanFacotry是spring中比较原始的Factory。如XMLBeanFactory就是一种典型的BeanFactory。原始的BeanFactory无法支持spring的许多插件,如AOP功能、Web应用等。

    ApplicationContext接口,它由BeanFactory接口派生而来,因而提供BeanFactory所有的功能。ApplicationContext包还提供了以下的功能:

    • MessageSource, 提供国际化的消息访问

    • 资源访问,如URL和文件

    • 事件传播

    • 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层

    7.Spring 框架中都用到了哪些设计模式

    模式 描述
    工厂模式 BeanFactory和 ApplicationContext创建都是用到工厂模式
    模板模式 RestTemplate, JmsTemplate, JpaTemplate
    代理模式 在AOP实现中用到了JDK的动态代理
    单例模式 这个比如在创建bean的时候
    迭代器模式 Iterable接口和Iterator接口

    8.什么是控制反转?什么是依赖注入?

    控制反转(IoC/Inverse Of Control): 调用者不再创建被调用者的实例,由spring框架实现(容器创建,其实就是XML中配置)所以称为控制反转。
    依赖注入(DI/Dependence injection) : 容器创建好实例后再注入调用者称为依赖注入。

    9.依赖注入的方式

    (1)构造方法注入

    在spring的配置文件中注册UserService,将UserDaoJdbc通过constructor-arg标签注入到UserService的某个有参数的构造方法

    <!-- 注册userService -->
    <bean id="userService" class="com.lyu.spring.service.impl.UserService">
        <constructor-arg ref="userDaoJdbc"></constructor-arg>
    </bean>
    <!-- 注册jdbc实现的dao -->
    <bean id="userDaoJdbc" class="com.lyu.spring.dao.impl.UserDaoJdbc"></bean>
    

    如果只有一个有参数的构造方法并且参数类型与注入的bean的类型匹配,那就会注入到该构造方法中。

    public class UserService implements IUserService {
        private IUserDao userDao;
        public UserService(IUserDao userDao) {
            this.userDao = userDao;
        }
        public void loginUser() {
            userDao.loginUser();
        }
    }
    

    (2)setter注入

    配置如下

    <!-- 注册userService -->
    <bean id="userService" class="com.lyu.spring.service.impl.UserService">
        <!-- 写法一 -->
        <!-- <property name="UserDao" ref="userDaoMyBatis"></property> -->
        <!-- 写法二 -->
        <property name="userDao" ref="userDaoMyBatis"></property>
    </bean>
    <!-- 注册mybatis实现的dao -->
    <bean id="userDaoMyBatis" class="com.lyu.spring.dao.impl.UserDaoMyBatis"></bean>
    

    注入如下:

    public class UserService implements IUserService {
        private IUserDao userDao1;
        public void setUserDao(IUserDao userDao1) {
            this.userDao1 = userDao1;
        }
        public void loginUser() {
            userDao1.loginUser();
        }
    }
    

    还有一点需要注意:如果通过set方法注入属性,那么spring会通过默认的空参构造方法来实例化对象,所以如果在类中写了一个带有参数的构造方法,一定要把空参数的构造方法写上,否则spring没有办法实例化对象,导致报错。

    10.哪种依赖注入方式你建议使用

    最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。

    11.什么是Spring beans

    Spring Beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化、装配和管理。

    12.如何给Spring 容器提供配置元数据(spring有几种配置方式)

    (1)基于XML的配置

    <beans>
        <bean name="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
        <bean name="jsonTemplate" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
        <bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>
    </beans>
    

    使用Spring命名空间的所支持的一系列的XML标签来实现的。Spring有以下主要的命名空间:context、beans、jdbc、tx、aop、mvc和aso。

    (2)基于注解的配置

    注解装配在Spring中是默认关闭的。所以需要在Spring文件中配置一下才能使用基于注解的装配模式

    <beans>
       <context:annotation-config/>
    </beans>
    
    @Scope(“prototype”)   
    @Lazy(true)   
    @Component(“loginUserDao”)   
    public class LoginUserDao {   
        // 用于设置初始化方法   
        @PostConstruct  
        public void myInit() {   
        }   
        // 用于设置销毁方法   
        @PreDestroy  
        public void myDestroy() {   
        }   
    } 
    

    在Bean实现类中通过一些Annotation来标注Bean类:

    ·@Component:标注一个普通的Spring Bean类(可以指定Bean名称,未指定时默认为小写字母开头的类名)

    ·@Controller:标注一个控制器类

    ·@Service:标注一个业务逻辑类

    ·@Repository:标注一个DAO类

    (3)基于java的配置

    @Configuration
    public class AppConfig
    {
        @Bean
        public MyService myService() {
            return new MyServiceImpl();
        }
    }  
    

    Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IoC容器来管理。 被@Configuration所注解的类则表示这个类的主要目的是作为bean定义的资源。

    在标注了@Configuration的java类中,通过在类方法标注@Bean定义一个Bean。方法必须提供Bean的实例化逻辑。通过@Bean的name属性可以定义Bean的名称,未指定时默认名称为方法名。在方法处通过@Autowired使方法入参绑定Bean,然后在方法中通过代码进行注入;

    优缺点对比:

    基于XML的配置 基于注解的配置 基于java的配置
    优点 1)XML配置方式进一步降低了耦合,使得应用更加容易扩展,即使对配置文件进一步修改也不需要工程进行修改和重新编译。2)在处理大的业务量的时候,用XML配置应该更加好一些。 1)在class文件中,降低维护成本。2)不需要第三方解析工具,利用java反射机制。3)编辑期就可以检验正确性,提高开发效率。 1)在class文件中,降低维护成本。2)不需要第三方解析工具,利用java反射机制。3)编辑期就可以检验正确性,提高开发效率。
    缺点 1)配置文件读取和解析需要花费一定的时间,配置文件过多的时候难以管理。 1)如果需要对annotation进行修改,那么要重新编译整个工程。2)业务类之间的关系不如XML配置那样容易把握。 1)配置代码过多时,直接影响代码质量,对于代码的简洁度有影响。2)业务类之间的关系不如XML配置那样容易把握。3)如果需要修改配置,则要重新编译整个工程。

    13.怎样定义类的作用域

    通过bean 定义中的scope属性来定义。例如:当Spring要在需要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。

    14.Spring Bean的作用域之间有什么区别

    作用域 描述
    单例(singleton) (默认)每一个Spring IoC容器都拥有唯一的一个实例对象
    原型(prototype) 为每一个bean请求提供一个实例
    请求(request) 每一个HTTP请求都有自己的Bean实例,请求完成以后,bean会失效并被垃圾回收器回收
    会话(session) 每个session中有一个bean的实例,在session过期后,bean会随之失效。
    全局会话(global session) 限定一个Bean的作用域为全局HTTPSession的生命周期。
    应用(application) 限定一个Bean的作用域为ServletContext的生命周期

    15.Spring框架中的单例Beans是线程安全的么

    Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。

    16.哪些是重要的bean生命周期方法? 你能重载它们吗?

    有两个重要的bean生命周期方法:

    第一个是setup,它是在容器加载bean的时候被调用。

    第二个方法是 teardown 它是在容器卸载类的时候被调用。

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

    17.什么是spring的内部bean

    当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean。内部bean通常是匿名的,它们的Scope一般是prototype。

    18.什么是Bean自动装配

    Spring 容器能够自动装配相互合作的bean,这意味着容器不需要<constructor-arg>和<property>配置,能通过Bean工厂自动处理bean之间的协作。

    19.不同方式的自动装配

    装配方式 描述
    no 默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。
    byName 通过参数名 自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。
    byType 通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。
    constructor 这个方式类似于byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
    autodetect 首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。

    20.自动装配的局限性

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

    21.什么是基于Java的Spring注解配置? 给一些注解的例子.

    允许在少量的Java注解的帮助下,进行大部分Spring配置而非通过XML文件。

    例1:@Configuration注解,用来标记类可以当做一个bean的定义,被Spring IOC容器使用。

    例2:@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。

    22.在Spring框架中如何更有效地使用JDBC

    • 使用JDBC框架,资源管理和错误处理的都会容易很多,开发者只需写statements 和 queries从数据存取数据;
    • JDBC可以在Spring提供的模板类的帮助下更有效地被使用,这个模板叫JdbcTemplate

    23.使用Spring通过什么方式访问Hibernate

    • 控制反转 Hibernate Template和 Callback。
    • 继承 HibernateDAOSupport提供一个AOP 拦截器。

    24.Spring支持的ORM

    • Hibernate
    • iBatis
    • JPA (Java Persistence API)

    25.Spring支持的事务管理类型

    • 编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
    • 声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。

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

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

    27.什么是AOP

    面向切面的编程是一种编程技术,使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。 避免了在业务逻辑的代码中混入很多的系统相关的逻辑 ——比如权限管理,事物管理,日志记录等等。

    28.AOP 术语

    通知

    • 定义:切面也需要完成工作。在 AOP 术语中,切面的工作被称为通知。
    • 工作内容:通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决何时执行这个工作。
    • 5 种通知类型
    通知类型 描述
    Before 在方法调用之前调用通知
    After 在方法完成之后调用通知,无论方法执行成功与否
    After-returning 在方法执行成功之后调用通知
    After-throwing 在方法抛出异常后进行通知
    Around 通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为

    连接点

    • 定义:连接点是一个应用执行过程中能够插入一个切面的点。
    • 连接点可以是调用方法时、抛出异常时、甚至修改字段时、
    • 切面代码可以利用这些点插入到应用的正规流程中
    • 程序执行过程中能够应用通知的所有点。

    切点:

    • 定义:如果通知定义了“什么”和“何时”。那么切点就定义了“何处”。切点会匹配通知所要织入的一个或者多个连接点。
    • 通常使用明确的类或者方法来指定这些切点。
    • 作用:定义通知被应用的位置(在哪些连接点)

    切面:

    • 定义:切面是通知和切点的集合,通知和切点共同定义了切面的全部功能——它是什么,在何时何处完成其功能。

    引入:

    • 引入允许我们向现有的类中添加方法或属性

    织入:

    • 织入是将切面应用到目标对象来创建的代理对象过程。
    • 切面在指定的连接点被织入到目标对象中,在目标对象的生命周期中有多个点可以织入

    29.什么是Spring的MVC框架

    Spring可以很便捷地和其他MVC框架集成,如Struts、SpringMVC。

    Spring 的MVC框架用控制反转把业务对象控制逻辑清晰地隔离。它也允许以声明的方式把请求参数和业务对象绑定。

    30.DispatcherServlet

    Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。

    31.什么是SpringBoot

    springboot提供了一种新的编程范式,可在最小的阻力下进行spring应用程序开发。专注于应用程序的功能,不需要再配置上花费太多时间。

    32.Spring Boot、Spring MVC 和 Spring 有什么区别

    SpringFrame:SpringFramework 最重要的特征是依赖注入和控制反转。所有 Spring模块不是依赖注入就是 IOC 控制反转。 当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。

    SpringMVC:Spring MVC 提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。

    SpringBoot:Spring 和 SpringMVC 的问题在于需要配置大量的参数。 Spring Boot 通过一个自动配置和启动的项来目解决这个问题。为了更快的构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征。

    33.Spring Boot有什么特点

    • 自动配置:提高开发效率
    • 起步依赖:根据依赖传递关系,把其他需要的依赖也加进来
    • 内嵌容器:通过配置选择不同的容器,通过java -jar启动应用程序
    • yml配置文件:解决重复的链式配置

    34.什么是自动配置(自动配置的原理)

    1. spring boot程序在启动时扫描项目所依赖的jar包(添加SpringBootApplication注解或者EnableAutoConfiguratoin注解)
    2. 寻找包含spring.factories配置文件,该文件声明了哪些需要自动配置。
    3. 根据条件进行自动配置,并将bean注入到spring上下文。

    35.什么是 Spring Boot Stater

    起步依赖,根据依赖传递关系,把其他需要的依赖加进来。

    例如,如果你想使用Spring和JPA进行数据库访问,只需要在你的项目中引入spring-boot-starter-data-jpa依赖就可以。

    36.Spring Boot 还提供了其它的哪些 Starter

    starter名称 描述
    spring-boot-starter-web Web 和 RESTful 应用程序
    spring-boot-starter-test 单元测试和集成测试
    spring-boot-starter-data-jpa 引入Spring Boot JPA,访问数据库
    spring-boot-starter-data-redis Redis数据库支持

    37.创建一个 Spring Boot Project 的最简单的方法是什么

    Spring initializer[i'niʃəlaizə]是启动 Spring Boot Projects 的一个很好的工具。

    38.如何使用 SpringBoot 自动重装的应用程序

    添加spring-boot-devtools依赖,重启应用程序即可。

    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-devtools</artifactId>
         <scope>runtime</scope>
    </dependency>
    

    40.我们能否在 spring-boot-starter-web 中用 jetty 代替 tomcat

    在 spring-boot-starter-web 移除现有的依赖项,并把下面这些添加进去。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>
    

    41.如何使用 Spring Boot 部署到不同的服务器

    • 在一个项目中生成一个 war 文件。
    • 将它部署到你最喜欢的服务器(websphere 或者 Weblogic 或者 Tomcat ...)

    42.JPA 和 Hibernate 有哪些区别

    • JPA 是一个规范或者接口
    • Hibernate 是 JPA 的一个实现

    43.什么是嵌入式服务器?我们为什么要使用嵌入式服务器呢?

    传统的web项目都是需要部署到服务容器上,例如tomcat、weblogic,然后启动容器运行应用程序。

    而springboot应用程序只需要运行**application中的main方法,原因是springboot封装了web容器,启动时会根据配置启动相应的容器,默认是tomcat。

    SpringBoot这种设计在微服务架构下有明显的优点(为什么要使用嵌入式服务器):

    • 可以创建独立、自启动的应用容器
    • 不需要构建War包并发布到容器中,构建和维护War包、容器的配置和管理也是需要成本和精力的
    • 通过Maven的定制化标签,可以快速创建SpringBoot的应用程序
    • 可以最大化地自动化配置Spring,而不需要人工配置各项参数
    • 提供了产品化特点,例如:性能分析、健康检查和外部化配置
    • 全程没有XML配置,也不需要代码生成

    44.什么是微服务

    微服务是一种架构风格,一个大型复杂的应用程序由一个或者多个微服务组成,各个微服务独立部署,每个服务只关注自己的业务。

    45.微服务的特点

    • 独立部署,扩展性强.
    • 多个开发团队可以并行开发.
    • 一台服务宕机,不会影响其他服务.
    • 技术选型灵活.

    46.Spring Cloud的核心功能

    功能名称 描述
    分布式/版本化配置 Spring Cloud Config为分布式系统中的外部化配置提供支持。
    服务注册与发现 Spring Cloud Eureka服务治理,是微服务中最为核心和基础的模块,主要用来实现各个微服务实例的自动化注册和发现。
    路由 Spring Cloud Zuul是提供动态路由、监控、安全等服务的框架。
    服务与服务之间的调用 1.Spring Cloud Ribbon是一个基于HTTP的客户端负载均衡工具;2.Spring Cloud Feign是一种声明式、模块化的HTTP客户端。
    断路器 Spring Cloud Hystrix,由于网络问题或者程序问题,服务并不是100%可用,如果服务出现问题,调用服务就会出现阻塞,这个时候如果出现大量请求,容器线程资源就会被耗尽,导致服务瘫痪。
    分布式消息传递 MQ

    47.Spring Cloud如何实现服务的注册与发现

    服务在发布时,指定对应的服务名将服务注册到注册中心。

    这一过程是springcloud自动实现 只需要在main方法添加@EnableDisscoveryClient 同一个服务修改端口就可以启动多个实例

    调用方法:传递服务名称通过注册中心获取所有的可用实例 通过负载均衡策略调用(ribbon和feign)对应的服务.

    48.SpringCloud断路器的作用

    当一个服务调用另一个服务由于网络原因或者自身原因出现问题时 调用者就会等待被调用者的响应 当更多的服务请求到这些资源时导致更多的请求等待 这样就会发生连锁效应(雪崩效应) 断路器就是解决这一问题。

    断路器有三种状态:

    状态名称 描述
    完全打开 一定时间内,达到一定的次数无法调用 并且多次检测没有恢复的迹象 断路器完全打开,那么下次请求就不会请求到该服务
    半开 短时间内有恢复迹象,断路器会将部分请求发给该服务。当能正常调用时,断路器关闭
    关闭 当服务一直处于正常状态,能正常调用,断路器关闭

    49.常用的负载均衡策略

    1. 简单轮询负载均衡 2. 加权响应时间负载均衡 3. 区域感知轮询负载均衡 4. 随机负载均衡

    50.Spring Cloud Config

    1. SpringCloudConfig就是我们通常意义上的分布式配置中心,把应用原本放在本地文件的配置抽取出来放在中心服务器,从而能够提供更好的管理、 发布能力。
    2. SpringCloudConfig分为服务端和客户端,服务端负责将git(svn)中存储的配置文件发布成REST接口,客户端可以从服务端REST接口获取配置。但客户端并不能主动感知到配置的变化,从而主动去获取新的配置, 它需要每个客户端通过POST方法触发各自的/refresh,SpringCloudBus就通过一个轻量级消息代理连接分布式系统的节点。
    3. 可以用于广播状态更改(如配置更改)或其他管理指令。
    4. SpringCloudBus提供了通过POST方法访问的endpoint/bus/refresh,这个接口通常由git的钩子功能调用,用以通知各个SpringCloudConfig的客户端去服务端更新配置。

    相关文章

      网友评论

          本文标题:hello world

          本文链接:https://www.haomeiwen.com/subject/lwysmftx.html