简单工厂和抽象工厂的区别
简单工厂模式:
这个模式很简单,而且使用在较为简单的情况下,一般用于小项目或者铲平很少扩展的情况(这样的工程类才不用经常更改)
它由三种角色组成:
工程类角色:这是本模式的核心,干有一定的商品逻辑和判断逻辑,根据逻辑的不同和,产生具体类的工程产品。如例子中的Driver类
抽象产品角色:它一般是具体产品继承的父类或是实现类的接口。由接口或者抽象类来实现,如例中的Car接口
具体产品角色。工厂创建的对象实例。在java中由一个具体的实现类实现,如例子中的Benz,Bmw类
抽象工厂模式:
可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。
而且使用抽象工厂模式还要满足一下条件: 系统中有多个产品族,而系统一次只有可能消费其中一族产品
同属于一个产品族的产品及其使用
抽象工厂模式的各个角色
抽象工厂角色:这事工厂方法模式的核心,与程序无关,是具体工厂角色必须实现的接口或必须继承的父类,在java中它由抽象类或接口来实现
具体工厂角色:它含有和具体业务逻辑有关的代码,由应用程序调用已创建对应的具体产品的对象,在Java中它具提的类来实现
抽象产品角色:它是具体产品继承的父类或是实现的接口。在java中一般有抽象类或者接口来实现
具体产品角色:具体工厂角色创建的对象就是此角色的实例,在Java中由具体的类来实现
Spring / Spring MVC
简介:
目的:解决企业开发的复杂性
功能:使用基本的JavaNean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
简单来说,spring是一个轻量级的控制反转IOC和面向切面AOP的容器框架
轻量
从大小与开销方面而言Spring都是轻量的,完整的Spring框架可以在一个大小只有MB
的JAR文件里发布,并且Spring所需要的处理开销也是微不足道的,此外Spring是非入侵式的:典型地,Spring应用中的对象不依赖于Spring的特定性
控制反转
Spring通过一种称作控制反转IOC的技术促进了松耦合,当应用了IOC一个对象以来其他对象会通过被动的方法传递(注入)进来。而不是自己创建,或是查找以来对象,你可以认为IOC与KNDI相反,不是对象从容其中寻找依赖,而是对象在初始化时,不等对象请求就主动将依赖传递给他
面向切面AOP
应用对象只实现它们应该做的。而相同的扩展部分,统一交给AOP处理。
容器(bean池就是享元模式)
Spring包含并管理对象的配置和生命周期。默认的bean每次调用都是相同的bean。详情看https://blog.csdn.net/sayhitoloverOvO/article/details/119976800
框架
spring可以将简单的配置组合成复杂的应用。在spring中,应用对象被声明式的组合,典型的是在一个xml文件里。spring也提供了很多基础功能,将应用逻辑开发留给了你
所有Spring的在这些特这可以使你可以编写更干净,更可管理,并且更易于测试的代码,它们也为spring中的各种模块提供了基础支持
spring常用的注入方式有哪些
构造方法注入,seetter注入,基于注解的注入
Spring中的bean时安全的吗
spring的bean 本身不具备线程安全的特性,但是还是要具体情况,具体分析
spring支持集中bean 的作用域?——5种:
singleton:默认设置。每次使用的都是同一个实例
prototype:原型模式。每次获取实例都会创建新实例。不会对bean进行跟踪
request::web中,基于不同的请求HTTP产生不同的bean
session;每次请求的会话HTTP Session产生不同的实例
globalsession:每次请求的会话HTTP Session都会产生新的实例,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效
自动装配bean的方式
-
隐式的bean发现机制和自动装配
-
在java代码或者XML中进行显示配置
spring 事务实现方式有哪些?
@Transactional的声明式事务管理
TransactionProxyFactoryBean的声明式事务管理
基于Aspectj AOP配置事务
编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
说一下 spring 的事务隔离?
事务隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度,当多个事务同时访问相同数据时,如果没有采取必要的隔离机制,就可能发生以下问题:
-
脏读:一个事务读到另一个事务未提交的更新数据。
-
幻读:例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样。
-
不可重复读:比方说在同一个事务中先后执行两条一模一样的select语句,期间在此次事务中没有执行过任何DDL语句,但先后得到的结果不一致,这就是不可重复读。
Spring MVC运行流程图:
Spring运行流程描述:
用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter;(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
-
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
-
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
-
数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
-
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
ViewResolver 结合Model和View,来渲染视图;
将渲染结果返回给客户端。
spring mvc 有哪些组件?
Spring MVC的核心组件:
-
DispatcherServlet:中央控制器,把请求给转发到具体的控制类
-
Controller:具体处理请求的控制器
-
HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略
-
ModelAndView:服务层返回的数据和视图层的封装类
-
ViewResolver:视图解析器,解析具体的视图
-
Interceptors :拦截器,负责拦截我们定义的请求然后做处理工作
@RequestMapping 的作用是什么?
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
-
value:指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
-
method:指定请求的method类型, GET、POST、PUT、DELETE等;
-
consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
-
produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
-
params: 指定request中必须包含某些参数值是,才让该方法处理。
-
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
@Autowired 的作用是什么?
调用bean注入到对象中。在对象被初始化时,主动构建一个bean,加入到对象中,先进性bean 的初始化,在进行对象的初始化
如果bean中包含别的bean被注入,那么也一样会构建先构建注入的bean
这种方法可以有效解决spring内部循环嵌套的问题