【javaee体系结构】
1.Client客户端层
DHTML
Java Application
2.Web表现层 | Spring MVC
Servlet、JSP
3.Business业务层 | 控制反转IoC、切面AOP、事务管理
JavaBean、EJB
只需要配置就可以完成事务管理
4.EIS集成层(持久层)| 封装了jdbc、另外支持其他ORM框架整合
Jdbc、数据库操作相关
其中2.3.4是服务器端的经典三层结构。| 一站式 | 轻量级
html与jsp:客户端看到的是html,jsp编译成html返回给客户端
strucrs2属于表现层,Hibernate、MyBatis属于持久层
Spring 核心在于Core Container。 就是基于IoC和AOP的一套编程框架。
IoC(反转控制)将对象创建权利交给Spring工厂进行管理
AOP(面向切面编程)基于动态代理功能增强
DI 和IoC:都是将对象控制权交给第三方(Spring)管理,只是站在不同角度。
【DI 依赖注入】在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件。即它可以将一个bean对象动态的注入到另外一个bean中。
ApplicationContext(应用上下文)是用来加载Spring框架配置文件,来构建Spring的工厂对象,也称之为Spring容器的上下文对象,Spring的容器。它只是BeanFactory(Bean工厂,Bean就是一个Java对象)一个子接口。
通过getBean方法获得Spring容器管理Bean对象(根据名称/类型两种方式获取,常用根据名称):一般applicationContext.xml在src下,ClassPathXmlAapplication读取。若放在WEB-INF下,FileSystemXmlApplicationContext读取。
【bean的实例化】bean的对象就是普通的pojo
- 无参构造方式来实例化bean对象(最常用):底层是Spring默认的工厂实例化对象
- 静态工厂方式获取bean对象:静态工厂提供了一个静态方法来实例化bean,该静态方法用来获取bean的对象,必须指定工厂方法(factory-method)。这种方法配置返回的是该方法返回的bean对象。(这里可以定制自己的工厂,更灵活) 。该方法框架初始化时用的多。
- 实例工厂来获取bean对象(必须先实例化工厂(factory-bean,要写实例工厂的bean的名字,类似ref),再配置方法):编写一个普通的方法来初始化bean对象,定制工厂可以初始化一些数据。该方法框架初始化时用的多。
- 工厂bean的方式实例化bean(泛型就是要实例化的对象类型):Spring会自动调用该接口的getObject来获取具体的对象。该方法Spring底层用的多。
【BeanFactory和FactoryBean的区别】
BeanFactory是一个工厂(其实是构建了一个spring上下文的环境,容器),用来管理和获取很多Bean对象。
FactoryBean是一个Bean生成工具,用来获取一种类型对象的Bean,它是构造Bean实例的一种方式
【Bean的作用域】
- singleton单例模式(默认值,如果需要单例对象,不需要配置scope):在spring IOC容器中仅存在一个Bean实例,Bean以单例方式存在。单例情况下,在容器初始化的时候,bean就已经被初始化了。必须手动关闭容器时,才会执行手动销毁的方法。
- prototype多例模式:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new XXXBean()。多例情况下,容器初始化的时候,不初始化bean,只有getBean(获取的)的时候才初始化bean,而且每次getbean都会初始化一个不同的bean。多例的默认情况下无法调用销毁方法,多例没有强制销毁。
- request
- session
- globalSession
【Spring中Bean的生命周期】:在说明前可以思考一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;
Spring上下文中的Bean也类似,如下
注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。
- 实例化一个Bean--也就是我们常说的new;
- 按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;
- 如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值
- 如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);
- 如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);
- 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;
- 如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
- 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;
- 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;
- 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
以上10步骤可以作为面试或者笔试的模板,另外我们这里描述的是应用Spring上下文Bean的生命周期,如果应用Spring的工厂也就是BeanFactory的话去掉第5步就Ok了。
【Bean的属性依赖注入】
注:Spring框架规范中通过配置文件配置的方式,只支持构造器参数注入和setter方法属性注入
- 构造器注入
- setter方法属性注入(setter方法的规范-JavaBean规范)
- 属性名首字母大写 前面加 set
- 接口注入(不推荐)