一、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. WebApi的创建,部署,Oauth身份认证(一)

    1.首先创建一个项目 2.选择Web API 3.创建一个空的控制器 4.控制器名称为MyApiController using System; using System.Collections.Ge ...

  2. Mysql Column 'xxxxx' in field list is ambiguous"

    使用了关联查询,两张表有相同的字段,所以说取值含糊不清: 使用别名.列名解决: 如 a.description

  3. LeetCode406 queue-reconstruction-by-height详解

    题目详情 假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列. 注意: 总人数少于 ...

  4. Kubernetes基于haproxy实现ingress服务暴露

    HAproxy Ingress控制器 HAproxy Ingress简介 HAProxy Ingress watches in the k8s cluster and how it builds HA ...

  5. 关于java中jdk的环境变量配置

    关于java中jdk的环境变量配置 烦死人,在网上找了很长时间.最终找到了一个方法!现在将其总结帮助后来人. 方法/步骤   1 下载好jdk,并按照提示一步步安装,最后记下jdk所在的安装位置,这里 ...

  6. java基础-02:编译型和解释型

    Java程序运行机制: Java语言的编译-->解释-->运行过程 1.编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的 ...

  7. JavaScript学习系列博客_20_JavaScript 作用域

    作用域 - 作用域指一个变量的作用的范围 - 在JS中一共有两种作用域 1.全局作用域 - 直接编写在script标签中的JS代码,都在全局作用域- 全局作用域在页面打开时创建,在页面关闭时销毁 - ...

  8. Jupyter Notebook 入门指南

    https://www.jianshu.com/p/061c6e5c4b0d cmd输入 :jupyter notebook

  9. Kafka工作流程

    Kafka生产过程分析 1 写入方式 producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区(patition)中,属于顺序写磁盘(顺序写磁盘效率比随机 ...

  10. Java数据结构——循环队列

    普通顺序队列存在的问题在普通顺序队列中,入队的操作就是先将尾指针rear右移一个单位,然后将元素值赋值给rear单位.出队时,则是头指针front后移一个单位.像这样进行了一定数量的入队和出队操作后, ...