Java --- Spring(1)
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的优点:
- Spring是开源的,并且是免费的。
- Spring是一个轻量级的框架,非入侵式的框架。
没有任何其他的依赖,使用它,不需要导入其他的包 - IOC AOP
控制反转
面向切面编程 - 对事物的支持。
- 对框架的支持,不需要任何成本就可以引入其他框架。
总的来说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创建对象
- 首先我们创建一个普通的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>
- 创建一个实体类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 +'}';}
}
- 创建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>
- 测试
public class StudentTest {@Testpublic void test(){ClassPathXmlApplicationContext Cpa = new ClassPathXmlApplicationContext("beans.xml");Student student = (Student) Cpa.getBean("student");System.out.println(student.toString());}
}
- 打印出的结果为:
这就是我们通过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)相关推荐
- Java进击框架:Spring(一)
Java进击框架:Spring(一) 前言 创建Spring项目 Spring IoC容器和Beans介绍 Bean的概述 Spring IoC 配置元数据 实例化Bean 依赖注入 循环依赖 详细配 ...
- Spring(五):SpringStruts2Hibernate整合后,实现查询Employee信息
背景: 基于之前两篇文章<Spring(三):Spring整合Hibernate>.<Spring(四):Spring整合Hibernate,之后整合Struts2>,了解了如 ...
- Redis实战之征服 Redis + Jedis + Spring (三)
一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现"stringRedisTemplate.opsForList()"的强大,抓紧时间恶补下. 通过spring-d ...
- 「实战篇」开源项目docker化运维部署-后端java部署(七)
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:「实战篇」开源项目docker化运维部署-后端java部署(七) 本节主要说说后端的部署需要注意的点,本身renren-fas ...
- Spring(2)bean注入--Set方法注入
Spring(2)bean注入–Set方法注入 Set 方法注入 新建一个空的 maven项目. 导入依赖 <properties><project.build.sourceEnco ...
- java基础(六)多线程/设计模式
这辈子没办法做太多事情,所以每一件都要做到精彩绝伦! People can't do too many things in my life,so everything will be wonderfu ...
- Jetty 9.1上的Java WebSockets(JSR-356)
最终发布了Jetty 9.1 ,将Java WebSockets(JSR-356)引入了非EE环境. 这真是个好消息,今天的帖子将介绍如何将这个出色的新API与Spring Framework一起使用 ...
- java并发(3)ThreadLocal的使用及实现原理(实现原理)
在上一篇文章java并发(2)ThreadLocal的使用及实现原理(使用)中介绍了ThreadLocal的简单使用,这篇文章通过jdk8ThreadLocal的源码分析一下ThreadLocal的实 ...
- 征服 Redis + Jedis + Spring (一)—— 配置常规操作(GET SET DEL)
有日子没写博客了,真的是忙得要疯掉. 完成项目基础架构搭建工作,解决了核心技术问题,接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: 征服 Redis 征服 Redis + J ...
最新文章
- Spark新愿景:让深度学习变得更加易于使用——见https://github.com/yahoo/TensorFlowOnSpark...
- 理解并取证:DHCP的工作原理、怎么检测IP地址冲突
- mysql创建表的时候,字段尽量不要为NULL
- STM32使用TIM闪烁LED——输出比较方式
- Centos6.8 rsync 客户端安装与设置
- 创新、颠覆、引领,从 0 到百亿美元市值的创操作指南
- 坦克大战代码_坦克大战系列文章-坦克大战简介
- 数据结构与算法-----数据结构-----2-3-4树以及外部存储
- 技术小故事-Activity的Launch Mode引起的动画“疑案”
- PyTorch:可视化TensorBoard
- tcp压测工具_掌门全链路灰度压测实战
- Java解析XML并自动写入Excel
- 3、ARM嵌入式系统:按键 初始化
- 1.7亿条数据,比胡同和撸串更真实的北京
- 基于tensorflow的LSTM实现PTB预测
- 江西宜春三名公务员擅自驾公车钓鱼被通报-公车钓鱼-公务员-公车
- 文件批量重命名的方法,图解很多文件改名
- cannot have an existing value
- 2017总结与2018规划
- Springboot注解@ServletComponentScan和@ComponentScan
热门文章
- 求生之路寻找延迟服务器,用centos搭建一个简单的求生之路2服务器(用于好友联机降低延迟,不包含插件)...
- 年终奖,明年年中发~
- iOS iphonex底部安全区域
- 程序丸子的校招个人经验——八股文篇
- [Python] 经济赔偿金算法
- java乐器_用java新建一个乐器类,包含属性:名称、重量、品牌、价格;包含方法:不带参数的构造方法、表演方法...
- Flutter 主题(皮肤)更换的那些事
- 阿里4000亿美元市值:新经济体、新零售与新常态
- 高频面试题:服务器CPU占用过高怎么办?搞定只需简单7步
- TP-LINK好?还是去美团做共享单车