一、Spring 框架

什么是框架[framework]?

在某个问题域中的一整套解决方案,在javaee体系下,不同的问题域[场景]下面有不同的框架,比如:在持久层中有 mybatis, Hibernate, Jdo等框架,还有MVC的框架,如:struts2, spring mvc、JSF、等。

Spring 是什么?

直译过来就是“春天”,它是由作者Rod Johnson 为改变早期企业级项目开发过程中使用EJB所遇到的问题而开发的一套轻量级的企业应用开发解决方案,取名 Spring, 【意味着程序员的“春天”】

现在, Spring Framework
是整个JAVAEE开发生态中必不可少的一个环节,大量的JAVAEE项目都是基于Spring框架来展开的,Spring
Framework也构建了一个很好的技术生态,基本上可以提供给程序员一整套的技术链来完成企业级项目的开发。

Spring Framework 目前最新版本是 5.x, 它的技术生态所含盖的技术和框架也很多,主要有:

  1. Spring MVC 框架
  2. Spring Boot
  3. Spring Cloud
  4. Spring Security
  5. Spring cache

Spring Framework 核心概念

  1. IOC 容器, 也叫 Inverse of Control, 控制反转, 换成另外一个词更好理解,叫 依赖注入 Dependency Injection, 简称 DI。
  2. AOP, 面向切面编程
  3. 数据访问支持层,包含 JDBC的技术, mybatis的支持,hibernate的支持, JPA 的支持.
  4. 事务的支持
  5. 测试的支持

了解Spring 框架的架构图

从上图可以看出,Spring core Container 是支撑所有上面技术组件的基础,其中beans是负责创建由spring管理的各种对象,context是容器应用上下文, SPEL是表达式语言,core 就是框架的核心代码码,一般无需程序员参与。

test 是测试组件,也是所有上面技术的组件所共用的。

左上角是数据持久层的支持,包含 JDBC、ORM[hibernate框架和mybatis框架]、OXM[java object和xml之间的转换]、以及JMS的支持、当然还有事务的支持。

右上角是 针对MVC的实现,由 spring mvc负责。

二、Spring Framework 之 IOC

开发的步骤流程

  1. 准备一个maven项目
  2. 导入相关的依赖 [spring-context]和[spring-test]
  3. 编写相关的代码
  4. 测试

Spring IOC的特性

  1. 采用单例模型,也就是说在IOC容器中,默认只创建配置Bean的唯一实例
  • 通过 scope 属性来控制容器是否采用单例,默认是 单例 [singleton]
  • 设置 scope=“prototype” ,表示IOC容器采用 原型模式,也就是不是单例。
  1. 采用“懒加载“方式来创建目标Bean对象
  2. 同一个接口类型,有多个实现的情况下,就会产生“二义性”。怎么解决?
  • 再加一个 名字 进行限定。

所以,默认情况下, Spring IOC中,Bean的搜索是根据 类型 来搜索的[by Type], 如果类型存在“二义性”时,则需要进一步通过bean的名称[id] 来搜索,这个叫 by Name。

IOC容器核心API

  1. ApplicationContext 接口,这就是IOC的核心容器接口,通过它可以获取被IOC容器管理的Bean
  1. 支持两种不同的配置:
  • XML 配置,传统的配置,一直很强大,很好用,如下: [ applicationContext.xml ]

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 定义我们的Bean, 在此定义的Bean,就会由spring容器负责创建和管理 -->
    <bean id="studentService" scope="singleton" init-method="xxx"
    class="com.hc.service.impl.StudentServiceImpl"/>
    </beans>
  • 注解的配置,JDK5.0之后才支持的,现在很流行。 如下: [ AppConfig.java ]

    @Configuration   //表示这是一个spring 注解配置类
    @ComponentScan(value = {"com.hc.service.impl"})
    public class AppConfig { //nothing! }
  • ApplicationContext 的实现类

 ​	\\- ClassPathXmlApplicationContext    如果采用xml配置,使用这个类

 ​	\\- AnnotationConfigApplicationContext  [简称 ACAC], 如果使用注解配置,使用这个类

三、Spring-test 环境

  1. 如果你想手动编写代码来获取Spring IOC 的上下文,这种情况下,是无需Spring-test 组件的,如下:


    /******
    * 测试[非 Spring-test 环境]
    */
    public class StudentServiceTest { @Test
    public void testAdd_use_spring_annotation() {
    //手工写代码得到 ac [也就是 spring ioc 上下文]
    ApplicationContext ac =
    new AnnotationConfigApplicationContext(AppConfig.class);
    //通过 ac 来获取被IOC容器管理的bean
    IStudentService iss = ac.getBean(IStudentService.class);
    //
    iss.add(null);
    }
    }
  1. 当然,建议是使用 spring-test 组件来做单元测试,它需要使用如下注解
  • @ContextConfiguration(classes=xxxx.class)
  • @RunWith(SpringJUnit4ClassRunner.class)
 ```java
@ContextConfiguration(classes = AppConfig.class) //读取spring的注解配置类
@RunWith(SpringJUnit4ClassRunner.class) //把上面读取到的IOC上下文由测试环境来使用
public class StudentServiceTestWithSpring {
@Autowired
private IStudentService studentService;
@Test
public void testAdd_use_spring_annotation_test() {
System.out.println(studentService);
studentService.add(null);
}
}
```
  • 这种使用 spring-test 组件进行测试的方式,是官方推荐的。它还可以这么写:

    @ContextConfiguration(classes = AppConfig.class)  //读取spring的注解配置类
    public class StudentServiceTestWithSpring extends AbstractJUnit4SpringContextTests {
    @Autowired
    private IStudentService studentService;
    @Test
    public void testAdd_use_spring_annotation_test() {
    System.out.println(studentService);
    studentService.add(null);
    }
    }

IOC相关的注解

  1. @Component 组件,修饰类的,需要被容器管理的bean类型,现在使用很少,因为有下面三个来代替它:
    * @Service 从语义上扩展了@Component, 代表 服务层的bean
    * @Repository 从语义上扩展了@Component, 代表 DAO层的bean
    * @Controller 从语义上扩展了@Component, 代表 控制层的bean
  1. @Autowired 自动注入,它是 byType 进行搜索的。
  1. @Qualifier 进一步限定搜索的Bean,按姓名搜索,也就是 byName
  1. @Resource 它是JAVAEE规范中的注解,spring IOC 实现了这个注解,它即支持byType,也支持byName
  1. @Configuration 表示此类是一个Spring的注解配置类
  1. @ComponentScan 用来指定要扫描的包,可以指定多个
  1. @ContextConfiguration 它是spring-test的注解,用在测试类上面,来读取目标配置类
  1. @RunWith 也是spring-test的注解,用在测试类上面,让测试类拥有spring 框架的上下文环境。

有关数据源配置

数据源是用来配置数据库的连接的,它是自动参与到连接池管理之中,一般都无需我们去实现数据源,都是由第三方的组件提供的,目前最主流的数据源技术组件【连接池实现】有:

  • commons-dbcp 组件, 由 apache 提供的
  • druid 组件,由 alibaba 提供
  • hikari 组件,一家日本公司

我们选用 druid 数据源,所以,在pom.xml中要加入 druid的依赖.

配置数据源相关的属性

  • url
  • driver
  • username
  • password

Note:
欢迎点赞,留言,转载请在文章页面明显位置给出原文链接
知者,感谢您在茫茫人海中阅读了我的文章
没有个性 哪来的签名!
详情请关注点我
持续更新中

© 2020 09 - Guyu.com | 【版权所有 侵权必究】

Spring 框架(持续完善中)的更多相关文章

  1. Eclipse/JavaWeb (三)三大框架之Spring框架 持续更新中...

    (一)发展历史 现在我们有三个层了,可是每层之间的调用是怎样的呢?比如显示层的struts需要调用一个业务类,就需要new一个业务类出来,然后使用:业务层需要调用持久层的类,也需要new一个持久层类出 ...

  2. 2018年最新Java面试题及答案整理(持续完善中…)

    2018年最新Java面试题及答案整理(持续完善中…) 基础篇 基本功 面向对象特征 封装,继承,多态和抽象 封装封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内 ...

  3. linux 命令学习(持续完善中...)

    linux 命令学习(持续完善中...) 主要是记录一些开发过程中用到的linux命令,慢慢补充 一.用户 1.添加用户: useradd 用户名 2.设置密码:passwd 用户名 ,然后按照提示输 ...

  4. Scrapy爬虫导图(持续完善中)

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.

  5. ECLIPSE/JAVAWEB (二)三大框架之Hibernate框架 持续更新中...

    (一)发展历史 在Struts框架中使用jdbc连接来读写数据库,我们最常见的就是打开数据库连接.使用复杂的sql语句进行读写.关闭连接,获得的数据又需要转换或封装后往外传,这是一个非常繁琐的过程. ...

  6. Eclipse/JavaWeb (一)三大框架之struts框架 持续更新中...

    最近主要把javaweb的三大框架过一遍. (一)发展历史 传统的Java Web应用程序是采用JSP+Servlet+Javabean来实现的,这种模式实现了最基本的MVC分层,使得程序分为几层,有 ...

  7. Spring框架基础(中)

    Spring对不同持久化技术进行支持 JDBC 导入spring-jdbc-4.3.5.RELEASE.jar.spring-tx-4.3.5.RELEASE.jar 创建对象,设置数据库信息 创建j ...

  8. Spring框架spring-web模块中的RestTemplate类详解

    RestTemplate类是spring-web模块中进行HTTP访问的REST客户端核心类.RestTemplate请求使用阻塞式IO,适合低并发的应用场景. 1. RestTemplate类提供了 ...

  9. iOS开发常用第三方开源框架 持续更新中...

    键盘管理 TPKeyboardAvoiding IQKeyboardManager(1.2.8) 弹窗HUD MBProgressHUD(0.9.2) SVProgressHUD UIView+Toa ...

随机推荐

  1. BN系列-未完待续

    BN.LN.IN.GN Cross-Iteration Batch Normalization 因为有时候我们的计算能力有限,所以BN设置的比较小,这样BN效果就比较差. 因此我们将最近几次的batc ...

  2. 【NBA 可视化】使用Pyecharts实现湖人19-20赛季投篮数据可视化~

    前言 先来口号 「湖人总冠军」~

  3. 07 CentOS简单命令与XShell简单使用

    关机 poweroff 重启 init 6 查看ip地址 ifconfig 查看当前目录下的文件与目录 ls ll 判断命令是内部还是外部的类型 type ifconfig 通过file /sbin/ ...

  4. Could not update Activiti database schema: unknown version from database: '5.22.x.x'

    原因:activiti 相关的jar版本和表 act_ge_property 中 schema.version 所存储的版本不一致导致报错的. 查看activiti 相关jar版本 然后修改表中的版本 ...

  5. 2018-04-19:innodb和myisam区别

    福哥答案2020-04-19:

  6. 详解Java线程池的ctl(线程池控制状态)【源码分析】

    0.综述 ctl 是线程池源码中常常用到的一个变量. 它的主要作用是记录线程池的生命周期状态和当前工作的线程数. 作者通过巧妙的设计,将一个整型变量按二进制位分成两部分,分别表示两个信息. 1.声明与 ...

  7. Kafka 为什么快

    Kafka 为什么能那么快 | Kafka高效读写数据的原因 无论 kafka 作为 MQ 也好,作为存储层也罢,无非就是两个功能(好简单的样子),一是 Producer 生产的数据存到 broker ...

  8. Redis设计与实现——数据结构与对象

    SDS 简单动态字符串 在redis数据库里面,包含字符串值得键值对在底层都是由SDS实现的. redis >  set msg "hello world" 1)键值对的键是 ...

  9. Linux基础 Day2

    Linux-Day2 1.文件目录结构 文件和目录被组织成一颗倒置的树的结构 文件系统从根开始,"/" 文件名称严格区分大小写 隐藏文件以"."开头 路径的分隔 ...

  10. openvswitch 流表操作

    流表组成 每条流表规则由一些列字段组成,可以分为**基础字段.匹配字段和动作字段**三部分. 在打印流表时,在流表中还存在一些显示字段,如duration,idle_age等,此处把这些字段也暂时归之 ...