ssm框架知识点

1.Spring是如何管理事务的,事务管理机制,以及隔离级别?

 在spring中管理事务的核心是事务管理器。对不同的框架有不同的事务管理器对象。所有的事务管理器对象都实现了策略接口PlatformTransactionManager ,从而支持各种数据访问框架的事务管理。
​ Mybatis(JdbcTeamplate))的事务管理器 : DataSourceTransactionManager
​ Hibernate是事务管理器:HibernateTransactionManager
 事务的基本特性(ACID)
	原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要都回滚。
	一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。
举例来说,假设用户A和用户B两者的钱加起来一共是1000,那么不管A和B之间如何转账、转几次账,事务结束后两个用户的钱相加起来应该还得是1000,这就是事务的一致性。
	隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
	持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
2. 事务隔离级别
	数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况。
	read uncommitted 读未提交,一个事务可以读到另一个事务没有提交的数据。
		存在:3个问题(脏读、不可重复读、幻读)。
		解决:0个问题
	read committed 读已提交,一个事务读到另一个事务已经提交的数据。
		存在:2个问题(不可重复读(update 操作)、幻读)。
		解决:1个问题(脏读)
	repeatable read 可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。
		存在:1个问题(幻读),针对 insert操作
		解决:2个问题(脏读、不可重复读)
	serializable 串行化,同时只能执行一个事务,相当于事务中的单线程。
		存在:0个问题。
		解决:3个问题(脏读、不可重复读、幻读)

2.Spring aop的实现原理

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过运行期动态实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容。
AOP的底层封装了两种动态代理,默认会使用jdk动态代理,如果目标对象没有实现接口,则使用Cglib动态代理;当让我们可以直接指定使用cglib动态代理。
AOP通过采取横向抽取机制,已经完全取代了传统纵向继承体系重复性代码的编写方式
增强类型
前置增强(Before):执行时间点:切点方法执行之前执行
后置增强(AfterReturning):执行时间点:切入点方法正常执行之后。抛出异常就不执行了。
异常增强(AfterThrowing):执行时间点:切入点方法执行产生异常后执行。它和后置增强只能执行一个
最终增强(After):执行时间点:无论切入点方法执行时是否有异常,它都会在其后面执行。
环绕增强(Around):作用:它是 spring 框架为我们提供的一种可以在代码中手动控制增强代码什么时候执行的方式。

3.ioc和di是什么

### 1、耦合和解耦的概念
   ​ 耦合(Coupling)就是两个东西通过某种作用关联在了一起,例如两个子系统之间的关联程度,两个类之间的关联关系。耦合度就是程序中各个模块之间相互关联的度量。
   ​ 当一个子系统(或类)发生变化时对另一个子系统(或类)的影响很小,则称它们是**松散耦合**的;反之,如果变化的影响很大时,则称它们是**紧密耦合**的。
	2.解耦:字面意思就是解除耦合关系。程序间的解耦就是降低耦合度。模块间必然有依赖关系,零耦合是做不到的,可以将耦合度降到最低。
	1. 设计程序的目标**高内聚低耦合**: 一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度却不要那么紧密。
	2. 依赖注入(DI)
成功做到了把AccountService对象赋值给了AccountController的属性;它们之间的关系是由spring配置实现的;
这种优化方案其实就是依赖注入。
依赖注入是控制反转的一种表现方式。依赖查找也是控制反转的一种表现方式
	1. 根据id获取对象,返回的是Object对象,需要进行强制转换
   context.getBean("account");
	2. 根据class获取对象,返回Account类型对象,不需要进行强制转换
    context.getBean(Account.class);
	3. 根据id 和 class获取对象,返回Account类型对象,不需要进行强制转换(需要满足两个条件)
    context.getBean("account", Account.class);

4.spring中用到了哪些设计模式

1、工厂模式
​ Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象
2、单例模式
​ spring默认创建的对象是单例模式对象;可以通过 bean标签的scope属性或者@Scope注解设置。
3、动态代理
​ aop采用了动态代理模式。JDK, cglib 两种动态代理
4、模板方法模式
​ spring中提供了大量的模板对象, 例如JdbcTemplate对象,应用了模板方法模式。
" + count + “记录”);
}

5.Spring中bean的作用域是哪些

① singleton
使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。
② prototype
使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
③ request
该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
④ session
该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
⑤ global-session
该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。

6.spring框架实现实例化和依赖注入的方式分别是什么

框架实现实例化:
第一种:使用构造器实现Bean的实例化
SpringIOC容器既能使用默认空参构造器也能使用有参数的构造器创建bean
第二种;使用静态工厂方式创建Bean实例化对象
使用这种方式除了指定必须的class属性,还要指定factory-method 属性来指定实例化Bean的方法个,该方法必须是静态方法。而且使用静态工厂方法也允许指定方法参数,spring IoC 容器将调用此属性指定的方法来获取Bean。
第三种:使用实例化工厂的方式创建Bena实例化对象
使用这种方式不能指定class 属性,此时必须使用factory-bean属性来指定工厂Bean的id, factory- method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样。
依赖注入:
依赖注入是Spring 协调不同Bean实例之间的合作而提供的一种工作机制,在确保Bean实例之间合作的同时,并能保持每个Bean的相对独立性。
1)基于构造函数注入
构造函数注入就是通过Bean类的构造方法,将Bean 所依赖的对象注入。构造函数的参数一般情况 下就是依赖项,spring 容器会根据bean 中指定的构造函数参数来决定调用那个构造。
2)基于set方法注入
将Bean 所依赖的对象通过设置函数注入,Bean 需要为注入的依赖对象提供设置方法。
3)基于自动装配注入
Spring I0C容器会基于反射查看Bean定义的类。当Spring 容器发现Bean被设置为自动装配的by Type 模式后,它会根据参数类型在Spring 容器中查找与参数类型相同的被依赖Bean对象,如果已经创建,则会把被依赖的对象自动注入到Bean中,如果没有创建,则不会注入。注入过程需要借助Bean 提供的设置方法来完成,否则注入失败。
4)基于注解的依赖注入
Spring主要提供了@Autowired和@Resource注解模式,下面也重点讨论这两种注解模式。
@Autowi red装配顺序
@Autowired默认按类型装配(这个注解是属于spring 的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required 属性为false, 如: @Autowired (required=false),如果我们I想使用名称装配可以结合@Qualifier注解进行使用。
@Resource装配顺序
1.如果同时指定了name和type,则从Spring.上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一 bean进行装配,找不到或者找到多个,都会抛出异常
4.如果既没有指定name,又没有指定type,则自动按照byName.方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配

7.springmvc的工作流程

流程:
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)
第三步:处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler(处理器)对象,多个HandlerInterceptor拦截器对象)
第四步:前端控制器调用处理器适配器HandlerAdapter去执行Handler
第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler
第六步:Handler执行完成后,会给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)
第八步:前端控制器请求视图解析器去进行视图解析
根据逻辑视图名解析成真正的视图(jsp),通过这种策略很容易更换其他视图技术。
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)
第十一步:前端控制器向用户响应结果

8.spring以及springmvc常用 的注解有哪些

@Component:标准一个普通的spring Bean类。 
@Controller:标注一个控制器组件类。 
@Service:标注一个业务逻辑组件类。 
@Repository:标注一个DAO组件类。
@Scope:注解也可以指定Bean实例的作用域。
@Resource和@Autowired 都是做bean的注入时使用
@RequestMapping 来映射 Request 请求与处理器 
@requestParam 
@@ResponseBody

9.简单介绍一下spring和struts2的区别有哪些

(1)、机制:spring mvc的入口是servlet,而struts2是filter。
(2)、性能:spring mvc使用更加简洁,开发效率比struts2高。
(3)、参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。
(4)、设计思想上:struts更加符合oop的编程思想, spring就比较谨慎,在servlet上扩展。
(5)、intercepter的实现机制:struts有自己的interceptor机制,spring mvc用的是独立的AOP方式。
(6)、spring mvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring3 mvc就容易实现restful url。
struts2是类级别的拦截,每次发一次请求都会实例一个action。一个类(Action对象)对应一个request上下文;struts2实际上是通过setter getter方法与request打交道的;实现restful url要费劲
(7)、struts2类属性被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。所有Action变量也是共享的,这不会影响程序运行,却给编码,读程序时带来麻烦。
spring3 mvc的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量,
(8)、spring3 mvc的验证也是一个亮点,支持JSR303,处理ajax的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可。

10.springmvc前端控制器是什么,处理器映射器是什么

DispatcherServlet:前端控制器 (SpringMVC框架提供)
作用:接收用户请求,响应结果,相当于中央处理器,DispatcherServlet是整个流程控制的中心,由它调用其它组件完成用户请求的处理。DispatcherServlet的存在降低了组件之间的耦合性。

HandlerMapping:处理器映射器 (SpringMVC框架提供)
作用:根据请求的url查找Handler。
理解为一个Map<url,Handler>,HandlerMapping负责根据用户请求的Url找到Handler即处理器,SpringMVC提供了不同的映射器来实现不同的映射方式,例如:实现接口方式,注解方式等。

11.springmvc如何进行参数绑定

springmvc中,接收页面提交的数据是通过方法形参来接收的。从客户端请求的key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上,然后就可以在controller中使用该参数了。

12.springmvc获取表单数据的几种方式

1、直接把表单的参数写在Controller相应的方法的形参中 
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/login")
    public String loginByUser(String userName, String userPwd) {
        System.out.println("userName is:" + userName);
        System.out.println("userPwd is:" + userPwd);
        return "success";
    }
}
2.通过HttpServletRequest接收
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/login")
    public String loginByUser(HttpServletRequest request) {
        String userName=request.getParameter("userName");
        String userPwd=request.getParameter("userPwd");
        System.out.println("userName is:" + userName);
        System.out.println("userPwd is:" + userPwd);
        return "success";
    }
}
3.通过一个bean来接收
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/login")
    public String loginByUser(User user) {
        System.out.println("userName is:" + user.getUserName());
        System.out.println("userPwd is:" + user.getUserPwd());
        return "success";
    }
}
4.通过json数据接收

13.ssm架构的整合流程是怎样的

项目创建与基础配置:准备数据库环境,创建maven-webapp项目,配置日志,配置Lombok
整合mybatis:加入相关依赖,指定资源文件位置,#### Spring整合Mybatis配置,测试
整合service代码
整合springmvc:导入springmvc的依赖,配置SpringMVC,修改web.xml(配置DispatherServlet)
整合其他技术:restful编程,添加日志,封装返回值
统一处理异常:自定义异常,定义异常处理类

14.mybatis和hibernate之间的优缺点

1.两者最大的区别:
针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。
2.开发难度对比
Hibernate的开发难度要大于Mybatis。主要由于Hibernate比较复杂、庞大,学习周期较长。
而Mybatis则相对简单一些,并且Mybatis主要依赖于sql的书写,让开发者感觉更熟悉。
3.sql书写比较
Mybatis的SQL是手动编写的,可以按需求指定查询的字段。没有自己的日志统计,借助log4j来记录日志。
Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。不过Hibernate具有自己的日志统计。
4.数据库扩展性比较
Mybatis由于所有SQL都是依赖数据库书写的,所以扩展性,迁移性比较差。
Hibernate与数据库具体的关联都在XML中,所以HQL对具体是用什么数据库并不是很关心。
5.缓存机制比较
相同点:Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。
不同点:Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。
MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
两者比较:因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。
而MyBatis在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。

15.mybatis中使用#和$书写占位符有什么区别

#将传入的数据都当成一个字符串,会对传入的数据自动加上引号;
$将传入的数据直接显示生成在SQL中

16.mybatis中的动态sql是什么意思

动态sql是指在进行sql操作的时候,传入的参数对象或者参数值,根据匹配的条件,有可能需要动态的去判断是否为空,循环,拼接等情况;

17.mybatis中mapper动态代理规范是什么

1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

18.mybatis的执行流程是什么

第一步:通过Resources加载配置好的mybatis.xml配置文件。
第二步:然后看第二句话,这句话是关键。我们首先new了一个SqlSessionFactoryBuilder对象,他是SqlSessionFactory的构建者。我们调用了他的build()方法。
第三步:现在我们有了一个SqlSessionFactory了,生成SqlSession
第四步:jdk动态代理生成mapper接口的代理对象
第五步:通过第四步返回的代理对象的getUser方法调用getMapper方法最终执行的方法

19.说说你比较熟悉的设计模式和应用场景

单例模式:
一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它们的实例。
工厂模式:
属于创建类的模式,它提供了一种创建对象的方式。
在工厂模式中,在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
构建者模式:
属于创建类的模式,提供了一种创建对象的方式
使用多个简单的对象一步一步构建成一个复杂的对象。
与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

20.动态代理的两种方式和区别

**两种动态代理的区别**
- **JDK动态代理**
1. JDK自带的功能,**不需要引入**依赖
   2. 基于接口动态代理,**没有接口**不能代理
   2. 目标对象和代理类都实现类**同一接口**
- **cglib动态代理**
1. 属于第三方的jar包,**需要**引入依赖
   2. 基于子类代理,**有无接口**均可
   2. 代理类是目标对象的**子类**对象
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值