一、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
  6. …

Spring Framework 核心概念

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

了解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. 安装Ubuntu 出现ubi partman crashed,ubi-partman failed with exit code 10

    出现这个问题好像是因为硬盘中有遗留的raid信息导致. 在安装选项中添加 nodmraid参数,再启动进行安装就好了 如果不会添加参数可以参考这篇文章:安装ubuntu时黑屏三种解决办法 就和添加 n ...

  2. CF 1383B GameGame

    传送门 题目:给定长度为n的数组a,A和B轮流拿走一个数,开始时A和B拥有的v为0,A和B每次拿走一个数时,他的v = v^ ai,A和B都很聪明,问都按照最优的情况考虑,拿完所有数之后A和B的v的大 ...

  3. web主题适配方案指北

    前置知识 在这里了解实现网页主题切换的相关知识. CSS 变量 要实现主题切换需要了解一点 css 自定义属性.当然,本文还提供了其他实现方式,为了不给您接下来的阅读带来阻碍,先了解它. 变量的声明 ...

  4. oracle创建用户操作

    打开命令提示框输入以下内容 1.输入:sqlplus /nolog //进入oralce控制台2.输入:conn /as sysdba //以管理员权限登录3.输入:create user abc i ...

  5. Ncdu强大的磁盘查看命令

    简介 项目地址: https://dev.yorhel.nl/ncdu Ncdu (NCurses Disk Usage) 是一个基于 Ncurses 库的 du 命令的界面.它通过大家熟知的 du ...

  6. 个人项目wc(C语言)

    github地址:https://github.com/nilonger/mycangku 一.项目要求 1.wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个 ...

  7. Hive SQL 优化面试题整理

    Hive优化目标 在有限的资源下,执行效率更高 常见问题: 数据倾斜 map数设置 reduce数设置 其他 Hive执行 HQL --> Job --> Map/Reduce 执行计划 ...

  8. Java中的判断实例

    .getClass().getName() 这是最常见的一种判断类型的方法 instanceof 用于判断 对象 是否为某个类的实例 Boolean值 各种is方法 isAnnotationPrese ...

  9. Erlang中的宏定义应该在什么时候用

    读<Erlang OTP并发编程实战>中看到这么一句话,遂做笔记以记录: 宏不是函数的替代品,当你所需的抽象无法用普通函数来实现时,宏给出了一条生路,比如,必须确保在编译期展开某些代码的时 ...

  10. IntelliJ IDEA 2019 的安装与破解

    IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境.IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手.代码自动提示.重构.J2EE支持.各类版本工具( ...