为何使用Spring
Spring的核心是IOC(控制反转)和AOP(切面编程)。
谈谈IOC 从之前new对象到现在的使用spring的工厂模式管理对象。
通过Spring可以把整个系统分成不同的模块,不同的类。
通过spring来管理整个项目中不同的类,给这些类附加功能,把功能进行分类,进行解耦合,比如service要使用mapper的对象,可以在配置文件中给mapper对象赋值,当然这个时候mapper可以换换为别的值,此时他们的联系是比较松散的,可以在配置文件中设置这个对象到底是谁,我们项目中使用比较多的是使用注解开发,bytype、byname。又比如说service中使用mapper的对象,controller中使用service的对象,他们都是可以动态赋值的。我们在配置文件中或者使用注解方式来给他们赋值,这样他们的对象就比较灵活了,在修改上就比较方便了。不像不使用spring的时候,不像用goodsservice,想换个service,必须要改动源码才能实现,用spring的时候就可以使用这种解耦合的方式,让对象之间的依赖关系变的很松散。
像AOP主要解决的是业务功能和非业务功能的分离(如事务日志),把业务功能和非业务功能进行独立的开发。这样每个功能都比较专注,业务功能只专注业务,日志事务会有专门的人来做。通过AOP的动态代理技术,可以让业务方法在执行过程中,去加入我们所希望的日志和事务进行单独的管理。在其他地方用的也很多,像过滤器,也是用的AOP的这种思想,在所有业务方法之前,可以通过过滤器来做一些验证功能啊,做一些设置啊。在我们项目中我们用AOP做事务的比较多,在事务方面我们采用的是在配置文件中采用的声明事务,在配置文件中配置事务管理器,配置AOP的切面完成事务的处理功能说白了,修改代码越少,功能越强,在代码中就会节约很多的人力物力,在项目扩展增加新的模块就比较容易一些。在管理对象,解耦合,通过AOP可以让spring创建对象,spring创建的对象是可以给对象添加功能的,比如给对象创建代理,做事务,这些都是通过spring来实现的。
容器中 Bean的作用域
当通过 Spring 容器创建一个 Bean 实例时,不仅可以完成 Bean 的实例化,还可以通过
scope 属性,为 Bean 指定特定的作用域。Spring 支持 5 种作用域。
(1) singleton: 单态模式。即在整个 Spring 容器中,使用 singleton 定义的 Bean 将是单例的,
只有一个实例。默认为单态的。
(2)prototype:原型模式。即每次使用 getBean 方法获取的同一个<bean />的实例都是一个
新的实例。
(3)request:对于每次 HTTP 请求,都将会产生一个不同的 Bean 实例。
(4)session:对于每个不同的 HTTP session,都将产生一个不同的 Bean 实例。
注意:
(1)对于 scope 的值 request、 session 只有在 Web 应用中使用 Spring 时,该作用域才有效。
(2)对于 scope 为 singleton 的单例模式,该 Bean 是在容器被创建时即被装配好了。
(3)对于 scope 为 prototype 的原型模式,Bean 实例是在代码中使用该 Bean 实例时才进行
装配的。