文章目录
- 1.使用spring框架能给我们带来的好处
- 1.1.简化开发
- 1.2.DI 依赖关系,一目了然
- 1.3.IOC
- 1.4.万能胶
- 1.5.模块化设计
- 1.6.自带测试组件:JUnit,Spring Test
- 1.7.Spring Web MVC
- 1.8.声明式事务
- 2.BeanFactory和ApplicationContext区别
- 2.1.ApplicationContext是BeanFactory子接口
- 2.2.ApplicationContext提供IOC容器中的Bean监控
- 2.2.ApplicationContext支持国际化i18n
- 2.3.ApplicationContext拓展了统一资源文件读取方式URL
- 3.Spring Bean的生命周期
- 4.Spring Bean各作用域的区别
- 5.Spring的Bean是线程安全的吗?
- 6.Spring中用到了哪些设计模式?
- 7.Spring是如何处理循环依赖的?
- 8.Service层如何获得ApplicationContext
- 9.如何理解上下文
1.使用spring框架能给我们带来的好处
1.1.简化开发
1.简化程序员的开发,简化业务开发
1.2.DI 依赖关系,一目了然
能够从配置文件,可以看出对象与对象的依赖关系,一目了然
1.3.IOC
1.在有限的内存,有限的资源情况下,能够管理好Bean;
2.分阶段,分层次帮忙管理
1.4.万能胶
1.能够兼容成熟的框架:
Hibernate、MyBatis、Quartz[定时器]、Timer[JDK的]、Shiro、Spring Data,redis,MongoDB等等
1.5.模块化设计
1.即插即用,按需分配,需要啥用啥
1.6.自带测试组件:JUnit,Spring Test
1.7.Spring Web MVC
1.之前的Struts等有过度设计的嫌疑;
2.Spring MVC 完整分离了Servlet和普通Bean
如:
@GetMapping("/preview.json")
@ResponseBody
public Flux<Member> preview(HttpServletRequest request, HttpServletResponse response){
return null;
}
没有必要一定是HttpServletRequest 和 HttpServletResponse
如下面:
@GetMapping(value="/getByName.json")
@ResponseBody
public Mono<Member> getByName(@RequestParam String name){
Member member = new Member();
member.setName(name);
return Mono.justOrEmpty(member);
}
1.8.声明式事务
1.之前事务都是人为管理,自己开启,自己关闭;
2.spring将非功能性代码[非业务性代码]和功能性代码[业务性代码]分离,提出事务管理提前声明;
事务管理提前声明:通过不同的切面实现不同的事务模型,达到代码运行以前事先配置好的效果,
而不是运行的时候,再去创建,降低了维护成本.
2.BeanFactory和ApplicationContext区别
2.1.ApplicationContext是BeanFactory子接口
2.2.ApplicationContext提供IOC容器中的Bean监控
1.这里的监控主要是指Bean的生命周期:Bean创建 销毁等等;
下面的了解即可
PostProcessor机制
Aware
举例
ApplicationEvent
ContextRefreshedEvent
ContextStartedEvent 容器开始启动的时候触犯
ContextStoppedEvent 容器终止的时候触发
ContextClosedEvent 容器被关闭的时候触发 |所有bean被销毁的时候触发
RequestHandleredEvent web容器请求结束的时候触发
2.2.ApplicationContext支持国际化i18n
2.3.ApplicationContext拓展了统一资源文件读取方式URL
1.这里的Url 可以是一个本地URL,也可以是一个网络URL
2.三种形式:
ClassPathXmlApplicationContext:处理本地classpath下面的所有的配置文件的IOS容器
FileSystemXmlApplicationContext:处理文件系统在其他磁盘下的Url
XmlWebApplicationContext:加载网络文件的配置信息
3.另外AnnotationConfigApplicationContext:加载注解
3.Spring Bean的生命周期
1、初始化的时候回调调用:InitializingBean和DisposableBean用来回调
2、Aware接口
3、init() destory()
4、@PostContruct 和 @PreDestory注解方式
4.Spring Bean各作用域的区别
1.总共5个范围:对象什么时候创建,什么时候销毁
4.1.singleton
1.我从容器启动就从石头缝里蹦出来,直到Spring的世界末日才灭亡
4.2.prototype
1.什么时候用,什么出生,用完就死了
4.3.request
1.request出生的时候就出生,request销毁的时候就销毁(request)
2.这个属于web层
3.用户发起请求的时候就有了,用户拿到结果的时候就销毁了
4.对于单一的请求,你可以认为是单例,但是对于spring请求中,每个又不一样,可以认为是多例;
4.4.session
1.session出生的时候就出生,session销毁的时候就销毁(session)
4.5.global-session
1.可以理解为上下文Context;一个全局的web容器
总结:5中作用域的长短[用时间长短去比较]
100岁:singleton
80岁:global-session Context
20岁:session
10岁:request
1岁: prototype
5.Spring的Bean是线程安全的吗?
1.Spring Bean 由IOC容器来创建;
2.创建的对象时用我们开发人员自己写的
3.定义 BeanDefinition BeanWarpper instance Class.newInstance(); new Object();
4.Map<String,BeanWarpper> 顶多就是做了一次代理,用一个新的类代替了原来的类
跟我们写的代码有关系,跟Spring无关,
自己写的是不是线程安全,那就是线程安全的,
如果写的代码不是安全的,那就不是线程安全的;
6.Spring中用到了哪些设计模式?
7.Spring是如何处理循环依赖的?
class A 依赖,class B,Class B 依赖Class A;
用缓存机制来解决循环依赖的问题
BeanWrapper
A在加载的时候,发现B还没有实例化,会缓存在BeanWrapper中,等有了之后
8.Service层如何获得ApplicationContext
推荐接口ApplicationContextAware
实现即可
9.如何理解上下文
作用域问题
所处的运行环境;
Tomcat