美文网首页
框架总结

框架总结

作者: 取名废同学 | 来源:发表于2018-10-21 21:43 被阅读0次

(一)Spring本身

Spring的理解?

【Spring是一个轻量级的IoC和AOP容器框架,Java企业级应用的开源开发框架,主要用于开发Java应用。目的是解决企业应用开发的复杂性,2004年发布】

是一个三层的架构,为J2EE提供集成框架:【web层:SpringMVC;业务层:spring的IOC;持久层:spring的JDBC、ORM等框架】

Spring优点?

1、轻量级容器框架

2、(Spring的IOC容器)降低组件间的耦合性。

3、Spring提供了众多辅助类(如JDBC Template等)

4、Spring对主流框架提供了支持(如SpringMVC、Mybatis、Hibernate)

5、独立于各种应用服务器

6、Spring的高度开放性,并不强制应用完全依赖于Spring,可自由选用Spring框架的部分或全部。

7、提供了对多种技术的支持(如单元测试、JMS...)

Spring适用的范围:

1、构建企业应用:SSH/SSM

2、单独使用bean容器(在spring中的对象都称作bean,spring可单独做对象Bean的管理)

3、单独使用aop作为切面处理

4、自由选用spring的其他功能,如对消息的支持等

Spring框架的2个核心功能:

1、负责创建、管理所有Java对象,这些java对象称为Bean

2、用依赖注入(DI)的方式处理容器中Bean之间的依赖关系。

(二)Spring IOC 和 DI

对Spring IOC和DI的理解,有什么区别?

DI和IOC是同件事情的不同描述

【依赖注入(DI):从应用程序角度,应用程序依赖容器创建并注入它所需的外部资源。即指Spring创建对象的过程中,将对象依赖属性通过配置进行注入;

控制反转(IOC):从容器角度,容器控制应用程序,由容器反向地向应用程序注入应用程序所需的外部资源。即IoC 控制反转,指将对象的创建权,反转到Spring容器 】

DI(依赖注入):Spring的核心机制

优点:减少耦合,独立开发组件,DI提供使用接口编程

DI依赖注入不能使组件之间相互依赖,相互制约,目的是减少组件之间的耦合度,使开发变得简单。

DI强调的是“实现”。

DI有两种:(1)设值注入:IOC容器使用成员变量的setter方法来注入被依赖对象,通过<property.../>元素驱动spring执行setter方法;

例如:一个接口Axe,有方法chop();一个接口Person,有方法useAxe();实现类Person实现Person,则类中可以有Axe axe对象,并用setAxe(Axe axe)方法注入;在spring的xml配置文件中,指明依赖关系:

<bean id="chinese" class="xxx">

<property name="axe"   ref="stoneAxe" /> <!--驱动调用chinese的setAxe()方法,将stoneAxe作为传入参数-->

</bean>

<bean id="stoneAxe" class="xxxx" />   <!--配置stoneAxe实例-->

(2)构造注入:IOC容器使用构造器来注入被依赖对象,通过构造方法在配置文件中使用元素指定构造器的参数,通过<constructor-arg.../>元素驱动spring执行带参数的构造器。

例如:还是以上的例子,但在Chinese类中,有Axe axe; 构造方法:public Chinese(Axe axe);再在xml配置文件中:

<bean id="chinese" class="xxx">

<constructor-arg ref="steelAxe"/> <!--驱动调用chinese带一个参数的构造器来创建对象->

</bean>

<bean id="steelAxe" class="xxxx" />   <!--配置steelAxe实例-->

SpringIOC

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

Spring的IOC有三种注入方式 :第一是根据属性注入,也叫set方法注入; 第二种是根据构造方法进行注入;第三种是根据注解进行注入

IOC的优点:易测试

(三)Spring容器:BeanFactory和ApplicationContext

Spring容器?BeanFactory、ApplicationContext

BeanFactory 接口和 ApplicationContext 接口有什么区别 ?

是Spring的两个容器,常用接口(ApplicationContext和BeanFactory接口)

BeanFactory:产生新的实例,负责配置、创建、管理Bean

ApplicationContext:也叫做Spring上下文,提供框架的实现;一般用在spring的实现类中,作为用于访问容器中的bean常用接口

【(1)ApplicationContext接口继承BeanFactory接口,spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。

(2)ApplicationContext是对BeanFactory扩展,它可以进行国际化处理、事件传递和bean自动装配以及各种不同应用层的Context实现。开发中基本都在使用ApplicationContext, web项目使用WebApplicationContext ,很少用到BeanFactory

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

IHelloService helloService = (IHelloService) beanFactory.getBean("helloService");

helloService.sayHello();】

(四)Spring常用注解:

@Autowired:修饰在何处以及如何完成自动装配。修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。

@Required:表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。

(五)Spring有几种配置方式?

将Spring配置到应用开发中有以下三种方式:

基于XML的配置、基于注解的配置、基于Java的配置

(1)基于XML的配置:

所有的Spring组件都可以用xml文件的形式来进行配置。不会出现其他的Spring配置类型。

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

(2)基于Java的配置:

Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。

由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IoC容器来管理。@Bean声明所起到的作用与<bean/> 元素类似。

被@Configuration所注解的类则表示这个类的主要目的是作为bean定义的资源。被@Configuration声明的类可以通过在同一个类的内部调用@bean方法来设置嵌入bean的依赖关系。

@Configuration:声明该类作为bean定义的资源;@Bean:bean名:id="myService" 

(3)基于注解的配置:

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

用于自动装配变量的注解:

@Required:该注解应用于设值方法。

@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。

@Qualifier:该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义。

JSR-250 Annotations:Spring支持基于JSR-250 注解的以下注解,@Resource、@PostConstruct 和 @PreDestroy。

(六)Bean

1、Bean的作用域:

singleton:当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。

prototype:Prototype作用域的bean会导致在每次对该bean请求时都会创建一个新的bean实例。

request:在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用 域仅在基于web的Spring ApplicationContext情形下有效。

session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

global session:在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于 web的Spring ApplicationContext情形下有效。

2、Bean注入属性的方式

(七)AOP:面向切面编程(AOP):

对AOP的理解: AOP可对业务逻辑各个部分进行隔离,降低业务逻辑各部分间的耦合度,提高程序可重用性,提高开发效率。


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

单例模式—在spring配置文件中定义的bean默认为单例模式。

工厂模式—BeanFactory用来创建对象的实例。

代理模式—在AOP和remoting中被用的比较多。

模板方法—用来解决代码重复的问题。比如.RestTemplate,JmsTemplate,JpaTemplate。

前端控制器—Spring提供了DispatcherServlet来对请求进行分发。

视图帮助(View Helper)—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。

依赖注入—贯穿于BeanFactory/ApplicationContext接口的核心理念。


Spring框架的本质就是通过XML配置类驱动java代码,从而把耦合关系提取到配置文件中管理,实现了系统中各组件的解耦。

Spring通过配置文件描述Bean及Bean之间的依赖关系,并通过Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。


SpringMVC:

对SpringMVC的理解?

SpringMVC是一个表现层的框架,是Spring的一个模块,基于MVC架构来简化web应用程序开发的应用开发框架,将model、view和controller三者分离,简化开发。

【model层:比如一个实体类

view层:定义一个jsp

Controller层:springMVCDemo-servlet.xml文件:SpringMVC的配置文件,如配置视图解析器

SpringMVC和ajax的调用?

方法前加上@RequestBody注解,直接返回java对象。

项目中用了fastjson,将java对象转化为json对象(js可识别),ajax.post()、get()传值得值

SpringMVC的异常处理?

可以抛给Spring框架,由Spring处理,只需配置简单的异常处理器,在异常处理器上添视图页面。

SpringMVC的核心入口类?  DispatchServlet,用来处理所有的HTTP请求和响应。

SpringMVC的控制器:用@Controller注解,是单例模式

SpringMVC的返回模式:可以是String等

SpringMVC中将视图和数据合并的类?:ModelAndView

SpringMVC常用注释:

@Controller:修饰类,表明该类作为控制器的角色,Spring不需要你继承任何其他控制器基类或引用Servlet API。

@RequestMapping 注解:该注解是用来映射一个URL到一个类或一个特定的方处理法上。

SpringMVC的优点:

(1)基于组件技术的。全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件,并且和Spring提供的其他基础结构紧密集成。

(2)不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)

(3)可以任意使用各种视图技术(jsp、js、html等)

(4) 支持各种请求资源的映射策略

(5)易于扩展

SpringMVC怎么样设定重定向和转发的?

(1)在返回值前面加"forward:"就可以让结果转发,譬如"forward:user.do?name=method4"

(2)在返回值前面加"redirect:"就可以让返回值重定向,譬如"redirect:http://www.baidu.com"

SpringMVC的流程:

1、用户 发送请求 到 前端控制器

2、前端控制器 委托请求 到 页面控制器

3、处理器 调用业务对象 到 模型

4、模型 返回模型数据 到 页面控制器/处理器

5、页面控制器/处理器 返回 ModelAndView 到 前端控制器

6、前端控制器 渲染 视图

7、视图 返回控制 到 前端控制器

8、前端控制器 产生响应 返回用户

组件:

1、前端控制器DispatcherServlet(不需开发):框架支持,用于接收请求,响应结果,相当于转发器,中央处理器。是当于mvc模式中的c。是整个流程控制的中心,由它调用其它组件处理用户的请求,降低了组件之间的耦合性。

2、处理器映射器HandlerMapping(不需开发):根据请求的url查找Handler(即处理器)。springmvc提供了不同的映射器实现不同的映射方式,如配置文件方式、实现接口方式、注解方式等。

3、处理器适配器HandlerAdapter: 作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler

4、处理器Handler: 

注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler。Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处

5、视图解析器View resolver(不需要攻城狮开发),由框架提供。作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)

6、视图View:需要开发。view是一个接口,实现类支持不同的view类型。


Mybatis:

是一个持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录

【其他持久层框架:hibernate】

mybatis的使用?

需要一个配置文件,实体类bean,一个接口类,一个xml文件或者是在接口类上用注解写sql语句(@select、@update、@delete),链接数据库。

mybatis面试题目:

1、#{}和${}的区别是什么?

#{}:变量占位符

${}:sql的参数占位符,直接替换,容易出现sql注入的问题

2、xml映射文件中,除了常见的seletct | insert | update | delete外还有什么标签?

<resultMap>(<resultMap>:用于解决实体类中属性和表字段名不相同的问题,其中还有<id>和<result>标签)<parameterMap>、<sql>、<include>、<selectKey>

<mapper>:每个映射文件的根标签,重点关注<mapper>标签中namespace属性

AccountMapper.java

AccountMapper.xml:

3、Mybatis进行批量插入,能返回数据库主键列表吗?

能。

4、mybatis如何将sql执行结果封装为目标对象并返回的?有哪些映射形式?

【(1)<resultMap>标签,定义列名和对象属性名之间映射关系;(2)使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写。

有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。】

5、Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别。

【只需要把selectOne()修改为selectList()即可;多对多查询,其实就是一对多查询,只需要把selectOne()修改为selectList()即可。】

6、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

【不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。】

7、使用Mybatis的mapper接口调用时有哪些要求

【1、Mapper接口方法名与xml中sql的id名相同;

2、mapper接口方法输入输出参数类型和xml中parameterType、retsultType类型相同;

3、mapper接口类路径对应xml中namespace】

8、Mybatis的一级缓存和二级缓存?

【Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象

Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。】


Hibernate:

一个开源的、轻量级的ORM工具,对JDBC进行非常轻量级的对象封装,将POJO与数据库表建立映射关系。可自动生成SQL语句,自动执行。

可应用在任何使用JDBC的场合,可在java客户端或在servlet/jsp的应用中使用。

Hibernate框架有很多优点。它们分别如下:

1、开源和轻量级

2、快速性能:Hibernate框架的性能很快,因为缓存在Hibernate框架内部使用。 hibernate框架中有两种类型的缓存:一级缓存和二级缓存。一级缓存默认是启用的。

3、数据库独立查询:HQL(Hibernate查询语言)是面向对象的SQL版本。 它生成数据库独立查询。 所以你不需要编写数据库特定的查询语句。 在Hibernate之前,如果项目更改了数据库,我们需要更改SQL查询,从而导致维护变得非常复杂。

4、自动创建表:Hibernate框架提供了自动创建数据库表的功能。 因此,无需手动在数据库中创建表。

5、简化复杂连接:在hibernate框架中可轻松获取多个表中的数据。

6、提供查询统计和数据库状态:Hibernate支持查询缓存,并提供有关查询和数据库状态的统计信息。

hibernate主要结构:

持久化类pojo(如student)、持久类映射文件(student.hbm.xml,直接对着持久类生成)、hibernate配置文件(hibernate.cfg.xml)

对着这个项目生成Hibernate.cfg.xml

使用JUnit测试 

@Before:初始化方法

@Test:测试方法

@After:释放资源

总结:

插入数据(包括图片流!):

更新数据:

查找操作:

查找并输出图片:

删除:

ORM映射:ORM将对象映射到数据库中存储的数据的编程技术。

将关系数据库包装成面向对象的模型的工具。

ORM的基本映射方式:数据库表映射类、数据库表的行映射对象(实例)、数据库表的列(字段)映射对象的属性。完成对象模型和关系模型的相互映射。

hibernate面试题:

1、hibernate并发机制:

【(1)hibernate的session对象非线程安全,对单个请求,对各工作单元,单个事务只使用一次便丢弃。

(2)多事务并发访问同一块资源,可能引发脏读、不可重复读、幻读的问题。

解决方案:设置事务隔离级别:串行化(最高)、可重复读、不可重复读/已提交读、未提交读】

2、update和saveOrUpdate?

【update:必须是已持久化了的对象。

saveOrUpdate:都可以。已持久的,则更新;未持久的,则save到数据库中。】

3、hibernate三种状态:瞬时、游离、持久

【1)、从瞬时态save(),变成持久化状态;

2)、往session中存对象,是往它的缓存和数据库中各存了一份,缓存中的叫持久对象,当session关闭,则对象变成游离状态;

3)、游离状态update()时,变成持久状态

4)、持久态delete()时,变瞬时状态】

4、怎么在控制台看到hibernate生成并执行的sql?

在配置文件hibernate.cfg.xml中把hibernate.show_sql改为true(但会加重系统负担,不利于性能调优)

5、hibernate工作原理及为什么要用?

【工作原理:1、读取并解析配置文件

2、读取并解析映射信息,创建sessionFactory

3、打开session

4、创建事务Transaction

5、持久化操作

6、提交事务

7、关闭session和sessionFactory

为什么要用?1、对JDBC访问数据库进行封装,简化。2、支持各种关系数据库,从一对一到多对多的各种复杂关系。】

6、SessionFactory:单个数据库映射关系经过编译后的内存镜像,线程安全,是生成session的工厂;是Hibrenate单例数据存储和线程安全的,以至于可以多线程同时访问。一个SessionFactory 在启动的时候只能建立一次。

session:会话,提供应用程序和存储在数据库中数据间的接口

Transaction:事务,代表一次原子操作,具有数据库事务的概念。一个session内可能包含多个transaction对象。

TransactionFactory:事务工厂,是生成Transaction对象实例的工厂,无需应用程序直接访问。负责对底层具体事务实现封装成hibernate事务。

7、

8、hibernate中怎么实现类之间的关系(一对一,多对多)?

类与类之间的关系主要体现在表与表之间的关系进行操作,都是对对象进行操作。

程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many。

9、JDBC、hibernate和Mybatis区别

【JDBC:较底层,对性能要求较高,流程是注册数据库驱动-->建立数据库连接-->建立statement,sql语句传给statement执行-->返回结果,则放到ResultSet对象中,遍历获取;

Hibernate:在JDBC基础上进行封装,对数据库进行完整性控制,是全自动ORM映射工具,数据库移植性好;将数据库中的数据表映射为持久层的Java对象,对sql语句进行修改和优化较困难;

Mybatis:在JDBC基础上进行封装,灵活使用sql语句,半自动ORM映射工具,需要收到编写sql完成查询关联对象或关联集合。将sql语句中的输入参数和输出参数映射为java对象,sql修改优化较方便。但MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。】

10、优化Hibernate所鼓励的7大措施:

1.尽量使用many-to-one,避免使用单项one-to-many

2.灵活使用单向one-to-many

3.不用一对一,使用多对一代替一对一

4.配置对象缓存,不使用集合缓存

5.一对多使用Bag 多对一使用Set

6.继承使用显示多态 HQL:from object polymorphism="exlicit" 避免查处所有对象

7.消除大表,使用二级缓存


Struts2一种基于MVC的轻量级的web应用框架。

基于POJO的Action的MVC Web框架。它基于当年的Webwork和XWork框架,继承其优点,同时做了相当的改进。

需要action类(model),包含execute()方法

xml文件为view:

struts.xml:(配置对应以上的action(model)和index.jsp(view))

以及web.xml的配置。

struts2的工作流程:

1、浏览器发送请求到StrutsPrepareAndExecuteFilter

2、调用了execute()方法

3、xxxAction调用业务方法

4、Model组件返回业务结果

5、xxxAction返回逻辑视图名

6、转发到视图页面

7、生成响应内容

8、输出响应。、

struts2的工作原理:

客户端发送请求

经过一系列的过滤器

FilterDispatcher通过ActionMapper来决定这个REquest需要调用的Action

FilterDispather交给ActionProxy

通过ConfigurationManager询问struts.xml找到对应的Action

ActionProxy创建一个ActionInvocation实例

调用Action Action执行完毕ActionInvocation负责根据struts.xml中的配置找到对应的返回结果


SSM框架:

SpringMVC 作为表现层,Spring作为业务层,Spring data作为持久层。

springMVC和struts2的对比:

1. springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。

2、springmvc基于方法开发(一个url对应一个方法),也就是一个方法对应于一个请求,属于方法拦截,请求的数据方法不共享,可以设计单例或多例(主要单例)。struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。

4. Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

dao层和model层区别:

dao是数据持久化层,负责数据库操作,model负责数据模型。

AJAX是什么? 描述ajax的原理

答:Ajax又叫异步刷新,(JavaScript和xml)原理:使用HttpRequest向服务器发送异步请求,服务器返回处理结果。

hibernate多对一:

保存数据最好通过多的一方来维护关系,这样可以减少update语句的生成,从而提高hibernate的执行效率!

多的一方:

一的一方:

Dept.hbm.xml配置:

测试时建议多的一方操作:

SSM和SSH不同主要在MVC实现方式,以及ORM持久化方面不同(Hiibernate与Mybatis)。SSM越来越轻量级配置,将注解开发发挥到极致,且ORM实现更加灵活,SQL优化更简便;而SSH较注重配置开发,其中的Hiibernate对JDBC的完整封装更面向对象,对增删改查的数据维护更自动化,但SQL优化方面较弱,且入门门槛稍高。

相关文章

  • java集合框架学习总结

    title: java集合框架学习总结 tags:集合框架 categories:总结 date: 2017-03...

  • Java集合框架总结篇

    Java集合框架总结篇

  • python四种web框架总结以及MySQL优化

    一、总结一下四种常用的web框架:Django,Flask,Tornado,Bottle 1.MVC: 总结框架之...

  • 框架总结

    (一)Spring本身 Spring的理解? 【Spring是一个轻量级的IoC和AOP容器框架,Java企业级应...

  • 框架总结

    1. 能力框架 优先级应该是 逻辑思维—>stocks—>ico—>技术了解/项目管理/文案能力 2.策略产品开发...

  • 常用开源框架以及学习网站

    常用框架 学习网站总结

  • rpc框架研究

    RPC框架总结 该总结主要是研究各个rpc的线程进程模型框架,以及主要提供的一些功能点。通过各个框架对c++的实现...

  • gin框架总结

    gin框架总结 一 gin框架初识 1.1 helloworld gin框架中的路由是基于httprouter[h...

  • 关于封装框架总结

    关于封装框架总结 常见的框架 1、常见的框架学习前端的都知道,前端有很多的丰富的框架。例如:通用框架:jQuery...

  • 2018 深入解析Android热修复技术

    本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结 通过阅读本文,...

网友评论

      本文标题:框架总结

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