框架学习系列 之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:多例模式,通常使用在Struts2Spring整合时使用;
//绝大多数情况下,使用单例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实现定时调度任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值