框架学习系列 之Spring框架学习总结
Posted 琅晓琳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了框架学习系列 之Spring框架学习总结相关的知识,希望对你有一定的参考价值。
1 介绍
学习和使用Spring框架有了一段时间,这里将学习心得总结在博客的文章里面。期间也参考学习了其他优秀的文章,如有错误之处欢迎指正,转载请申明原文地址,希望大家支持,谢谢。
2 What:什么是Spring框架
2.1 Spring叫做SE/EE开发的一站式框架,有每一层的解决方案:
Java SE 是Java平台标准版的简称(Java Platform, Standard Edition),用于开发和部署桌面、服务器以及嵌入设备和实时环境中的Java应用程序。Java SE包括用于开发Java Web服务的类库,同时,Java SE为Java EE提供了基础;
Java EE是一种利用Java2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。
(1) Web层:SpringMVC;
(2) Service层:Spring的Bean管理,Spring声明式事务;
(3) Dao层:Spring的JDBC模板,Spring的ORM模块。
ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。
2.2 几个重要的概念:
(1) IOC控制反转;
将对象的创建权交给Spring;
好的程序设计满足OCP原则,尽量不修改源码的基础上对程序进行拓展;
工厂+反射+配置文件 实现程序的解耦合。
(2) DI依赖注入;
前提需要有IOC环境.Spring管理的这个类,会将类中属性注入进来;
注入方式包括构造方法注入、set方式注入以及接口注入,Spring属性注入支持前两种,如:
//构造方法注入
<bean id = "cat" class = "com.A.Cat">
<constructor-arg name = "name" value = "cookie"/>
<constructor-arg name = "color" value = "white"/>
</bean>
//set方法
<bean id = "cat" class = "com.A.Cat">
<property name = "name" value = "cookie"/>
<property name = "color" value = "white"/>
</bean>
//set注入对象类型
//标签中的id和name配置
// id与name 属性在作用上基本没有区别。推荐使用id;
// id:使用了约束中的唯一约束,不允许出现特殊字符;
// name:name取值比较随意,甚至可以用数字开头。在配置文件中允许出现两个name相同的<bean>,在用getBean()返回实例时,后面一个Bean被返回;
// 如果没有id,name,则用类的全名作为name。
<bean name = "cat2" class = "com.A.Cat2">
<property name = "" ref = ""/>
</bean>
<bean id = "cat" class = "com.A.Cat">
<property name = "cat2" ref = "cat2"/>
</bean>
service层要用dao层对象需要配置到xml配置文件中,对象创建、关系组合都交给spring框架去实现。
(3) Bean的作用范围配置。
scope:Bean作用的范围;
singleton:默认范围,采用单例模式创建这个对象;
prototype:多例模式,通常使用在Struts2和Spring整合时使用;
//绝大多数情况下,使用单例singleton(默认值),但是在与Struts整合时候,务必要用prototype多例,因为struts2在每次请求都会创建一个新的Action。
request:应用在Web项目中,Spring创建类后,将此类存在request范围内;
session:Web环境下,对象与session生命周期一致。
3 Why:为什么使用Spring框架
前面也提到过使用Spring框架的优势,这里补充几点,Spring可以实现更快,更轻松,更安全地编程。 Spring对速度,简单性和生产力的关注使其成为受欢迎的Java EE开发框架。具体来说,主要体现在以下几个方面:
方便解耦,便于开发(Spring就是一个大工厂,可以将所有对象的创建和依赖关系维护都交给spring管理);
spring支持aop编程(spring提供面向切面编程,可以很方便的实现对程序进行权限拦截和运行监控等功能);
Spring注重安全。Spring代码提交者与安全专家合作,修补和测试所有报告的漏洞;
Spring社区支持较好。Spring社区是一个庞大,全球化,多元的社区。
4 How:怎样使用Spring框架
前面也介绍了一些基本用法,包括几种注入方式等,这里补充几点:
(1) 创建一个Spring-maven项目;
按照提示创建好maven项目;
在pom.xml文件导入Spring相关的依赖,如:
spring-core、spring-aop、spring-web、spring-test、spring-context等,这些jar的"groupId"都是"org.springframework",每个jar有一个不同的"artifactId",版本号可以按照项目需要选择;
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
</dependencies>
或者可以将$spring.version定义好,下面直接引用;
<properties>
<spring.version>4.3.12.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>$spring.version</version>
</dependency>
</dependencies>
(2) Spring工厂类;
Spring工厂类在旧版中使用BeanFactory,新版中使用ApplicationContext,而且后者继承了前者;
加载配置文件就会将Spring管理的类实例化,在ApplicationContext中有两个实现类,分别是ClassPathXmlApplicationContext---类路径下面配置文件和FileSystemXmlApplicationContext---加载文件系统下面配置文件。
(3) Spring配置Quartz实现定时调度任务;
首先需要引入spring-quartz这个包;
//任务Task配置
<bean id="importTkbsJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="ImportTkbsData" /> <!-- 执行类的实例 -->
<property name="targetMethod" value="run" /> <!-- 执行方法 -->
<property name="concurrent" value="false" />
<property name="arguments">
<list></list>
</property>
</bean>
//配置定时调度触发器
//quartz的语法
// 格式: [秒] [分] [小时] [日] [月] [周] [年]
// * :表示全部值; ? :表示不指定值; - :表示区间; , :表示指定多个值; / :用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发
// 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
// 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="importTkbsJob" /> <!-- 上面任务的Task配置bean -->
<property name="cronExpression" value="0 15 * * * ?" /> <!-- 触发时机表达式 -->
</bean>
//调度工厂(中心调度器)
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
autowire="no">
<property name="triggers">
<list>
<ref bean="cronTrigger" /> <!-- 上面配置的触发器 -->
</list>
</property>
</bean>
(4) 怎样引入Spring.xml文件以及多个配置文件怎样配置;
单纯的Spring-maven项目代码中直接引入即可,如:
//
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//两个以上可以使用字符串数组
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]"applicationContext.xml","spring.xml");
Web项目中引入Spring.xml配置文件:
web.xml文件中引入:主要的是用来配置欢迎页、servlet、filter、listener等以及定制servlet、JSP、Context初始化参数;
加载顺序:web.xml的加载顺序是:<context-param>-><listener>-><filter>-><servlet>;参考实例为:
//在Idea中看到的src和resource不是classpath, 项目被打成war包后WEB-INF中的classes,lib才是classpath,WEB-INF是资源目录, 客户端不能直接访问,所以我们需要添加classpath访问;
//配置文件放到src/main/resources下面,编译的路径直接位于classes下面,这个路径其实就是classPath的路径,所以在resources 根目录下的配置文件其实就是 classPath的路径;
//ClassPathXmlApplicationContext读取文件只能把文件放到resources配置文件夹下即可读取。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml,classpath:spring.xml</param-value>
</context-param>
(5) AOP介绍。
AOP(Aspect-OrientedProgramming)面向方面编程,即横切面的方法增强;
使用AOP需要用到的包:spring-aop、spring-aspects、 springsource.org.aopalliance、springsource.org.aspectj.weaver等;
常用使用场景:如权限验证、日志记录、性能统计等横向公共部分;
Aspect:横切面的功能,,抽象出类或接口,AOP编程重要的就是识别出横切面功能;
Advice(通知/增强):增强方法的代码、想要的功能;
Pointcut(切入点):目标对象中,已经被增强的方法;
JoinPoint(连接点):目标对象中,所有可以增强的方法,比如设置属性、调用方法等;
Weaving(织入):将通知应用到连接点形成切入点的过程;
Proxy(代理):将通知织入到目标对象之后形成的代理对象;
实例:设置字符编码格式看作是一个Aspect方面,而拦截器就是一个Advice增强
<!-- 字符编码过滤器-->
<filter>
<filter-name>characterFilter</filter-name>
<filter-class>com.bjpowernode.egov.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterFilter</filter-name>
<url-pattern>*.action</url-pattern>>
</filter-mapping>
通知的几种类型:
//aop:before
前置通知———目标方法运行之前调用;
//aop:after
后置通知———目标方法运行之后调用;
//aop:around
环绕通知———目标方法之前和之后都调用;
异常拦截通知———如果出现异常,就会调用。
参考资料:
https://blog.csdn.net/lishuangzhe7047/article/details/20740209 spring框架学习(一)
https://blog.csdn.net/itcats_cn/article/details/81479185?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-81479185-blog-20740209.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-81479185-blog-20740209.pc_relevant_default&utm_relevant_index=2 Spring框架总结【无比详细】
https://www.cnblogs.com/themysteryofhackers/p/12006785.html 如何创建Maven项目和Spring IOC例子
https://blog.csdn.net/happyRX/article/details/88545783 Spring配置Quartz实现定时调度任务
以上是关于框架学习系列 之Spring框架学习总结的主要内容,如果未能解决你的问题,请参考以下文章
Spring框架系列 - 深入浅出Spring核心之面向切面编程(AOP)