Spring能做什么

1. 能根据配置文件创建及组装对象之间的依赖关系;

2. 面向切面编程,能帮助我们无耦合的实现日志记录,性能统计,安全控制等;

3. 提供第三方数据访问框架(如Hibernate),而且自己也提供了一套JDBC访问模板方便访问数据库;

4. 非常简单的管理数据库事务;

5. 集成第三方Web框架(如Struts1/2),而且本身有Spring MVC方便搭建web层

6. 与Java EE整合,与更多技术整合(比如缓存)

Spring的特色

1. 方便解耦,简化开发

 Spring IoC完成对象创建,依赖关系维护等

2. AOP的支持

 Spring提供面向切面编程,实现拦截,监控等

3. 声明式事务管理

 只需通过配置完成对事务的管理,而无需手动操作

4. 方便测试

 支持Junit4,可以通过注解方便测试

5. 方便集成其他框架

 一直在提供并完善各种框架(如Struts,MyBatis,Hibernate等)

6. 降低开发难度,一站式开发项目

 提供各种优秀前端框架,以及后台框架,一站式开发网站

Spring的定义

先看看百度百科的解释

Spring框架是一个轻量级的DI/IoC和AOP容器的开源框架;

Spring为了解决企业应用开发的复杂性而创建的;

Spring的用途不仅限于服务器端的开发,只是为了简化Java开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

Spring使用基本的JavaBean来完成开发。

先了解一下

Spring Boot  通过整合通用实践,更加自动,智能的依赖管理,Spring Boot提供了各种典型应用系统的通用开发基础,所以它是以应用为中心的一个框架集合。

Spring Cloud  可认为是在Spring Boot的升级版,提供了构建分布式系统的通用模块,包含服务发现和服务注册,分布式配置管理,负载均衡,分布式诊断等各种子系统,是构建微服务的一把好手

还有针对特定领域的Spring Security,Spring Data等

Spring框架结构

  • Data Access/Integration层包含有JDBC、ORM、OXM、JMS和Transaction模块。
  • Web层包含了Web、Web-Servlet、WebSocket、Web-Porlet模块。
  • AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现。
  • Core Container(核心容器):包含有Beans、Core、Context和SpEL模块。
  • Test模块支持使用JUnit和TestNG对Spring组件进行测试。

Bean规范

每一个类实现了Bean的规范才能有Spring来接管

必须有个公有类

有无参数构造函数

用公共方法暴露内部成员属性(getter,setter )

Bean的生命周期

Bean的作用域

Spring定义了多种Bean作用域,可基于这些作用域创建bean,包括:

单例(Singleton):在整个应用中,只创建一个bean实例

原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例

会话(Session):在web应用中,为每个会话创建一个bean实例

请求(Request):在web应用中,为每个请求创建一个bean实例。默认情况下,Spring应用上下文中所有bean都是作为单例的形式创建。也就是说,不管既定的一个bean被注入到其他bean多少次,每次所注入的都是同一个实例。

IoC了解一下

一种设计思想。就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。不用new对象,而直接从Spring那里获取对象。

开始Spring的Coding漫漫路

1. 新建Java项目,命名 spring

2.新建lib目录,并添加jar包,

3.开始编写程序

  3.1 在src下新建bean包,然后新建User类

package bean;

public class User {
private Integer id;
private String name;
private String gender; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
} }

  3.2 在src下新建 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 name="beanUser" class="bean.User">
<property name="id" value="1001"></property>
<property name="name" value="Jesse"></property>
<property name="gender" value="male"></property>
</bean> </beans>

4.测试程序

  4.1 在src下新建test类

import bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class test { @Test
public void demo1() {
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[]{"applicationContext.xml"});
User user = (User) context.getBean("beanUser");
System.out.println(user.getId());
System.out.println(user.getName());
System.out.println(user.getGender());
}
}

运行结果:

DI:Dependency Injection (依赖注入)

Spring 在创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象。或者说拿到对象的属性,已经被注入到了相关值了,可以直接使用。

1. 在bean下新建 SaySomething类

package bean;

public class SaySomething {
private User user = null; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public String sayHi() {
return user.getId() + " " + user.getName() + " " + user.getGender();
}
}

2.修改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 name="beanUser" class="bean.User">
<property name="id" value="1001"></property>
<property name="name" value="Jesse"></property>
<property name="gender" value="male"></property>
</bean> <bean name="saySomething" class="bean.SaySomething">
<property name="user" ref="beanUser"></property>
</bean> </beans>

3.在test.java里,添加新的方法,测试上面代码

  @Test
public void demo2() {
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[]{"applicationContext.xml"});
SaySomething saySomething = (SaySomething) context.getBean("saySomething");
System.out.println(saySomething.sayHi());
}

运行结果:

AOP Aspect Oriented Program 面向切面编程

Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码

核心业务,比如登陆,CUD

周边功能,统计,日志,事务管理。在spring的面向切面编程AOP思想里,即被定义为切面

在面向切面的思想里,核心业务功能和切面功能单独开发,然后把两个组合在一起,就是AOP

目的:AOP 能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(事务,日志,权限等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

AOP实现原理

AOP底层将采用代理机制进行实现

接口+实现类:spring采用jdk的动态代理Proxy

实现类:spring采用cglib字节码增强

Spring学习手札(一)的更多相关文章

  1. Spring学习手札(四)谈谈Spring Bean的生命周期及作用域

    在Spring中,那些组成应用程序的主体以及由Spring IoC容器所管理的对象,被称之为Bean.Bean与应用程序中其他对象(比如自己创建类)的区别就是,Bean是由IoC容器创建于销毁的.在S ...

  2. Spring学习手札(三)理解IoC 拯救不开心

    Inverse of Control,翻译成“控制反转”,是Spring的核心.IoC不是一种技术,而是一种设计思想.就是将原本在程序中手动创建对象的控制权(new Object() ),交由Spri ...

  3. Spring学习手札(二)面向切面编程AOP

    AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...

  4. 转-Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable

    转-http://snowolf.iteye.com/blog/1628861/ Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariab ...

  5. 【转】Spring 注解学习手札(超好的springmvc注解教程)

    Spring 注解学习手札(一) 构建简单Web应用 Spring 注解学习手札(二) 控制层梳理 Spring 注解学习手札(三) 表单页面处理 Spring 注解学习手札(四) 持久层浅析 Spr ...

  6. Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable (转)

    最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...

  7. Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable(转)

    最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...

  8. spring 学习之 bean 的注入方式 property和constructor-arg的使用方式

    spring 学习之 bean 的注入方式 property和constructor-arg的使用方式. bean的注入方式: property 注入是: 通过setxx方法注入. construct ...

  9. Spring学习之AOP总结帖

    AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组 ...

随机推荐

  1. python脚本 读取excel格式文件 并进行处理的方法

    一.安装xlrd模块 pip install xlrd 二.读取excel文件 try: excel_obj = xlrd.open_workbook("文件路径") except ...

  2. 双11,自动领取优惠券 js 代码

    http://www.zhihu.com/question/36426051/answer/67690322 本来我不熟悉 js,正好研究一下 (function(window, document) ...

  3. 如何通过Python暴力破解网站登陆密码

    首先申明,该文章只可以用于交流学习,不可以用于其他用途,否则后果自负. 现在国家对网络安全的管理,越来越严,但是还是有一些不法网站逍遥法外,受限于国内的人力.物力,无法对这些网站进行取缔. 今天演示的 ...

  4. CentOS7搭建FastDFS V5.11分布式文件系统-第一篇

    1.绪论 最近要用到fastDFS,所以自己研究了一下,在搭建FastDFS的过程中遇到过很多的问题,为了能帮忙到以后搭建FastDFS的同学,少走弯路,与大家分享一下.FastDFS的作者淘宝资深架 ...

  5. subtext 安装PythonIDE -Anaconda

    安装PythonIDE -Anaconda 打开subtext,通过快捷键 cmd+shift+P 打开 Package Control 来安装其他的插件了. 输入 install 然后你就能看见屏幕 ...

  6. css 题目笔记(本文收集了一些个人觉得比较有意思的css题目,欢迎大家给出自己的解答)

    1.本文收集了一些个人觉得比较有意思的css题目,欢迎大家给出自己的解答 P标签的最大宽度不可以大于H2标签文字宽度的10% 这里应该是P标签的最大宽度由前面的匿名内联元素宽度(就是大字号文字宽度)决 ...

  7. 【PaddlePaddle系列】手写数字识别

      最近百度为了推广自家编写对深度学习框架PaddlePaddle不断推出各种比赛.百度声称PaddlePaddle是一个“易学.易用”的开源深度学习框架,然而网上的资料少之又少.虽然百度很用心地提供 ...

  8. java数据结构之队列

    队列概述队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列.– ...

  9. AttrContext

    info属性类型为AttrContext或AttrContextEnv.主要看AtrContext即可.定义了如下关键参数: /** Contains information specific to ...

  10. 移动设备的HTML页面中图片实现滚动加载

    如今移动互联网风靡全球,移动页面的元素也是丰富多彩,一个移动页面的图片超过10张已经是再正常不过的事情了.但是相对,很多移动用户还停留在2G,3G这样的网络中.那么这样带宽的用户,在浏览这样的页面时, ...