资源描述
Spring是一个轻量级的容器。Spring还有自己的MVC模式,有自己的框架、拦截器等,Spring的框架不只是依赖于Spring,可以和其他框架无缝的结合使用。如:Struts/Struts2+Hibernate/Ibatis+Spring。Spring其实真的很强大!!!
Spring的核心:IOC(控制反转)和AOP(面向切面编程)。
IOC(控制反转):也叫DI(依赖注入)。对象和对象之间的关系不再由JVM(java虚拟机)来管理,而是都交给Spring管理,这就叫控制反转。需要用DI(依赖注入)来实现,即把类和类的关系配置到Spring的配置文件——applicationContext.xml,这些类在容器初始化的时候就创建完成,每次用的时候容器直接提供,而不是像以前需要自己创建(new)。Spring实现控制反转利用了java的反射机制。使用控制反转机制可以提高代码的复用,提高代码运行的效率,降低了代码之间的耦合度。如何理解降低了代码之间的耦合度呢?即:实现依赖于抽象,而不是抽象依赖于实现。通过对外提供统一的接口,把接口的实现注入到容器,每次调用的是接口而不是接口的实现,这样每次业务逻辑有改动的时候就不需要去修改大量的业务代码而只是修改一下配置文件就可以了;如何理解提高了代码的复用呢?即:在一个项目中有可能多次用到同一个方法,那么只需要把此方法声明成一个接口,再实现这个接口,把接口的实现注入到容器,每次用的时候从容其中取就行了;提高了代码的运行效率就更好理解了,即:每次用到的对象直接从容器中取,而不是再自己创建(new是很消耗系统内存的),自然就提高了运行效率。
AOP(面向切面编程):这是一种思想,而不是一种方法的实现。利用JDK的动态代理的方式统一的给程序添加某一方法(如:事务的管理,权限的管理,日志的管理)。使用AOP不仅提高了代码的复用,也降低了代码之间的耦合度。
Spring的MVC:即Model(模型层)+View(视图层)+Controller(控制层)。Controller的核心其实是个Servlet(DispatcherServlet),又叫前端控制器,用来拦截用户的请求,只要是符合的请求(需要在web.xml文件里配置,如:*.do)都会被拦截,然后交给org.springframework.web.servlet.handler.SimpleUrlHandlerMapping处理,SimpleUrlHandlerMapping根据映射找到相关的类,就把请求交给这个类(后端控制器)处理,这个类会返回一个ModelAndView对象,交给org.springframework.web.servlet.view.InternalResourceViewResolver处理视图,最后返回给用户。具体的文件配置和实例查看其它资料,这里只说原理。
Spring的拦截器:可以自己定义拦截器,需要继承HandlerInterceptorAdapter,重写三个方法,即preHandle(),postHandle(),afterCompletion();
发起请求,进入拦截器链,运行所有拦截器的preHandle方法,
1.当preHandle方法返回false时,从当前拦截器往回执行所有拦截器的afterCompletion方法,再退出拦截器链。
2.当preHandle方法全为true时,执行下一个拦截器,直到所有拦截器执行完。再运行被拦截的Controller。然后进入拦截器链,运行所有拦截器的postHandle方法,完后从最后一个拦截器往回执行所有拦截器的afterCompletion方法.
当有拦截器抛出异常时,会从当前拦截器往回执行所有拦截器的afterCompletion方法。
Spring的注入方式:Set注入(比较常用)和构造注入(<constructor-arg index="" value=""><constructor-arg/>index是构造方法的参数的索引,从0开始;value是参数的值)
Spring中Bean的生命周期:Bean的创建、Bean的初始化、Bean的调用、Bean的销毁。
1、Bean的创建:在配置文件中创建
2、Bean的初始化:三种方法(通过配置文件、实现InitializingBean接口、 @PostConstruct)。
配置文件:要现在类里声明一个方法如init(),然后在配置文件里加上 init-method="init"
实现InitializingBean接口:重写afterPropertiesSet方法
@PostConstruct:这是基于注解的方式,这样的方式可以加在多个方法上,初始 化Bean的时候可以执行多个方法。
3、Bean的调用:就是类的调用,在配置文件里要写类的全路径
4、Bean的销毁: 三种方法(通过配置文件、实现DisposableBean接口、 @PreDestroy)
配置文件:要现在类里声明一个方法如clean(),然后在配置文件里加上 distroy-method="clean"
实现DisposableBean接口:重写distory方法
@PreDestroy:这是基于注解的方式,这样的方式可以加在多个方法上,销毁Bean 的时候可以执行多个方法。
Spring的自动装配(Autowire):共有5种方式。使用Spring的自动装配大大减少了对配置文件的配置工作,程序员开发效率会有所提高,但是降低了类之间的关系的透明性,不利于后期的维护工作,在大中型的项目中不推荐使用Spring的自动装配。
1、 byName:根据属性的名字的方式查找JavaBean并为其注入。如果配置文件里有 两个属性的名字(ID)相同就会抛出不可恢复的异常。
2、 byType:根据属性的类型的方式查找JavaBean并为其注入。如果配置文件里有两 个属性的类型相同就会抛出不可恢复的异常。
3、 construct:根据构造函数的方式查找JavaBean并为其注入。JavaBean必须写构 造函数。构造函数是private的也可以。
4、 Autodetect:集成了byType和construct两种装配方式,而construct的优先级 比较高,即:如果JavaBean中既有set方法也有构造方法,而且在配置文件里选用 autodetect的装配方式,那么Spring会自动选择construct的装配方式。
5、 no:不使用自动装配。默认方式就是no。
6、 default:由<bean>的上级标签<beans>的属性default-autowire决定
Spring的依赖检查(dependency-check):有四种方式。Spring的依赖检查是为自动装配设计的,在使用自动装配的时候,如果有的属性自动装配不成功的话,程序员很难看出错误出现在什么地方,这时候用依赖检查就可以检查出错误。
1、 simple方式:只检查简单的数据类型,如String、int等。
2、 objects方式:只检查对象类型。
3、 all方式:检查所有的数据类型。
4、 none:不进行依赖检查,Spring默认的就是这种方式。
Spring的注解:有越来越流行的趋势,不用在代码和配置文件之间来回切换,减少了配置文件的配置工作量,提高了开发效率。
需要在配置文件(applicationContext.xml)中加上<context:component-scan="基本包名"></context:component-scan>,加上这一句就不用加<context:annotation-config></context:annotation-config>了,当然,加上也不会报错,只是没有必要而已。
在引用的属性(对象的实例)上面加上@Resource(name="属性名"),在类名上加上@Component("bean的id")。@Component、@Controller、@Respository、@Service功能一样,但是在分层的时候最好分开使用,@Controller代表控制层,@Respository代表持久层,@Service代表业务层,@Component在哪都可以用。
展开阅读全文