Spring框架:
#
Spring介绍(摘自百度百科):
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。(详细有关spring的解释和介绍以及好处作用可见百科)
下面主要是写自己对spring的认识和目前为止对spring的一些掌握。Spring主要核心功能就是IoC、DI、和Aop
主要好处还有轻量,模块化,并且能整合很多主流框架,已经形成了一种框架的规范,大部分框架都能很轻松的和spring进行整合。
Ioc即控制反转:
主要就是在开发过程中,本来类都是由我们来new或者我们自己写工厂类,将一些需要集中管理的放在工厂类中,然后在需要的时候通过多态或者其他手段进行调用,有时候我们会需要用到单例类的时候,还需要再写单例代码,而spring的ioc就将这些工作全都实现了,将所有的类都以bean的形式放在配置文件中,很好的实现了类与类之间的解耦,并且类的加载顺序、单例多例也可以很轻松的通过配置来实现。
DI即依赖注入:
主要和控制反转相互呼应,很多时候我们都把控制反转和依赖注入当作一样的存在,因为可以通过控制反转的时候给bean注入属性,他们两个是可以密切放在一起的,例如
<bean id='person' class='com.xxxx.xxx.Person'>
<property name="name" value="张三" />
</bean>
这样写就是将person类交给spring容器管理,并将person类的name属性赋予张三这个值,这样就实现了控制反转并实现了依赖注入,怎么样,是不是很简单。
但其实我感觉两者还是有区别的,控制反转是将bean托管给spring容器,而依赖注入主要功能其实是在bean中注入bean的依赖,比如用的最多的就是在service中注入mapper(Dao),就能直接在业务层中轻松的调用数据持久层进行crud的操作。在controller层中轻松的调用业务层进行对不同业务的处理和对view做交互。
Aop即面向切面:
面向切面也是一种开发思想,和面向对象、面向过程一样,是一种思想,在实际开发中,我们经常会用到日志记录,或者事务操作,这些操作都有一个共性就是如果在方法内写这种功能的话,就不能准确的记录到该方法的调用时机或者说在方法内开始事务不能保证操作的原子性,并且这种做法是属于侵入式的,增加了业务功能和系统功能耦合性。所以这时候就有了面向切面的一种开发思想,即在方法开始前切入,方法结束后切出。这样就完成了业务和系统的解耦。
使用spring框架首先要引入spring的核心jar包,如果不知道要引入哪些jar的话,可以先将自己需要的版本下载好,然后将该版本所有的Jar引入到工程里,一般spring框架的jar数量在18个左右。下面放出spring jar包的下载地址,
http://repo.spring.io/release/org/springframework/spring/
还有一种方法就是先添加core和context以及自己感觉需要的Jar,然后直接开始写配置文件,看运行的时候报错需要什么再加入什么,因为spring是组件式的框架,所以不是所有jar包都有依赖的。
Jar包引入好之后就可以开始写配置文件,新建xml文件,具体xml如何写可以看下载下来的spring官方demo页里有详细的说明,一般存放位置为
Spring-framework-4.3.5.RELEASE-dist\spring-framework-4.3.5.RELEASE\docs\spring-framework-reference\htmlsingle\index.html
打开该index.html 查找<beans 就能定位到xml配置的demo
好了 到这里spring的最简单的demo就可以实现了,我们可以新建一个类,然后写上类的属性和get set方法。之后就在xml中写上该类的bean。
比如目前有一个person类
这里直接写上复杂属性,复杂属性也是可以注入值的 。
那么xml中就可以这样写
其中要注意的就是复杂属性的注入方法 。这里要注意的是,在spring中依赖注入使用的是属性名相同的set方法实现的,具体底层实现就是利用了java的反射,反射到类名的属性名 就能动态的得到该属性的set方法,这也就进一步让我们知道代码规范的重要性。
好了 然后可以看一下面向切面,这里可以写一个模拟log类,
然后将该类在spring中托管写上bean
然后开始写aop配置,具体配置如下:
配置的意思是这样的,config是配置根节点,当中跟上aspect节点,用来标识切入类,这里是模拟日志类,在切入类中协商pointcut,就是需要被切入的类,表达式expression中是一个规范,execution()括号中的意思就是第一个*表示接受任意返回值,空格跟上被切入的类所在的包*.*是包下所有包所有类(..)表示所有方法。
然后before和after中的method是日志类中的方法名。
在切入事务前,肯定是要增加jdbc支持,原因就不多说了,只有做crud操作,事务操作才有实质作用,这里贴上spring对jdbc的配置支持:
这里是配置了jdbc数据源,用的是apache的dbcp数据源。
Destroy-method close的意思是连接用完的时候 ,放回连接池。
然后我们可以和切日志一样的方法来切入事务:
这里的aop:和tx: 在使用前需要引入对应的命名空间,这里还是同开始讲的一样,在官方的xml中可以检索一下 然后copy过来 这个没必要背下来。
然后spring还提供了注解的支持,这样就可以用注解的方式加上事务,
然后只要在service的实现类中加上@Transactional注解就可以了。