spring框架学习
- 格式:docx
- 大小:265.36 KB
- 文档页数:32
spring官⽹在线学习⽂档翻译55. Aspect Oriented Programming with Spring(使⽤Spring进⾏⾯向切⾯编程)5.1. Introduction(⼊门)Aspect-Oriented Programming (AOP) complements Object-Oriented Programming (OOP) by providing another way of thinking about program structure. The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is the aspect. Aspects enable the modularization of concerns such as transaction management that cut across multiple types and objects. (Such concerns are often termed crosscutting concerns in AOP literature.)⾯向⽅⾯程序设计(AOP)通过提供另⼀种考虑程序结构的⽅法来补充⾯向对象程序设计(OOP)。
OOP中模块性的关键单元是类,⽽AOP中模块性的单元是⽅⾯。
⽅⾯⽀持关注点的模块化,例如跨多个类型和对象的事务管理。
(在AOP⽂献中,这样的关注点通常被称为横切关注点。
)One of the key components of Spring is the AOP framework. While the Spring IoC container does not depend on AOP, meaning you do not need to use AOP if you don’t want to, AOP complements Spring IoC to provide a very capable middleware solution.Spring的关键组件之⼀是AOP框架。
狂神说Java-Spring详解1、Spring1.1、简介Spring:春天----->给软件⾏业带来了春天!2002,⾸次推出了Spring框架的雏形: interface21框架!Spring框架即以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3⽉24⽇,发布了1.0正式版。
Rod Johnson ,Spring Framework创始⼈,著名作者。
很难想象Rod Johnson的学历,真的让好多⼈⼤吃⼀惊,他是悉尼⼤学的博⼠,然⽽他的专业不是计算机,⽽是⾳乐学。
spring理念:使现有的技术更加容易使⽤,本⾝是⼀个⼤杂烩,整合了现有的技术框架!SSH : Struct2 + Spring + Hibernate !SSM : SpringMvc + Spring + Mybatis!官⽹: https:/lspring.io/projects/spring-framework#overviewGitHub: https:/lspring-projects/spring-framework1 <!-- https : ///artifact/org.springframework/spring-webmvc -->2<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</ artifactId><version>5.2.O.RELEASE</version></ dependency><!-- https:///artifact/org.springframework/spring-webmvc -->8<dependency><groupId>org.springframework</groupId><artifactid>spring-jdbc</artifactId><cversion>5.2.0.RELEASE</version></ dependency>1.2、优点Spring是⼀个开源的免费的框架(容器)!Spring是⼀个轻量级的、⾮⼊侵式的框架!控制反转(IOC),⾯向切⾯编程(AOP) !⽀持事务的处理,对框架整合的⽀持!总结⼀句话: Spring就是⼀个轻量级的控制反转(IOC))和⾯向切⾯编程(AOP)的框架!2、IOC理论推导1. UserDao 接⼝2. UserDaoImpl 接⼝实现类3. UserService 业务接⼝4. UserServiceImpl 业务实现类在之前的业务中,⽤户的需求可能会影响我们原来的代码,我们需要根据⽤户的需求去修改源代码,如果程序代码量⼗分⼤,修改⼀次的成本代价⼗分昂贵!我们使⽤⼀个Set接⼝实现,已经发⽣了⾰命性的变化!//利⽤set动态实现值的注⼊public void setUserDao(UserDao userDao) {erDao = userDao;}之前,程序是主动创建对象,控制权在程序员⼿上!使⽤了Set注⼊后,程序不再具有主动性,⼆⼗变成了被动的接受对象这种思想,从本质上解决了问题,我们程序员不⽤再去管理对象的创建!系统的耦合性⼤⼤降低,可以更加专注在业务的实现上!这是IOC 的原型!IOC本质控制反转loC(Inversion of Control),是⼀种设计思想,DI(依赖注⼊)是实现loC的⼀种⽅法,也有⼈认为DI只是loC的另⼀种说法。
SpringSecurityOauth2系列学习(⼀):初认Oauth2系列导航SpringSecurity系列SpringSecurityOauth2系列初认Oauth2hello!我⼜来啦!之前我们学习了前后端分离的SpringSecurity架构,但是在微服务满天飞的今天,前⾯学习的这种架构已经不适⽤了。
诶那么有没有⼀种适⽤于微服务的安全框架呢?当然就是SpringSecurityOauth2了。
有的⼩伙伴⼀看,这不还是SpringSecurity嘛,后⾯加了⼀个Oauth2后缀,啥是Oauth2啊?别急,我们先来看看Oauth2的概念Oauth2的概念先说OAuth,OAuth是Open Authorization的简写。
OAuth协议为⽤户资源的授权提供了⼀个安全的、开放⽽⼜简易的标准。
与以往的授权⽅式不同之处是OAuth的授权不会使第三⽅触及到⽤户的帐号信息(如⽤户名与密码),即第三⽅⽆需使⽤⽤户的⽤户名与密码就可以申请获得该⽤户资源的授权,因此OAuth是安全的。
OAuth2.0是OAuth协议的延续版本,但不向前兼容(即完全废⽌了OAuth1.0)。
使⽤场景假设,A⽹站是⼀个打印照⽚的⽹站,B⽹站是⼀个存储照⽚的⽹站,⼆者原本毫⽆关联。
如果⼀个⽤户想使⽤A⽹站打印⾃⼰存储在B⽹站的照⽚,那么A⽹站就需要使⽤B⽹站的照⽚资源才⾏。
按照传统的思考模式,我们需要A⽹站具有登录B⽹站的⽤户名和密码才⾏,但是,现在有了OAuth2,只需要A⽹站获取到使⽤B⽹站照⽚资源的⼀个通⾏令牌即可!这个令牌⽆需具备操作B⽹站所有资源的权限,也⽆需永久有效,只要满⾜A⽹站打印照⽚需求即可。
这么听来,是不是有点像单点登录?NONONO!千万不要混淆概念!单点登录是⽤户⼀次登录,⾃⼰可以操作其他关联的服务资源。
OAuth2则是⽤户给⼀个系统授权,可以直接操作其他系统资源的⼀种⽅式。
但SpringSecurity的OAuth2也是可以实现单点登录的!总结⼀句:SpringSecurity的OAuth2可以做服务之间资源共享,也可以实现单点登录!⾓⾊说明应⽤(客户端):客户端就是⼀个要访问⽤户账号的应⽤,需要得到⽤户的允许后才可以得到授权API服务(资源服务):资源服务通常提供API⽤于访问⽤户的授权客户端访问的信息授权服务:让⽤户批准或拒绝请求的服务,严格来说,认证不属于这个服务的职责,虽然往往认证和授权都在⼀个服务。
详解Springbatch⼊门学习教程(附源码)Spring batch 是⼀个开源的批处理框架.执⾏⼀系列的任务. 在 spring batch 中⼀个job 是由许多 step 组成的。
⽽每⼀个 step ⼜是由 READ-PROCESS-WRITE task或者单个 task 组成。
1. "READ-PROCESS-WRITE" 处理,根据字⾯意思理解就可以:1. READ 就是从资源⽂件⾥⾯读取数据,⽐如从xml⽂件,csv⽂件,数据库中读取数据.2. PROCESS 就是处理读取的数据3. WRITE 就是将处理过的数据写⼊到其他资源⽂件中去,可以是XML,CSV,或者数据库.⽐如:从CSV⽂件中读取数据,经过处理之后,保存到数据库. spring batch 提供了很多类去处理这⽅⾯的东西。
2.单个task, 也就是处理单个任务。
⽐如在⼀个step 开始之前或者完成之后清除资源⽂件等.3.许多个step 组成在⼀起,就组成了⼀个job. 所以他们之间的关系,就如同下⾯的描述:⼀个 job = 很多steps⼀个step = ⼀个READ-PROCESS-WRITE 或者⼀个task.同样⼀个job = step1 -->step2--step3 这样链表形式的组成.Spring batch 例⼦考虑如下⼀个批处理的例⼦,看起来有点啰嗦,只是为了说明⽤途:1. step1 : 从 A ⽂件夹中读取csv ⽂件,处理之后,写⼊到B⽂件夹中(READ-PROCESS-WRITE)2. step2 : 从 B ⽂件夹中读取CSV⽂件,处理之后,存储到数据库中(READ-PROCESS-WRITE).3. step3 : 删除B⽂件夹下的CSV⽂件。
(⽤到单个task)4. step4 : 从数据库读取数据,处理之后,⽣成XML报表⽂件(READ-PROCESS-WRITE).5. step5 : 读取XML报表,并发送EMAIL给管理员(⽤到单个task)⽤spring batch 我们可以如下定义这个job:<job id="abcJob" xmlns="/schema/batch"><step id="step1" next="step2"><tasklet><chunk reader="cvsItemReader" writer="cvsItemWriter"processor="itemProcesser" commit-interval="1" /></tasklet></step><step id="step2" next="step3"><tasklet><chunk reader="cvsItemReader" writer="databaseItemWriter"processor="itemProcesser" commit-interval="1" /></tasklet></step><step id="step3" next="step4"><tasklet ref="fileDeletingTasklet" /></step><step id="step4" next="step5"><tasklet><chunk reader="databaseItemReader" writer="xmlItemWriter"processor="itemProcesser" commit-interval="1" /></tasklet></step><step id="step5"><tasklet ref="sendingEmailTasklet" /></step></job>整个 job 的执⾏是存储在数据库中的,所以即使是某⼀个step出错失败,也不需要全部从头开始执⾏这个job.下⾯是⼀个真正的⼊门教程例⼦.采⽤ jar包如下:spring-batch-2.2.3 以上版本,但是我在2.2.3版本中发现 org/springframework/batch/core/schema-mysql.sql ⾥⾯的的mysql 创建表的语句是有问题的,也就是少了“," 号导致的问题( NOT NULL, 后⾯⼏个创建表的语句NOT NULL 后⾯少了逗号),当然你可以⾃⼰修改后再执⾏,执⾏完毕后有如下⼏个表:xstream-1.3.jar 必须的。
SpringSpring Framework是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,它提供了一个简易的开发方式,这种开发方式,将避免那些可能致使底层代码变得繁杂混乱的大量的属性文件和帮助类。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
一、特性Spring 中包含的关键特性:∙强大的基于JavaBeans 的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。
∙一个可用于从applet 到Java EE 等不同运行环境的核心Bean 工厂。
∙数据库事务的一般化抽象层,允许宣告式(Declarative)事务管理器,简化事务的划分使之与底层无关。
∙内建的针对JTA 和单个JDBC 数据源的一般化策略,使Spring 的事务支持不要求Java EE 环境,这与一般的JTA 或者EJB CMT 相反。
∙JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码), 简化了错误处理, 大大减少了程序员的编码量. 再次利用JDBC时,你无需再写出另一个'终止' (finally) 模块. 并且面向JDBC的异常与Spring 通用数据访问对象(Data Access Object) 异常等级相一致.∙以资源容器,DAO 实现和事务策略等形式与Hibernate,JDO 和iBATIS SQL Maps 集成。
利用众多的翻转控制方便特性来全面支持, 解决了许多典型的Hibernate集成问题. 所有这些全部遵从Spring通用事务处理和通用数据访问对象异常等级规范.∙灵活的基于核心Spring 功能的MVC 网页应用程序框架。
开发者通过策略接口将拥有对该框架的高度控制,因而该框架将适应于多种呈现(View)技术,例如JSP,FreeMarker,Velocity,Tiles,iText 以及POI。
在Spring中,两个最基本最重要的包是org.springframework.beans和org.springframework.context. 这两个包中的代码为Spring的反向控制特性(也叫作依赖注射)提供了基础。
BeanFactory提供了一种先进的配置机制来管理任何种类bean(对象),这种配置机制考虑到任何一种可能的存储方式。
ApplicationContext建立在BeanFactory之上,并增加了其他的功能,比如更容易同Spring AOP特性整合,消息资源处理(用于国际化),事件传递,以声明的方式创建ApplicationContext,可选的父上下文和与应用层相关的上下文(比如WebApplicationContext),以及其他方面的增强。
简而言之,BeanFactory提供了配置框架和基本的功能,而ApplicationContext为它增加了更强的功能,这些功能中的一些或许更加接近J2EE并且围绕企业级应用。
一般来说,ApplicationContext是BeanFactory的完全超集,任何BeanFactory功能和行为的描述也同样被认为适用于ApplicationContext用户有时不能确定BeanFactory和ApplicationContext中哪一个在特定场合下更适合。
通常大部分在J2EE环境的应用中,最好选择使用ApplicationContext,因为它不仅提供了BeanFactory所有的特性以及它自己附加的特性,而且还提供以声明的方式使用一些功能,这通常是令人满意的。
BeanFactory主要是在非常关注内存使用的情况下(比如在一个每kb都要计算的applet中)使用,而且你也不需要用到ApplicationContext的所有特性。
这一章粗略地分为两部分,第一部分包括对BeanFactory和ApplicationContext都适用的一些基本原则。
实验4 Spring开发基础一、实验目的1.掌握Spring框架的概念、特点及结构。
2.学会利用MyEclipse开发Spring的过程和方法。
3.熟悉applicationContext.xml配置bean的方法。
4.掌握Spring框架的核心技术IoC(DI)、AOP。
二、实验步骤1.运行MyEclipse建立Web Project(File→New→Web Project),项目名称为ex1,如下图所示,单击Finish按钮完成项目创建。
2.右击项目名ex1,在快捷菜单中选择MyEclipse→Project Facets→InstallSpring Facet,单击Finish按钮,完成配置。
3.通过这些步骤,项目中增加了Spring 3.1.1库,项目src文件夹下添加了applicationContext.xml的配置文件。
请查看这些改变。
4.在项目的src文件夹下面建立test包,在该包下面建立Person接口,内含go方法,再建立类Student和Teacher,分别实现Person接口,代码如下:5.在applicationContext.xml中添加如下两个bean的定义:6.在包test中建立Test类,从应用程序上下文中获得对象,并调用对象方法,其中main方法的代码如下:7.运行主类Test,观察并分析运行结果。
8.通过Set方法注入依赖。
修改Student类和Teacher类,分别在其中添加私有字符串属性name和set、get方法(设置姓名,自动生成set、get方法),Teacher 类可以不要getName方法,修改go方法,在输出原有字符串前增加name的输出,代码如下:9.修改applicationContext.xml中的两个bean元素,设置name属性值,修改如下:10.再次运行主类Test,观察并分析运行结果。
11.引用其他bean,在Spring容器中将bean注入需要调用的实例。
一-spring框架学习(一) 1,什么是spring框架 spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。 2,架构概述
1)IoC(Inversion of Control)控制反转,对象创建责任的反转,在spring中BeanFacotory是IoC容器的核心接口,负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。XmlBeanFacotory实现BeanFactory接口,通过获取xml配置文件数据,组成应用对象及对象间的依赖关系。 spring中有三种注入方式,一种是set注入,一种是接口注入,另一种是构造方法注入。 2)AOP面向切面编程 aop就是纵向的编程,如下图所示,业务1和业务2都需要一个共同的操作,与其往每个业务中都添加同样的代码,不如写一遍代码,让两个业务共同使用这段代码。 spring中面向切面变成的实现有两种方式,一种是动态代理,一种是CGLIB,动态代理必须要提供接口,而CGLIB实现是有继承。
3,为什么使用spring框架 在不使用spring框架之前,我们的service层中要使用dao层的对象,不得不在service层中new一个对象。如下: [java] view plaincopyprint? 1. //dao层对象 2. public class UserDao{ 3. publicvoid insert(User user){} 4. } 5. 6. //service层对象 7. public classUserService{ 8. publicvoid insert(User user){ 9. UserDaouserdao = new UserDao(); 10. userdao.insert(user); 11. } 12. }
存在的问题:层与层之间的依赖。 使用框架后: [java] view plaincopyprint? 1. //dao层对象 2. public class UserDao{ 3. publicvoid insert(User user){} 4. } 5. 6. //service层对象 7. public classUserService{ 8. privateUserDao userdao; 9. 10. publicUserDao getUserdao() { 11. returnuserdao; 12. } 13. publicvoid setUserdao(UserDao userdao) { 14. this.userdao= userdao; 15. } 16. 17. publicvoid insert(User user){ 18. userdao.insert(user); 19. } 20. 21. }
service层要用dao层对象需要配置到xml配置文件中,至于对象是怎么创建的,关系是怎么组合的都交给了spring框架去实现。
4,框架优点 轻量级的容器框架没有侵入性 使用IoC容器更加容易组合对象直接间关系,面向接口编程,降低耦合 Aop可以更加容易的进行功能扩展,遵循ocp开发原则 创建对象默认是单例的,不需要再使用单例模式进行处理
5,缺点:业务功能依赖spring特有的功能,依赖与spring环境。
二-spring框架学习(二)依赖注入
spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入。接口注入不作要求,下面介绍前两种方式。 1,set注入 采用属性的set方法进行初始化,就成为set注入。 1)给普通字符类型赋值。 [java] view plaincopyprint? 1. public class User{ 2. privateString username; 3. 4. publicString getUsername() { 5. returnusername; 6. } 7. publicvoid setUsername(String username) { 8. this.username= username; 9. } 10. }
我们只需要提供属性的set方法,然后去属性文件中去配置好让框架能够找到applicationContext.xml文件的beans标签。标签beans中添加bean标签, 指定id,class值,id值不做要求,class值为对象所在的完整路径。bean标签再添加
property 标签,要求,name值与User类中对应的属性名称一致。value值就是我们要给User类中的username属性赋的值。 [html] view plaincopyprint? 1. 2. 3.
2)给对象赋值 同样提供对象的set方法 [java] view plaincopyprint? 1. public class User{ 2. private UserService userservice; 3. public UserServicegetUserservice() { 4. returnuser; 5. } 6. public void setUserservice(UserService userservice){ 7. this.userservice= userservice; 8. } 9. }
配置文件中要增加UserService的bean标签声明及User对象对UserService引用。 [html] view plaincopyprint? 1. 2. 3. 4. 5. 6. 这样配置,框架就会将UserService对象注入到User类中。
3)给list集合赋值 同样提供set方法 [java] view plaincopyprint? 1. public class User{ 2. privateList username; 3. publicList getUsername() { 4. returnusername; 5. } 6. publicvoid setUsername(List username) { 7. this.username= username; 8. } 9. }
[html] view plaincopyprint? 1. 2. 3. 4. zhang,san 5. lisi 6. wangwu 7. 8. 9.
4)给属性文件中的字段赋值 [java] view plaincopyprint? 1. public class User{ 2. privateProperties props ; 3. publicProperties getProps() { 4. returnprops; 5. } 6. publicvoid setProps(Properties props) { 7. this.props= props; 8. } 9. }
[html] view plaincopyprint? 1. 2. 3. 4. jdbc:oracle:thin:@localhost:orl 5. oracle.jdbc.driver.OracleDriver 6. scott 7. tiger 8. 9. 10.
标签中的key值是.properties属性文件中的名称 注意: 无论给什么赋值,配置文件中标签的name属性值一定是和对象中名称一致。 2构造方法注入 1)构造方法一个参数
[java] view plaincopyprint?