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 ...
随机推荐
- NGINX+PHP+POSTGRESQL+ZABBIX 5.X
安装前准备工作 系统及应用版本 centos 8.3 nginx 1.18 php 7.4.8 postgresql 12.3 zabbix 5.0.2 安装编译环境依赖包 dnf -y instal ...
- artifactdescriptorexception:Failed to read artifact descriptor for xxx:jar ”
在Eclipse中执行Maven的install命令时,报“Failed to read artifact descriptor for xxx:jar ”的错误.这可能是在下载过程中文件出现错误.或 ...
- JavaScript基础-04-对象、函数
对象 1. 对象:使用基本数据类型的数据,创建的变量都是独立的,不能成为一个整体 对象属于一个复合数据类型,在对象中可以保存多个不同数据类型的属性. 对象的分类: (1)内建对象:由ES ...
- Core + Vue 后台管理基础框架9——统一日志
1.背景 前阵子有园友留言,提到日志相关的东西,同时,最近圈子里也有提到日志这个东西.一个充分.集中的统一日志平台还是很有必要的,否则系统出问题了只能靠猜或者干瞪眼.何谓充分,日志记录满足最低要求.出 ...
- IOS 如何持久化自定义对象 2014-08-01 01:38
如果持久话自定义对象 那么这个对象一定要遵循 NSCoding 协议 并实现编解码:然后再将编解码后的数据 NSKeyedArchiver 到NSData中 @interface NSKeyAnd ...
- JavaScript设计模式之策略模式【组合委托】
前言:语言只是工具,思想才是核心 今天要总结的是 策略模式 策略在开发中的应用非常广泛,所以也是非常常见且使用的设计模式. 在实际开发中,往往在实现一个功能时,有多种解决方案可行. 常见场景: 解压: ...
- 使用Postman工具做接口测试(五)——生成随机参数
引言 我们平时使用最多的接口调试工具就是postman了,比如开发将一个接口给到你,你想看看接口是否正常.最常用的方法就是用postman去调一下.如果通,就写接口测试用例,反之,将开发打一顿吧o(* ...
- linux驱动之模块化编程
今天刚开始学习linux驱动的编写.在网上开了许多网友的博客,感觉比较好的摘抄下来,以便以后忘记可以随时查看.下面是摘抄文章的地址,非常感谢他们. http://blog.chinaunix.net/ ...
- 1.Oracle数据库简介
Oracle数据库简介 Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品.可以说Oracl ...
- META.表
META.表