一起学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个,如下所示:

1 //日志包
2 commons-logging-1.1.1.jar
3 //spring核心包
4 spring-aop-4.0.6.RELEASE.jar
5 spring-beans-4.0.6.RELEASE.jar
6 spring-context-4.0.6.RELEASE.jar
7 spring-core-4.0.6.RELEASE.jar
8 spring-expression-4.0.6.RELEASE.jar

3. 配置Spring配置文件

对于Java Project来说,applicationContext.xml必须放在src目录,如下所示:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4 xsi:schemaLocation="http://www.springframework.org/schema/beans
 5  http://www.springframework.org/schema/beans/spring-beans.xsd">
 6      <!-- 此文件默认放置在src目录 -->
 7      <!-- id表示唯一标识,class表示类型,必须为全路径 -->
 8     <bean id="student" class="com.hex.first.Student">
 9         <property name="id" value="1"></property>
10         <property name="name" value="hex"></property>
11         <property name="age" value="20"></property>
12     </bean>
13 </beans>

对于配置文件中的Student类,定义如下:

 1 package com.hex.first;
 2
 3 /**
 4  * 定义一个学生类
 5  * @author Administrator
 6  *
 7  */
 8 public class Student {
 9
10     /*
11      * 学生ID
12      */
13     private int id;
14
15     /*
16      * 学生姓名
17      */
18     private String name;
19
20     /**
21      * 年龄
22      */
23     private int age;
24
25     public int getId() {
26         return id;
27     }
28     public void setId(int id) {
29         this.id = id;
30     }
31     public String getName() {
32         return name;
33     }
34     public void setName(String name) {
35         this.name = name;
36     }
37     public int getAge() {
38         return age;
39     }
40     public void setAge(int age) {
41         this.age = age;
42     }
43
44     @Override
45     public String toString() {
46         // TODO Auto-generated method stub
47         return "ID="+id+",Name="+name+",Age="+age;
48     }
49 }

4. 声明对象

对于常规声明对象和采用Spring获取对象的方式如下:

 1 //常规New对象方法声明一个对象
 2 Student student=new Student();
 3 student.setId(1);
 4 student.setName("hex");
 5 student.setAge(20);
 6 System.out.println(student);
 7 //通过Spring进行注入,Spring上下文对象
 8 ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
 9 //从Spring的IOC容器中获取id为student的bean对象
10 Student student01=(Student) context.getBean("student");
11 System.out.println(student01);

5. 测试结果

如下所示:

采用Spring方式和传统方式的区别有哪些

传统方式全部采用硬编码的方式,一旦有变动,就需要修改代码,而Spring采用注入的方式,将可变的东西放在配置文件中,便于修改。

1. 首先假设一种场景,学生有一个学习课程的需求

关于课程的接口(ICourse),定义如下:

 1 /**
 2  * 定义一个课程接口
 3  * @author Administrator
 4  *
 5  */
 6 public interface ICourse {
 7
 8     /**
 9      * 学习
10      */
11     void learn();
12 }

分别有两个实现类:JavaCourse和HtmlCourse,代码如下:

 1 package com.hex.first;
 2
 3 /**
 4  * 学习Java课程
 5  * @author Administrator
 6  *
 7  */
 8 public class JavaCourse implements ICourse {
 9
10     @Override
11     public void learn() {
12         System.out.println("学习Java课程。。。");
13
14     }
15
16 }

 1 package com.hex.first;
 2
 3 /**
 4  * 学习Html课程
 5  * @author Administrator
 6  *
 7  */
 8 public class HtmlCourse implements ICourse {
 9
10     @Override
11     public void learn() {
12         System.out.println("学习Html课程。。。");
13
14     }
15
16 }

如果一个学生要学习这两门课程,有以下三种实现方案:

1. 第一种:原始的多态方法

在Student类中增加两个方法,分别用来学习Java和Html,如下所示:

 1     /**
 2      * 学习Java
 3      */
 4     public void learnJava(){
 5         ICourse course=new JavaCourse();
 6         course.learn();
 7     }
 8
 9     /**
10      * 学习Html
11      */
12     public void learnHtml(){
13         ICourse course=new HtmlCourse();
14         course.learn();
15     }

调用代码如下:

1 //第1种,最原始的多态方法
2 System.out.println("第1种,最原始的多态方法:");
3 student.learnJava();
4 student.learnHtml();

备注:此方案导致学生和课程之间形成强耦合关系,假如需要增加一种学习Python语言的课程,需要增加接口的实现类(PythonCourse),修改Student类,增加learnPython方法,改动较大,或者有些学生只学其中一门课程,而另一些学生学两门课程,采用此方案会比较麻烦。

2. 第二种:采用简单工厂方法,将课程的创建抽离出来,由工厂统一管理。

在Student中增加一个学习(learn)方法:

1         /**
2      * 学习通过参数区分
3      * @param name
4      */
5     public void learn(String name){
6         ICourse course=CourseFactory.getCourse(name);
7         course.learn();
8     }

增加工厂类(CourseFactory)

 1 package com.hex.first;
 2
 3 /**
 4  * 课程工厂
 5  * @author Administrator
 6  *
 7  */
 8 public class CourseFactory {
 9
10     /**
11      * 获取课程对象
12      * @param name
13      * @return
14      */
15     public static ICourse getCourse(String name){
16         if(name.equals("java")){
17             return new JavaCourse();
18         }else{
19             return new HtmlCourse();
20         }
21     }
22 }

然后客户端调用时只需要传字符串就行。如下所示:

1 //第2种,简单工厂方法
2 System.out.println("第2种,简单工厂方法:");
3 student.learn("java");
4 student.learn("html");

备注:此方案虽然将对象的创建剥离出来,由工厂进行管理,但是课程的类型还是硬编码的,还是不够完善。

3. 第三种:采用Spring的方式,实现对象的动态注入

在学生类中增加学习方法,参数是ICourse接口:

1         /**
2      * 传递接口
3      * @param course
4      */
5     public void learn(ICourse course){
6         course.learn();
7     }
8     

在Spring配置文件中,配置要注入的对象:

1 <!-- 两个对象,没有属性,不需要赋值 -->
2 <bean id="java" class="com.hex.first.JavaCourse"></bean>
3 <bean id="html" class="com.hex.first.HtmlCourse"></bean>

通过Spring来获取对象,实现动态控制:

1 //第3种,通过SpringIOC实现
2 System.out.println("第3种,通过SpringIOC实现:");
3 ICourse course=(ICourse)context.getBean("java");
4 student.learn(course);
5 ICourse course2=(ICourse)context.getBean("html");
6 student.learn(course2);

以上三种方式,均可以实现需求,至于采用哪种方案,可以依据具体实际场景而定。

备注

没有伞的孩子,必须努力奔跑!

期待一树花开,愿你叶落归来。

原文地址:https://www.cnblogs.com/hsiang/p/11612320.html

时间: 2024-11-01 18:57:03

一起学Spring之基础篇的相关文章

Spring MVC 基础篇 1

Spring MVC基础篇  @RequestMapping使用 [email protected]RequestMapping 注解 进行请求映射 (1)指定Controller或者Method可以处理那些url请求. (2)适用范围:类定义上或者方法定义上都可以加. (3)在类定义处添加该注解是相对于WEB应用的根目录,在方法处是对类定义的请求处理的进一步细化.可以在类定义上没有添加该注解,但是方法定义上有该注解,此时 方法处的该注解标记的URL就是相对于WEB应用根目录. (4) 思考:此

spring boot 基础篇 -- 阿里多数据源

这块是比较基础的配置,阿里数据库配置还是比较好用的,并且可以用来监控数据源的情况.废话不多说,下面看代码. 基于maven项目,在pom.xml中添加引用: <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.11</version> </dependency> 配置文件如下: serve

Spring复习基础篇

1.Spring注入方式 1.1 构造方法注入 个人理解:先按照索引进行注入,当不存在索引再按照参数类型进行注入,当具有多个同一类型参数的时候,再根据参数定义的先后顺序进行注入. 1.1.1 常见构造方法注入: 当构造方法中有多个同一个类型的参数时,将按照配置文件中定义的先后顺序进行依次匹配 1.1.2 构造方法带有简单类型的注入 Spring在注入的时候,是将配置的ref或者value标签的值转成具体的类型,然后传递给构造方法的,如果是基本类型,则Spring无法识别具体类型,无法根据具体参数

Spring MVC 基础篇 6

Spring MVC 视图解析器 1.请求直接进入页面,不经过Controller <!-- 配置直接转发的页面,请求直接进入页面,而无需再经过Controller方法 --> <mvc:view-controller path="/success" view-name="success"/> <!-- 在实际开发中通常都需要配置 mvc:annotation-driven 标签 --> <mvc:annotation-dr

Spring MVC 基础篇4

Spring MVC Controller中返回数据到页面 1.使用ModelAndView 进行数据返回到请求页面 2.利用Map类型的入参进行Controller返回到页面上 3.将数据放到Session域中,从而实现多个请求之间共享属性值

Spring MVC 基础篇 2

Spring MVC 与rest支持 [email protected] 映射URL绑定的占位符 通过@PathVariable可以将URL上占位符参数绑定到控制器处理方法的入参中:URL中的{XXX}占位符可以通过@PathVariable("xxx")绑定到操作方法的入参中. @RequestMapping(value="/hello/{name}") public String hello(@PathVariable("name") Str

Spring MVC 基础篇 3

Spring MVC请求参数接收 1.通过@RequestParam 接收请求参数 2.使用pojo对请求参数进行对象绑定 请求:http://127.0.0.1:8080//MySpringMVC01/user/save?userName=jack&userAge=11&address.province=anhui&address.city=chuzhou POJO User: public class User { private String userName; privat

Spring MVC基础篇4

Spring MVC操作原生Servlet 对象 Spring MVC 可以操作原生的Servlet API,如下的这些原生API,可以各自 自由混合使用,也可以和其他非原生 参数组合使用 实例代码: /** * 1.Spring MVC 获取原生的servlet API <br /> * 2.当请求方法的参数上加上原生的Servlet API类型请求参数 时,Spring MVC会自动注入对于类型的入参<br /> * 3.MVC Handller 方法可以接收的ServletA

Spring的基础篇

搭建Spring实例 持久层 import org.springframework.stereotype.Repository; @Repository //将该类的对象创建为userDao实例 public class UserDao{ public String findUserByName(String userName) { return "abc"; } } 业务层 import com.baobaotao.dao.UserDao; import com.sun.istack