Spring概述

Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。

Spring的优点:

  1. Spring是开源的,并且是免费的。
  2. Spring是一个轻量级的框架,非入侵式的框架。
    没有任何其他的依赖,使用它,不需要导入其他的包
  3. IOC AOP
    控制反转
    面向切面编程
  4. 对事物的支持。
  5. 对框架的支持,不需要任何成本就可以引入其他框架。

总的来说Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的框架(容器)。

Spring的组成


架构 : mvc三层架构

Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式。

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

  • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  • Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
  • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
  • Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  • Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  • Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。

Spring的组件

IOC

控制反转 (inversion of Control):IOC

他是一种设计思想。 根据这个思想有实现的方式,DI : 依赖注入

本质就是设置接口 , set方法,是一种抽象思维

反转: 从被动到主动 , 程序猿主动控制 到 被动接受 , 由编写代码,编写接口,程序具有高度配置性和动态性;

让程序的耦合性大大降低。方便模块独立。

通过IOC创建对象

  1. 首先我们创建一个普通的maven项目,并且导入所需要的jar包
    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.9.RELEASE</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency></dependencies>
  1. 创建一个实体类Student
public class Student {private String name;private String sex;private int age;public Student() {}public Student(String name, String sex, int age) {this.name = name;this.sex = sex;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", sex='" + sex + '\'' +", age=" + age +'}';}
}
  1. 创建Spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!--suppress SpringFacetInspection -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="student" class="com.westos.poji.Student"><property name="name" value="小明"/><property name="sex"  value="男"/><property name="age"  value="18"/></bean></beans>
  1. 测试
public class StudentTest {@Testpublic void test(){ClassPathXmlApplicationContext Cpa = new ClassPathXmlApplicationContext("beans.xml");Student student = (Student) Cpa.getBean("student");System.out.println(student.toString());}
}
  1. 打印出的结果为:

    这就是我们通过IOC创建对象的方法。

依赖注入DI

DI (Dependency Injection)

依赖:指bean对象的创建依赖于Spring容器。bean对象依赖的资源

注入:指Bean对象所依赖的资源,由容器来设置和装配。

以上述Student实体类为例,我们重新编写这个学生类,在修改前,我们创建一个地址类Address

public class Address {private String address;public void setAddress(String address) {this.address = address;}public String getAddress(){return address;}
}

Student类

import java.util.*;public class Student {private String name;private Address address;private String[] books;private List<String> hobbys;private Map<String,String> card;private Set<String> games;private String grilfriend;private Properties info;public String getName() {return name;}public void setName(String name) {this.name = name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public String[] getBooks() {return books;}public void setBooks(String[] books) {this.books = books;}public List<String> getHobbys() {return hobbys;}public void setHobbys(List<String> hobbys) {this.hobbys = hobbys;}public Map<String, String> getCard() {return card;}public void setCard(Map<String, String> card) {this.card = card;}public Set<String> getGames() {return games;}public void setGames(Set<String> games) {this.games = games;}public String getGrilfriend() {return grilfriend;}public void setGrilfriend(String grilfriend) {this.grilfriend = grilfriend;}public Properties getInfo() {return info;}public void setInfo(Properties info) {this.info = info;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", address=" + address +", books=" + Arrays.toString(books) +", hobbys=" + hobbys +", card=" + card +", games=" + games +", grilfriend='" + grilfriend + '\'' +", info=" + info +'}';}}

然后,我们通过beans.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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="address" class="com.westos.poji.Address"><property name="address" value="西安"/></bean><bean id="student" class="com.westos.poji.Student"><!--普通字段注入--><property name="name" value="小明"/><!--引用其他bean注入--><property name="address" ref="address"/><!--数组的注入--><property name="books"><array><value>西游记</value><value>红楼梦</value></array></property><!--List的注入--><property name="hobbys"><list><value>代码</value><value>音乐</value></list></property><!--Map的注入--><property name="card"><map><entry key="IDcard" value="123456789"/><entry key="身份证" value="999999999999999"/></map></property><!--Set的注入--><property name="games"><set><value>LOL</value><value>王者荣耀</value></set></property><!--空值注入--><property name="grilfriend"><null/></property><!--Properties注入--><property name="info"><props><prop key="学号">20000</prop><prop key="性别">男</prop></props></property></bean></beans>

测试结果为:

p命名注入和c命名注入

创建一个User实体类

public class User {private String name;private int age;public User() {}public User(String name, int age) {this.name = name;this.age = age;}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;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}

在bean.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"xmlns:p="http://www.springframework.org/schema/p"xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="user1" class="com.westos.poji.User" p:name="小红" p:age="18"/><bean id="user2" class="com.westos.poji.User" c:name="小芳" c:age="20"/></beans>

测试结果为:

Java --- Spring(1)相关推荐

  1. Java进击框架:Spring(一)

    Java进击框架:Spring(一) 前言 创建Spring项目 Spring IoC容器和Beans介绍 Bean的概述 Spring IoC 配置元数据 实例化Bean 依赖注入 循环依赖 详细配 ...

  2. Spring(五):SpringStruts2Hibernate整合后,实现查询Employee信息

    背景: 基于之前两篇文章<Spring(三):Spring整合Hibernate>.<Spring(四):Spring整合Hibernate,之后整合Struts2>,了解了如 ...

  3. Redis实战之征服 Redis + Jedis + Spring (三)

    一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现"stringRedisTemplate.opsForList()"的强大,抓紧时间恶补下. 通过spring-d ...

  4. 「实战篇」开源项目docker化运维部署-后端java部署(七)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:「实战篇」开源项目docker化运维部署-后端java部署(七) 本节主要说说后端的部署需要注意的点,本身renren-fas ...

  5. Spring(2)bean注入--Set方法注入

    Spring(2)bean注入–Set方法注入 Set 方法注入 新建一个空的 maven项目. 导入依赖 <properties><project.build.sourceEnco ...

  6. java基础(六)多线程/设计模式

    这辈子没办法做太多事情,所以每一件都要做到精彩绝伦! People can't do too many things in my life,so everything will be wonderfu ...

  7. Jetty 9.1上的Java WebSockets(JSR-356)

    最终发布了Jetty 9.1 ,将Java WebSockets(JSR-356)引入了非EE环境. 这真是个好消息,今天的帖子将介绍如何将这个出色的新API与Spring Framework一起使用 ...

  8. java并发(3)ThreadLocal的使用及实现原理(实现原理)

    在上一篇文章java并发(2)ThreadLocal的使用及实现原理(使用)中介绍了ThreadLocal的简单使用,这篇文章通过jdk8ThreadLocal的源码分析一下ThreadLocal的实 ...

  9. 征服 Redis + Jedis + Spring (一)—— 配置常规操作(GET SET DEL)

    有日子没写博客了,真的是忙得要疯掉. 完成项目基础架构搭建工作,解决了核心技术问题,接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: 征服 Redis 征服 Redis + J ...

最新文章

  1. Spark新愿景:让深度学习变得更加易于使用——见https://github.com/yahoo/TensorFlowOnSpark...
  2. 理解并取证:DHCP的工作原理、怎么检测IP地址冲突
  3. mysql创建表的时候,字段尽量不要为NULL
  4. STM32使用TIM闪烁LED——输出比较方式
  5. Centos6.8 rsync 客户端安装与设置
  6. 创新、颠覆、引领,从 0 到百亿美元市值的创操作指南
  7. 坦克大战代码_坦克大战系列文章-坦克大战简介
  8. 数据结构与算法-----数据结构-----2-3-4树以及外部存储
  9. 技术小故事-Activity的Launch Mode引起的动画“疑案”
  10. PyTorch:可视化TensorBoard
  11. tcp压测工具_掌门全链路灰度压测实战
  12. Java解析XML并自动写入Excel
  13. 3、ARM嵌入式系统:按键 初始化
  14. 1.7亿条数据,比胡同和撸串更真实的北京
  15. 基于tensorflow的LSTM实现PTB预测
  16. 江西宜春三名公务员擅自驾公车钓鱼被通报-公车钓鱼-公务员-公车
  17. 文件批量重命名的方法,图解很多文件改名
  18. cannot have an existing value
  19. 2017总结与2018规划
  20. Springboot注解@ServletComponentScan和@ComponentScan

热门文章

  1. 求生之路寻找延迟服务器,用centos搭建一个简单的求生之路2服务器(用于好友联机降低延迟,不包含插件)...
  2. 年终奖,明年年中发~
  3. iOS iphonex底部安全区域
  4. 程序丸子的校招个人经验——八股文篇
  5. [Python] 经济赔偿金算法
  6. java乐器_用java新建一个乐器类,包含属性:名称、重量、品牌、价格;包含方法:不带参数的构造方法、表演方法...
  7. Flutter 主题(皮肤)更换的那些事
  8. 阿里4000亿美元市值:新经济体、新零售与新常态
  9. 高频面试题:服务器CPU占用过高怎么办?搞定只需简单7步
  10. TP-LINK好?还是去美团做共享单车