一、Spring部分

1、Spring的运行流程

第一步:加载配置文件ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");,ApplicationContext接口,它由BeanFactory接口派生而来,因而提供了BeanFactory所有的功能。配置文件中的bean的信息是被加载HashMap中的,一个bean通常包括,id,class,property等,bean的id对应HashMap中的key,value呢就是bean

具体如何加载?源码如下:

if (beanProperty.element("map") != null){  
Map<String, Object> propertiesMap = new HashMap<String, Object>();  
Element propertiesListMap = (Element)beanProperty.elements().get(0);  
Iterator<?> propertiesIterator = propertiesListMap .elements().iterator();  
while (propertiesIterator.hasNext()) {  
 Element vet = (Element) propertiesIterator.next();  
 if(vet.getName().equals("entry")) {  
  String key = vet.attributeValue("key");  
  Iterator<?> valuesIterator = vet.elements()  .iterator();  
  while (valuesIterator.hasNext()) {  
   Element value = (Element) valuesIterator.next();  
   if (value.getName().equals("value")){  
    propertiesMap.put(key, value.getText());  
   }  
   if (value.getName().equals("ref")) {  
    propertiesMap.put(key, new String[]{
      value.attributeValue("bean") 
      });  
   }  
  }  
 }  
}  
bean.getProperties().put(name, propertiesMap);  
//看完反正我是默默放弃了。。。
} 
12345678910111213141516171819202122232425

第二步:调用getBean方法,getBean是用来获取applicationContext.xml文件里bean的,()写的是bean的id。一般情况都会强转成我们对应的业务层(接口)。例如SpringService springService =(SpringService)ac.getBean("Service");

第三步:这样我们就可以调用业务层(接口实现)的方法。

具体如下:

ssm框架原理及流程(SSM三大框架的运行流程和原理与核心技术详解)(1)

Java反射博大精深,我也不很懂,具体请查看Java基础之—反射

那么bean中的东西到底是怎么注入进去的?**简单来讲,就是在实例化一个bean时,实际上就实例化了类,它通过**反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。这样就回到了我们Java最原始的地方,对象.方法,对象.属性

2、Spring的原理

3、Spring的核心技术

ioc(inverse of control)控制反转: 所谓反转就是把创建对象(bean)和维护对象(bean)之间的关系的权利从程序转移到spring的容器(spring-config.xml)

ssm框架原理及流程(SSM三大框架的运行流程和原理与核心技术详解)(2)

说明:<bean></bean>这对标签元素的作用:当我们加载spring框架时,spring就会自动创建一个bean对象,并放入内存相当于我们常规的new一个对象,而<property></property>中的value则是实现了“对象.set方法”,这里也体现了注入了概念

di(dependency injection)依赖注入: 实际上di和ioc是同一个概念,spring的设计者,认为di更准确的表示spring的核心

spring提倡接口编程,在配合di技术就可以达到层与层解耦的目的,为什么呢?因为层与层之间的关联,由框架帮我们做了,这样代码之间的耦合度降低,代码的复用性提高

接口编程的好处请访问(https://blog.csdn.net/Song_JiangTao/article/details/82389905)

4、Spring整体架构图

ssm框架原理及流程(SSM三大框架的运行流程和原理与核心技术详解)(3)

1、core container(核心容器)

核心容器包含了core,beans,context和expression language四个模块,core和beans模块是框架的基础部分,提供IOC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。

2、Date Access/Integration

Date Access/Integration层包含JDBC,ORM,OXM,JMS和Transaction模块

3、web

web上下文模块建立在应用程序上下文模块之上,为基于web的应用程序提供了上下文。所以,spring框架支持与Jakarta struts的集成。web模块还简化了处理大部分请求以及将请求参数绑定到域对象的工作。web层包含了web,web-servlet,web-Struts 和web-porlet

4、AOP

aop模块提供了一个符合aop联盟标准的面向切面编程的实现,它让你可以定义例如方法拦截器和切点,从而将逻辑代码分开,降低它们之间的耦合性。利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中,这有点像.Net技术中的attribute概念

通过配置管理特性,springAop模块直接将面向界面的编程功能集成到了spring框架中,所以可以很容易地使用spring框架管理的任何对象支持aop,springAop模块为基于spring的应用程序中的对象提供了事务管理服务。通过使用springAop,不用历来EJB组件,就可以将声明性事务管理集成到应用程序中。

5、Test

test模块支持使用JUnit和TestNG对spring组件进行测试。

二、Spring MVC部分

1、Spring MVC的运行流程

2、Spring MVC的原理

1、Struts2是类级别的拦截,一个类对应一个request 上下文, SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url ,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。

2、由上边原因, SpringMVC的方法之间基本上独立的,**独享request response数据,*请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其*所有Action变量是共享的,这不会影响程序运行,却给我们编码读程序时带来麻烦,每次来了请求就创建一个Action ,一个Action对象对应一个request 上下文。

3、由于Struts2需要针对每个request进行封装,把request , session等servlet生命周期的变量封装成一个一 个Map ,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。

4、拦截器实现机制上, Struts2有以自己的interceptor机制, SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。

5、SpringMVC的入口是servlet ,而Struts2是filter (这里要指出, filter和servlet是不同的。以前认为filter是servlet的一种特殊),这就导致 了二者的机制不同,这里就牵涉到servlet和filter的区别了。

6、SpringMVC集成了Ajax ,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax ,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

7、**SpringMVC验证支持JSR303 ,*处理起来相对更加灵活方便,而*Struts2验证比较繁琐,感觉太烦乱。

8、Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC-样的效果,但是需要xml配置的地方不少)。

9、设计思想上, Struts2更加符合0OP的编程思想,SpringMVC就比较谨慎,在servlet上扩展。

10、SpringMVC开发效率和性能高于Struts2。

11、SpringMVC可以认为已经100%零配置。

3、Spring MVC的核心技术

三、Mybatis部分

1、Mybatis的运行流程

第一步:配置文件mybatis.xml,大体如下,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 引入外部文件
  resource:引入项目中配置文件
  url:引入网络中或者路径文件
 -->
    <properties resource="jdbc.properties"/>
    <settings>
        <!--<setting name="mapUnderscoreToCamelCase" value="true" />-->
        <setting name="lazyLoadingEnabled" value="true" />
        <setting name="aggressiveLazyLoading"  value="false" />
        <setting name="cacheEnabled" value="true"/>
    </settings>
    <typeAliases>
        <package name="com.nuc.entity"></package>
    </typeAliases>
    <!-- - - - - - - 数据库环境配置- - - - - - - - - -->
    <environments default="environments">
        <environment id="environments">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.jdbcUrl}"/>
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- - - - - - - -映射文件路径- - - - - - -->
    <mappers>
        <!--自动扫描包下的映射文件,要求:同名,同目录-->
        <package name="com.nuc.mapper" />
    </mappers>
</configuration>

第二步:加载我们的xml文件 第三步:创建SqlSessionFactoryBuilder 第四步:创建SqlSessionFactory 第五步:调用openSession(),开启sqlSession 第六步:getMapper()来获取我们的mapper(接口),mapper对应的映射文件,在加载mybatis.xml时就会加载 第七步:使用我们自己的mapper和它对应的xml来完成我们和数据库交互。即增删改查。 第八步:提交session,关闭session。

代码如下:

String resource = "mybatis-config.xml";
SqlSession sqlSession = null;
InputStream inputStream = Resources.getResourceAsStream(resource);//读取mybatis配置文件
//SqlSessionFactoryBuilder这个类的作用就是为了创建SqlSessionFactory的
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
/**
 *  factory.openSession(); //需手动提交事务
 *   factory.openSession(true); //系统自动提交事务
 */
sqlSession = factory.openSession();
CustomerMapper mapper = sqlSession.getMapper(CustomerMapper.class);
//增删改查的操作
sqlSession.commit();//如果没有提交,数据库的数据不会改变
sqlSession.close();
        
12345678910111213141516

需要注意的是,sqlSession也自带一些数据交互的操作

2、Mybatis的原理

3、Mybatis的核心技术