一起学Spring之基础篇
本文主要讲解Spring的基础环境搭建以及演变由来,仅供学习分享使用,如有不足之处,还请指正。
什么是Spring ?
Spring是一个开源框架,用来处理业务逻辑层和其他层之间的耦合问题。因此Spring将面向接口开发的思想贯穿整个系统应用,且Spring是一个轻量级框架,所以在诞生之初,便风靡Java开发市场,得到了广泛的认可与响应。
Spring基础概念
依赖注入(DI:Dependency Injection)又叫控制反转(IoC:Inversion of Control):将组件对象的控制权从代码本身,转移到外部容器。Spring容器也是一个IoC容器,用来管理所有的Java Bean,主要是通过BeanFactory来进行产生和管理Bean。
Spring框架搭建
1. 建立一个Java Project
Spring框架是即支持Java Project,又支持Dynamic Web Project,如下所示:

2. 导入Spring框架需要的Jar包
Spring框架搭建需要的包共6个,如下所示:
//日志包
commons-logging-1.1.1.jar
//spring核心包
spring-aop-4.0.6.RELEASE.jar
spring-beans-4.0.6.RELEASE.jar
spring-context-4.0.6.RELEASE.jar
spring-core-4.0.6.RELEASE.jar
spring-expression-4.0.6.RELEASE.jar
3. 配置Spring配置文件
对于Java Project来说,applicationContext.xml必须放在src目录,如下所示:
<?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">
<!-- 此文件默认放置在src目录 -->
<!-- id表示唯一标识,class表示类型,必须为全路径 -->
<bean id="student" class="com.hex.first.Student">
<property name="id" value="1"></property>
<property name="name" value="hex"></property>
<property name="age" value="20"></property>
</bean>
</beans>
对于配置文件中的Student类,定义如下:
package com.hex.first; /**
* 定义一个学生类
* @author Administrator
*
*/
public class Student { /*
* 学生ID
*/
private int id; /*
* 学生姓名
*/
private String name; /**
* 年龄
*/
private int age; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
// TODO Auto-generated method stub
return "ID="+id+",Name="+name+",Age="+age;
}
}
4. 声明对象
对于常规声明对象和采用Spring获取对象的方式如下:
//常规New对象方法声明一个对象
Student student=new Student();
student.setId(1);
student.setName("hex");
student.setAge(20);
System.out.println(student);
//通过Spring进行注入,Spring上下文对象
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//从Spring的IOC容器中获取id为student的bean对象
Student student01=(Student) context.getBean("student");
System.out.println(student01);
5. 测试结果
如下所示:

采用Spring方式和传统方式的区别有哪些
传统方式全部采用硬编码的方式,一旦有变动,就需要修改代码,而Spring采用注入的方式,将可变的东西放在配置文件中,便于修改。
1. 首先假设一种场景,学生有一个学习课程的需求
关于课程的接口(ICourse),定义如下:
/**
* 定义一个课程接口
* @author Administrator
*
*/
public interface ICourse { /**
* 学习
*/
void learn();
}
分别有两个实现类:JavaCourse和HtmlCourse,代码如下:
package com.hex.first; /**
* 学习Java课程
* @author Administrator
*
*/
public class JavaCourse implements ICourse { @Override
public void learn() {
System.out.println("学习Java课程。。。"); } }
和
package com.hex.first; /**
* 学习Html课程
* @author Administrator
*
*/
public class HtmlCourse implements ICourse { @Override
public void learn() {
System.out.println("学习Html课程。。。"); } }
如果一个学生要学习这两门课程,有以下三种实现方案:
1. 第一种:原始的多态方法
在Student类中增加两个方法,分别用来学习Java和Html,如下所示:
/**
* 学习Java
*/
public void learnJava(){
ICourse course=new JavaCourse();
course.learn();
} /**
* 学习Html
*/
public void learnHtml(){
ICourse course=new HtmlCourse();
course.learn();
}
调用代码如下:
//第1种,最原始的多态方法
System.out.println("第1种,最原始的多态方法:");
student.learnJava();
student.learnHtml();
备注:此方案导致学生和课程之间形成强耦合关系,假如需要增加一种学习Python语言的课程,需要增加接口的实现类(PythonCourse),修改Student类,增加learnPython方法,改动较大,或者有些学生只学其中一门课程,而另一些学生学两门课程,采用此方案会比较麻烦。
2. 第二种:采用简单工厂方法,将课程的创建抽离出来,由工厂统一管理。
在Student中增加一个学习(learn)方法:
/**
* 学习通过参数区分
* @param name
*/
public void learn(String name){
ICourse course=CourseFactory.getCourse(name);
course.learn();
}
增加工厂类(CourseFactory)
package com.hex.first; /**
* 课程工厂
* @author Administrator
*
*/
public class CourseFactory { /**
* 获取课程对象
* @param name
* @return
*/
public static ICourse getCourse(String name){
if(name.equals("java")){
return new JavaCourse();
}else{
return new HtmlCourse();
}
}
}
然后客户端调用时只需要传字符串就行。如下所示:
//第2种,简单工厂方法
System.out.println("第2种,简单工厂方法:");
student.learn("java");
student.learn("html");
备注:此方案虽然将对象的创建剥离出来,由工厂进行管理,但是课程的类型还是硬编码的,还是不够完善。
3. 第三种:采用Spring的方式,实现对象的动态注入
在学生类中增加学习方法,参数是ICourse接口:
/**
* 传递接口
* @param course
*/
public void learn(ICourse course){
course.learn();
}
在Spring配置文件中,配置要注入的对象:
<!-- 两个对象,没有属性,不需要赋值 -->
<bean id="java" class="com.hex.first.JavaCourse"></bean>
<bean id="html" class="com.hex.first.HtmlCourse"></bean>
通过Spring来获取对象,实现动态控制:
//第3种,通过SpringIOC实现
System.out.println("第3种,通过SpringIOC实现:");
ICourse course=(ICourse)context.getBean("java");
student.learn(course);
ICourse course2=(ICourse)context.getBean("html");
student.learn(course2);
以上三种方式,均可以实现需求,至于采用哪种方案,可以依据具体实际场景而定。
备注
没有伞的孩子,必须努力奔跑!
期待一树花开,愿你叶落归来。
一起学Spring之基础篇的更多相关文章
- 小白学Docker之基础篇
系列文章: 小白学Docker之基础篇 小白学Docker之Compose 小白学Docker之Swarm PS: 以下是个人作为新手小白学习docker的笔记总结 1. docker是什么 百科上的 ...
- 白话Spring(基础篇)---AOP(execution表达式)
作为AOP的最后一节内容,我们来简单总结一下切面表达式上见的书写方法.下面的那内容有参考其他博文,在此先对开源博客的各位大神表示感谢! -------------------------------- ...
- 白话Spring(基础篇)---AOP(execution表达式)(转)
[一知半解,就是给自己挖坑] 作为AOP的最后一节内容,我们来简单总结一下切面表达式上见的书写方法.下面的那内容有参考其他博文,在此先对开源博客的各位大神表示感谢! ----------------- ...
- spring boot 基础篇 -- 阿里多数据源
这块是比较基础的配置,阿里数据库配置还是比较好用的,并且可以用来监控数据源的情况.废话不多说,下面看代码. 基于maven项目,在pom.xml中添加引用: <dependency> &l ...
- 小朋友学Linux<一>基础篇
Linux最基础之<小朋友也能学会Linux>... 1.Linux 知识积累: Linux 英文解释为 Linux is not Unix.学习Linux必须要熟练使用的操作系统是Cen ...
- Spring MVC 基础篇4
Spring MVC Controller中返回数据到页面 1.使用ModelAndView 进行数据返回到请求页面 2.利用Map类型的入参进行Controller返回到页面上 3.将数据放到Ses ...
- Spring MVC基础篇4
Spring MVC操作原生Servlet 对象 Spring MVC 可以操作原生的Servlet API,如下的这些原生API,可以各自 自由混合使用,也可以和其他非原生 参数组合使用 实例代码: ...
- spring boot 基础篇 -- 集成接口测试Swagger
一.在pom.xml加入Swagger jar包引入 <dependency> <groupId>io.springfox</groupId> <artifa ...
- spring boot 基础篇 -- 定时任务
在日常项目中,常常会碰到定时监控项目中某个业务的变化,下面是spring boot 集成的定时任务具体配置: @Component public class IndexWarningScheduled ...
随机推荐
- ThinkPHP5——模型关联(多对多关联)
关联定义 多对多关联不像一对一和一对多关联,它还要多建一个中间表用来处理多对多的关联,例如: #城市 create table city ( c_id int primary key AUTO_INC ...
- HBase(2) Java 操作 HBase 教程
目录 一.简介 二.hbase-client 引入 三.连接操作 四.表操作 五.运行测试 FAQ 参考文档 一.简介 在上一篇文章 HBase 基础入门 中,我们已经介绍了 HBase 的一些基本概 ...
- 华为云MySQL金融版正式商用,高可靠的金融级数据库来了
摘要:全新三节点架构,基于深度优化的MGR组复制技术,提供金融级的数据一致性. 日前,华为云数据库MySQL 金融版正式商业化发布,MySQL金融版采用MGR技术,基于Paxos协议,采用一主两备三节 ...
- 华为云ROMA,联接企业应用的现在与未来
2019.9.19日,在华为全联接大会的华为云Summit中,华为云CTO宇昕总提出:"企业的应用与数据集成,始终是数字化转型和智能化升级的关键,华为云企业应用与数据集成平台ROMA,打破时 ...
- mac install: /usr/bin/unrar: Operation not permitted
按照教程mac下解压缩rar文件工具-rarosx(免费),在mac上安装rar,在执行命令 sudo install -c -o $USER unrar /bin 出现错误:install: /bi ...
- luogu P2946 [USACO09MAR]牛飞盘队Cow Frisbee Team
题目背景 老唐最近迷上了飞盘,约翰想和他一起玩,于是打算从他家的N头奶牛中选出一支队伍. 每只奶牛的能力为整数,第i头奶牛的能力为R i .飞盘队的队员数量不能少于 1.大于N.一 支队伍的总能力就是 ...
- luogu P1316 丢瓶盖 |二分答案
题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? 输入格式 ...
- 一台电脑如何管理多个ssh key
目录 一.生成ssh key 1.1 生成密钥(必须) 1.2 设置路径 (可选) 1.3 指定密语字符串(可选) 二.设置ssh key的代理 2.1. 首先查看代理 2.2. 添加私钥 三.添加公 ...
- [TimLinux] CSS 计数功能实现递归目录
内容引用自<css世界>: count-reset 与 counter 为父子关系,兄弟关系会导致序号混乱 调用一次 count-increment 将给序号进行一次报数,调用 count ...
- POJ 1949 Chores
Farmer John's family pitches in with the chores during milking, doing all the chores as quickly as p ...