ssm框架复习笔记

1.ioc控制反转

IoC(Inverse of Control:控制反转)是⼀种设计思想,就是 将原本在程序中⼿动创建对象的控制权,交由Spring框架来管理。 IoC 在其他语⾔中也有应⽤,并⾮ Spring 特有。

2.依赖注入

bean什么时候被创建?

  1. Spring 容器启动初始化的时候(所有单例非懒加载的bean)
  2. 懒加载(lazy-init)的bean 第一次进行getBean的时候

在创建bean的过程中

  1. 要去创建一个对象
  2. 要去将对象中要注入的属性注入进这个bean中
    在这里注入属性这个事情,要判断是基于什么的,xml还是注解,xml的大致流程,获取类的需要注入的属性的值,放到一个list里,遍历然后依次注入
    注意,xml里注入的时候spring是根据get方法去决定bean属性名的
    如果注入的属性的对应类型不对的话,会使用convertor对类型进行转换
    注入属性需要使用反射

3.AOP

​ AOP(Aspect-Oriented Programming:⾯向切⾯编程)能够将那些与业务⽆关,却为业务模块所共同调⽤ 的逻辑或责任(例如事务处理、⽇志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模 块间的耦合度,并有利于未来的可拓展性和可维护性。
Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接⼝,那么Spring AOP会使⽤JDK Proxy,去创建代理对象,⽽对于没有实现接⼝的对象,就⽆法使⽤ JDK Proxy 去进⾏代理了,这时候 Spring AOP会使⽤Cglib ,这时候Spring AOP会使⽤ Cglib ⽣成⼀个被代理对象的⼦类来作为代理,

4.bean生命周期

singleton和prototype对象
singleton单例对象:
出生:与容器一起创建或者懒加载第一次调用getbean
存活:容器存活即存活
死亡:容器死亡即死亡
总结:它的生命周期与容器一致
prototype对象
出生:使用对象时被创建
存活:对象在使用就存活
死亡:对象不再使用,被垃圾回收机制清理掉
总结:这种对象,在容器创建之后,就和普通的对象一样了
注意:多个线程访问同一个bean时会存在线程不安全问题
如果需要多个线程访问bean对象并且要求线程安全怎么办?
在对象中将可变成员变量保存在threadLocal中

5.Spring事务隔离级别和事务传播属性

隔离级别与数据库四大隔离级别相同
事务传播:

  1. REQUIRED(默认属性) 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域。如果前面的方法已经创建了事务,那么后面的方法支持当前的事务,如果当前没有事务会重新建立事务。
  2. MANDATORY 支持当前事务,如果当前没有事务,就抛出异常。
  3. NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
  4. NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  5. REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
  6. SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
  7. NESTED 支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。 嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。
    总结:
    1.是否要何种条件下都要新建事务,不使用当前情况(有或者没有事务):是:REQUIRES_NEW
    2.是否使用当前事务,以及如果没有事务怎么处理
    1)需求事务,如果当前没有事务,新建事务 REQUIRED
    2)需求事务,如果没有事务抛异常,MANDATORY
    3.是否不使用事务,以及没有事务怎么处理
    1)不需求事务,如果当前有事务,将事务挂起 NOT_SUPPORTED
    2)不需求事务,如果当前有事务,抛出异常 NEVER
    4.顺其自然型
    1)SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
    2)NESTED

6.写一写常见注解

spring:
@Component
@Service
@Controller
@Configuration
@Autowired
@Resource
​@Repository
springmvc:
@RequestMapping
@RequestParam
@RequestBody
@ResponseBody
@ParamVariable
@RestController
@Transactional控制事务的
@ControllerAdvice异常处理的
springboot:
@SpringbootApplication
@SpringbootConfiguration
@EnableAutoConfiguration
@ComponentScan
@SpringbootApplication这一个注解=下面的那三个注解
@MapperScan
写这个跟写英文默写似的……

7.@autowired和@resource的区别?

@Autowired:可以对类成员变量、方法、构造方法进行标注
默认按照类型注入,若要按照名称注入,需要搭配**@Qualifier**注解一起使用
@Resource:默认按照名称来装配注入
如果在一个容器中,需要装配的对象对应的类型有多个实例的话,使用@Resource

8.mybatis 防止sql注入?$和#的区别是什么?传入表名用哪个?

防止sql注入使用#{},和PreparedStatement类比

#$
等于给数据打引号等于什么都不加显示数据
很大程度上防止sql注入无法防止sql注入
#{xxx},使用的是PreparedStatement,会有类型转换,比较安全${xxx},使用字符串拼接,容易SQL注入

如果需要动态传入表名,就统一使用${},然后添加属性statementType=“STATEMENT”

9.springmvc工作原理

在这里插入图片描述
大概就是这个意思
请求进来:来找DispatcherServlet,然后DispatcherServlet根据请求地址,查看HandlerMapping,找HandlerAdapter中哪个Handler可以处理这个请求,处理完成后,返回ModelAndView,给DispatcherServlet,DispatcherServlet拿着这个mav去找视图解析器ViewResolver,解析视图,中间的变量在ModelMap里找,然后渲染完成之后,传给客户,请求完成

10.@ModelAttribute注解的用法

ModelMap继承了Model和Map,是springmvc里用来给view中保存数据的一个类,ModelandView里面的model
见:https://www.4spaces.org/spring-mvc-and-the-modelattribute-annotation/
@ModelAttribute是spring中的一个常用注解,它的Target在方法,或者方法的参数上
1.如果它注释在Controller的一个方法上,那么在这个方法,在任何其他方法调用之前都会先调用,(一般是处理ModelMap,向里面加一点东西)
如果方法没有返回值 则会执行方法体中内容,这时候方法体中应该有修改modelmap的函数
如果方法有返回值 :
1)@ModelAttribute没有指定名字:会将返回值类型首字母小写之后作为key的值,返回值作为value放到modelmap中
如 public Person getPerson();这个方法,key就是“person”,value就是方法的返回值
2)@ModelAttribute指定名字了 @ModelAttribute(name = “xxx”) 那么key就是这个指定的名字,value还是方法的返回值
2.如果是注释在一个参数上,代表这个参数的值从modelmap里面获取

11.Mybatis和Hibernate的区别

简单易懂的说:mybatis是把很多重复性的工作提取了出来,但是sql语句你要自己写
hibernate把所有工作直接都帮你做完了,但是有些需要人手动调优的工作,hibernate自动实现实现的效率很差
就是全自动和半自动的区别,但是半自动的更加灵活,所以现在mybatis是主流

12.spring中设计模式

工厂模式:spring使用ApplicationContext或者BeanFactory创造对象
ApplicationContext继承并实现了BeanFactory以及拓展了很多功能,所以BeanFactory现在都不用了
单例模式:bean创建的时候就是单例的
代理模式:AOP动态代理,Spring AOP 性能比 AspectJ AOP 差,所以切面多最好用AspectJ
观察者模式:spring事件驱动
适配器模式:wrapper

13.高并发考虑

1.将单一架构拆解为微服务架构
2.常用数据保存到缓存中,全局搜索或者查询可以保存到es里,其他的可以保存到redis里
3.使用消息队列:重要数据使用redis是不靠谱的,而且redis没有事务,写操作还是要在数据库中,但是如果不使用消息队列而是直接等待写完成,那场面绝对不好看,使用消息队列削峰填谷抗高并发。
4.分库分表:数据库分库分表
5.读写分离:数据库读写分离,适合于那种读可以不需要特别实时数据的那种情况
6.使用搜索引擎

spring session 工作原理

转载于:http://blog.itpub.net/69912579/viewspace-2652164/
1.首先会创建一个SessionRepositoryFilter
2.拦截到请求之后包装了HttpServletRequest,包装了HttpServletRequest和HttpServletResponse,覆写了HttpServletRequest中 getSession(boolean create)方法,然后在finally里面提交session
3.session数据的提交
4.如何处理过期的session:springsession会有一个定时任务

session的保存形式

spring:session:sessions:1b8b2340-da25-4ca6-864c-4af28f033327
spring:session:sessions:expires:1b8b2340-da25-4ca6-864c-4af28f033327
spring:session:expirations:1557389100000

spring:session:sessions为hash结构,存储Spring Session的主要内容,剩下两个键是专门为了处理session过期而使用的

Redis过期键有三种删除策略,分别是定时删除,惰性删除,定期删除。

  • 定时删除:通过维护一个定时器,过期马上删除,是最有效的,但是也是最浪费cpu时间的。
  • 惰性删除:程序在取出键时才判断它是否过期,过期才删除,这个方法对cpu时间友好,对内存不友好。
  • 定期删除:每隔一定时间执行一次删除过期键的操作,并限制每次删除操作的执行时长和频率,是一种折中。

Redis采用了惰性删除和定期删除的策略。由此可见依赖 Redis 的过期策略实时删除过期key是不可靠的。

所以spring session自身实现了定时器,会定时检查spring:session:expirations,如果时间过期,那么要去删除expires这个key,如何删除?通过惰性删除,访问一下就好了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java SSMSpring+SpringMVC+MyBatis)是一种基于Java语言的Web开发框架。学习这个框架的过程中,我深刻体会到它的强大和灵活性。 首先,Spring框架为开发者提供了一个强大的IOC(Inversion of Control)容器,它能够管理和注入对象,减少了代码之间的耦合性。通过配置文件或注解,我们可以轻松地定义和获取各种对象,提高了代码的可维护性和可扩展性。 其次,SpringMVC框架是一种MVC(Model-View-Controller)设计模式的实现,它用于处理Web请求和响应。通过配置一个请求映射表和处理器,我们可以将请求分发给相应的控制器进行处理,并将处理结果返回给客户端。SpringMVC还提供了一些便捷的注解和标签,用于简化页面的渲染和参数的绑定。 最后,MyBatis是一种优秀的持久化框架,它能够将数据库操作与Java对象之间的映射简化为简单的配置。通过编写SQL映射文件和定义POJO(Plain Old Java Object)类,我们可以方便地进行数据库的增删改查操作,而无需编写冗长的SQL语句。 在学习Java SSM框架的过程中,我深入理解了软件开发过程中的MVC思想,并学会了如何利用SpringSpringMVC和MyBatis来实现一个完整的Web应用程序。通过不断的实践和调试,我逐渐培养了自己解决问题和调试代码的能力。 总结起来,学习Java SSM框架使我深入理解了软件开发的各个环节,并提升了我的编码能力和开发效率。我相信这些知识和经验将对我的职业发展和项目实施起到积极的促进作用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值