Spring 框架(持续完善中)
目录标题
一、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, 它的技术生态所含盖的技术和框架也很多,主要有:
- Spring MVC 框架
- Spring Boot
- Spring Cloud
- Spring Security
- Spring cache
- …
Spring Framework 核心概念
- IOC 容器, 也叫 Inverse of Control, 控制反转, 换成另外一个词更好理解,叫 依赖注入 Dependency Injection, 简称 DI。
- AOP, 面向切面编程
- 数据访问支持层,包含 JDBC的技术, mybatis的支持,hibernate的支持, JPA 的支持.
- 事务的支持
- 测试的支持
- …
了解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
开发的步骤流程
- 准备一个maven项目
- 导入相关的依赖 [spring-context]和[spring-test]
- 编写相关的代码
- 测试
Spring IOC的特性
- 采用单例模型,也就是说在IOC容器中,默认只创建配置Bean的唯一实例
- 通过 scope 属性来控制容器是否采用单例,默认是 单例 [singleton]
- 设置 scope=“prototype” ,表示IOC容器采用 原型模式,也就是不是单例。
- 采用“懒加载“方式来创建目标Bean对象
- 同一个接口类型,有多个实现的情况下,就会产生“二义性”。怎么解决?
- 再加一个 名字 进行限定。
所以,默认情况下, Spring IOC中,Bean的搜索是根据 类型 来搜索的[by Type], 如果类型存在“二义性”时,则需要进一步通过bean的名称[id] 来搜索,这个叫 by Name。
IOC容器核心API
- ApplicationContext 接口,这就是IOC的核心容器接口,通过它可以获取被IOC容器管理的Bean
- 支持两种不同的配置:
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 环境
如果你想手动编写代码来获取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);
}
}
- 当然,建议是使用 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相关的注解
- @Component 组件,修饰类的,需要被容器管理的bean类型,现在使用很少,因为有下面三个来代替它:
* @Service 从语义上扩展了@Component, 代表 服务层的bean
* @Repository 从语义上扩展了@Component, 代表 DAO层的bean
* @Controller 从语义上扩展了@Component, 代表 控制层的bean
- @Autowired 自动注入,它是 byType 进行搜索的。
- @Qualifier 进一步限定搜索的Bean,按姓名搜索,也就是 byName
- @Resource 它是JAVAEE规范中的注解,spring IOC 实现了这个注解,它即支持byType,也支持byName
- @Configuration 表示此类是一个Spring的注解配置类
- @ComponentScan 用来指定要扫描的包,可以指定多个
- @ContextConfiguration 它是spring-test的注解,用在测试类上面,来读取目标配置类
- @RunWith 也是spring-test的注解,用在测试类上面,让测试类拥有spring 框架的上下文环境。
有关数据源配置
数据源是用来配置数据库的连接的,它是自动参与到连接池管理之中,一般都无需我们去实现数据源,都是由第三方的组件提供的,目前最主流的数据源技术组件【连接池实现】有:
- commons-dbcp 组件, 由 apache 提供的
- druid 组件,由 alibaba 提供
- hikari 组件,一家日本公司
- …
我们选用 druid 数据源,所以,在pom.xml中要加入 druid的依赖.
配置数据源相关的属性
- url
- driver
- username
- password
- …
Note:
欢迎点赞,留言,转载请在文章页面明显位置给出原文链接
知者,感谢您在茫茫人海中阅读了我的文章
没有个性 哪来的签名!
详情请关注点我
持续更新中
© 2020 09 - Guyu.com | 【版权所有 侵权必究】
Spring 框架(持续完善中)的更多相关文章
- Eclipse/JavaWeb (三)三大框架之Spring框架 持续更新中...
(一)发展历史 现在我们有三个层了,可是每层之间的调用是怎样的呢?比如显示层的struts需要调用一个业务类,就需要new一个业务类出来,然后使用:业务层需要调用持久层的类,也需要new一个持久层类出 ...
- 2018年最新Java面试题及答案整理(持续完善中…)
2018年最新Java面试题及答案整理(持续完善中…) 基础篇 基本功 面向对象特征 封装,继承,多态和抽象 封装封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内 ...
- linux 命令学习(持续完善中...)
linux 命令学习(持续完善中...) 主要是记录一些开发过程中用到的linux命令,慢慢补充 一.用户 1.添加用户: useradd 用户名 2.设置密码:passwd 用户名 ,然后按照提示输 ...
- Scrapy爬虫导图(持续完善中)
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.
- ECLIPSE/JAVAWEB (二)三大框架之Hibernate框架 持续更新中...
(一)发展历史 在Struts框架中使用jdbc连接来读写数据库,我们最常见的就是打开数据库连接.使用复杂的sql语句进行读写.关闭连接,获得的数据又需要转换或封装后往外传,这是一个非常繁琐的过程. ...
- Eclipse/JavaWeb (一)三大框架之struts框架 持续更新中...
最近主要把javaweb的三大框架过一遍. (一)发展历史 传统的Java Web应用程序是采用JSP+Servlet+Javabean来实现的,这种模式实现了最基本的MVC分层,使得程序分为几层,有 ...
- Spring框架基础(中)
Spring对不同持久化技术进行支持 JDBC 导入spring-jdbc-4.3.5.RELEASE.jar.spring-tx-4.3.5.RELEASE.jar 创建对象,设置数据库信息 创建j ...
- Spring框架spring-web模块中的RestTemplate类详解
RestTemplate类是spring-web模块中进行HTTP访问的REST客户端核心类.RestTemplate请求使用阻塞式IO,适合低并发的应用场景. 1. RestTemplate类提供了 ...
- iOS开发常用第三方开源框架 持续更新中...
键盘管理 TPKeyboardAvoiding IQKeyboardManager(1.2.8) 弹窗HUD MBProgressHUD(0.9.2) SVProgressHUD UIView+Toa ...
随机推荐
- 5.深入k8s:StatefulSet控制器
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 在上一篇中,讲解了容器持久化存储,从中我们知道什么是PV和PVC,这一篇我们讲通过Sta ...
- JavaScript Babel说明
babel插件只是去唤醒 @babel/core中的转换过程 转换模块需要手动安装 npm install @babel/core 转换方式需要安装 @babel/preset-env babel默认 ...
- 自动化特征工程—Featuretools
Featuretools是一个可以自动进行特征工程的python库,主要原理是针对多个数据表以及它们之间的关系,通过转换(Transformation)和聚合(Aggregation)操作自动生成新的 ...
- 获取客户端用户真实ip方法整理(jekyll迁移)
layout: post title: 获取客户端用户真实ip方法整理 date: 2019-08-22 author: xiepl1997 tags: springboot 由请求获取客户端ip地址 ...
- 秒杀 2Sum 3Sum 4Sum 算法题
2 Sum 这题是 Leetcode 的第一题,相信大部分小伙伴都听过的吧. 作为一道标着 Easy 难度的题,它真的这么简单吗? 我在之前的刷题视频里说过,大家刷题一定要吃透一类题,为什么有的人题目 ...
- “程序包com.sun.org.apache.xml.internal.security.utils不存在”的问题
方法一(eclipse): 网上大神的回答: 自己写的程序是不建议用com.sun这个玩意儿的..这东西属于“Deprecated and restricted API”.. 而且各种com.sun的 ...
- Navicat15破解+网盘位置
百度网盘Navicat.15位置 链接:https://pan.baidu.com/s/1Vn0Qnt8IUA37a-p4hAnk5g 提取码:clq3 1.百度网盘下载完后,点这个安装Navicat ...
- ovs 删除流表 指定 actions 中字段
例: ovs-ofctl del-flows br-int in_port=100,out_group=100 -O openflow13 ovs-ofctl del-flows br-int in_ ...
- 《p5.js创意游戏编程》第一课:跳动的小球
准备:Hbuilder/vscode等可以编写网页的编辑器 如果想立刻上手也可以使用在线编译器p5.js官方在线编辑器,如果打不开也可以使用国内的一款在线编辑器jsrun编辑器,(第一课先使用jsru ...
- 在Unity中检测死循环和卡死
当游戏在手机/模拟器上卡死,logcat没有日志输出,也没有卡死堆栈信息或者bugly也没有捕获到异常,你是否很焦急?本文介绍一下我们项目中检测Unity卡死的方法,也许适合你使用. 实现原理 在绝大 ...