【内容】
1.spring对bean生命周期的管理
2.springmvc相关事项
3.springIOC和aop实现原理
1. spring如何管理bean的生命周期
1.1 控制bean是什么类型的对象是scope属性
【单例对象singleton(默认)】:如service和dao层的对象
在spring容器初始化的时候,创建单例对象
每次调用getBean的时候都是返回的同一个对象
可以定义init-method和destroy-method在生命周期初始和末尾执行,value只要和类里面的方法名相同就行了
生命周期随着spring的关闭而消亡
【多例对象prototype】:如action
spring不管他的销毁,也不会调用destory-method。
实际上是创建之后就传递给了客户端,spring失去了对他的引用。
【request】
每次请求都产生一个实例,创建之后spring仍然在监听
【session】
补充:session域和cookie
用户第一次访问servlet的时候,会创建一个独立的session,,生成一个sessionID,在返回的时候,保存在cookie中,下一次访问该servlet会带着这个sessionID去。
session默认存活30分钟
1.2 BeanFactory && ApplicationContext
- BeanFactory基本类的结构体系
1、4个获取实例的方法。getBean的重载方法。
2、4个判断的方法。判断是否存在,是否为单例、原型,名称类型是否匹配。
3、1个获取类型的方法、一个获取别名的方法。根据名称获取类型、根据名称获取别名。
总结:
这10个方法,很明显,这是一个典型的工厂模式的工厂接口。
【xmlBeanFactory】
BeanFactory最常见的实现类,可以从classpath获取资源
可以用来加载xml配置文件
例如:
class Car
<bean id="car1" class="spring.ioc.demo1.Car"
p:brand="spring注入-红旗001"
p:color="spring注入-紫色"
p:maxSpeed="520" />
public static void main(String[] args) {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource res = resolver.getResource("classpath:applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(res);
//ApplicationContext factory=new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = factory.getBean("car1",Car.class);
System.out.println("car对象已经初始化完成");
System.out.println(car.getMaxSpeed());
}
- ApplicationContext
从BeanFactory派生过来
相对于工厂很多代码实现,applicationContext更多通过配置实现
- 二者区别
1.BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题。而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误。 相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。
BeanFacotry延迟加载,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常;而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用 ApplicationContext。
应用上下文则会在上下文启动后预载入所有的单实例Bean。通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。
2.BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。(Applicationcontext比 beanFactory 加入了一些更好使用的功能。而且 beanFactory 的许多功能需要通过编程实现而 Applicationcontext 可以通过配置实现。比如后处理 bean , Applicationcontext 直接配置在配置文件即可而 beanFactory 这要在代码中显示的写出来才可以被容器识别。 )
3.beanFactory主要是面对与 spring 框架的基础设施,面对 spring 自己。而 Applicationcontex 主要面对与 spring 使用的开发者。基本都会使用 Applicationcontex 并非 beanFactory 。
2.springmvc简介
【MVC】
model(模型) view(视图) controller(控制器)
model:是指现实世界抽象出来的模型,理解成对数据的封装和操作,是进行数据处理的地方(service+dao)
view: 应用和用户之间的接口(jsp)
controller: 视图和模型之间的交互。主要负责:分发用户的请求到相应的模型上面,把模型机试反映到视图上。(controller)
【优势】
- 角色划分和清晰:
dispatchServlet:前端控制器(一个中心)
handlerMapping处理器映射器 handlerAdapter处理器适配器 viewResolver处理器适配器(三大组件)
Controller页面控制器,Validation验证器,Command命令对象,FormObject表单对象- 直接操作pojo对象
- 和spring无缝对接
- 约定大于配置契约式编程
- 基于注解的零配置支持
- json文件简单流动
- restful锋哥的支持
3. spring IOC AOP
3.1 ioc控制反转
inversion of control·
程序创建对象变成了,spring容器创建,并有spring容器进行对象属性的设置
IOC也叫做依赖注入(depenedncy injection) 必须通过setter方法进行注入(如果bean或者pojo中没有set方法 就不可以注入,xml配置文件报错)
注入有四种:
构造器注入(ioc创建对象)
setter注入(重点)set+属性名首字母大写
和(批注入,名称空间注入)
3.2 aop面向切面编程(Aspect Orient Programming)
将影响了多各类的公共行为封装到一个可重用模块中,成为aspect,减少重复代码(静态代理每一个service就有对应的serviceProxy相当繁琐)。
实现aop的技术支持:
1.基于接口的动态代理:jdk动态代理技术
proxy类和InvocationHandler接口
2.基于类的动态代理:Cglib
javassist是一个开源的分析,编辑和创建java字节码的类库
【补充】
- javaEE四大作用域
参考推荐:https://www.cnblogs.com/kakaisgood/p/5549031.html
pageContext + request + session + servletContext
【page】:
- 只做过在当前的jsp,在发生跳转、重定向、刷新的时候被销毁
【request】
- 当http请求的时候生成,在处理结束的时候死亡。
- 这个变量可以随forward(转发)调转到多个jsp中,单数如果刷新页面,就会被重新计算
【session】
- 从打开浏览器到关闭浏览器
- 如果想下次打开浏览器有同样的免密登录的类似效果,可以存到cookie中,并设置一个存活时间。
【application】
- 从应用启动到应用结束
- 如果不手动删除,可以一直使用,所有用户都能使用到。