Spring 学习笔记(1)之我们为什么要用Spring
按照WWW方式来学习,那么显然我们首先要提问,spring是什么,但是这个我觉得并不关键,你想知道自己百度即可。我们直接来谈谈,为什么是spring。
根据Spring著名的书籍《Spring实战第四版》,是这么说的。
- 基于POJO的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 通过切面和惯例进行声明式编程
- 通过切面和模板减少样板式代码
其中POJO就是普通Java beans的意思
那么我们也许不能立刻全部理解,但我们可以首先说一说什么是耦合
耦合
在软件工程中,耦合指的就是就是对象之间的依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个准则就是高内聚低耦合
换句话说,如果耦合度过高,程序将受到很大的制约。
public class AccountServiceImpl implements IAccountService { private IAccountDao accountDao = new AccountDaoImpl(); } 上面的代码表示: 业务层调用持久层,并且此时业务层在依赖持久层的接口和实现类。如果此时没有持久层实现类,编译 将不能通过。这种编译期依赖关系,应该在我们开发中杜绝。我们需要优化代码解决。
如何去降低这种耦合呢,那么我们就需要用到控制反转的知识了。
那么我们把视线拉回到,使用new语句新建对象,发生了什么:
那么显而易见,首先的类加载检查,就过不去。
我们选择将创建新对象的权力外包给框架,这就是所谓控制反转(Inversion of Control,IOC)。
那么承接这种权力的工厂就是Java BeanFactory和它的子类ApplicationContext。
我们常用的是Application也就是应用上下文接口。
它有如下三种实现方式:
1、ClassPathXmlApplicationContext:
它是从类的根路径下加载配置文件 推荐使用这种
2、FileSystemXmlApplicationContext:
它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
3、AnnotationConfigApplicationContext:
当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
当系统创建ApplicationContext容器时,默认会预初始化所有singleton Bean (prototype类型Bean当需要的时候才会创建)。
那么究竟有哪几种Bean呢?
- singleton :默认值,单例的。
- prototype :多例的。
- request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中。
- session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中。
- global session :WEB 项目中,应用在 Portlet 环境.如果没有 Portlet 环境,那么globalSession 相当于 session。
那么有哪几种不同的创建Bean的方法呢?
1、调用无参数构造函数创建Bean。
2、spring 管理静态工厂-使用静态工厂的方法创建对象。也就是声明一个静态工厂,使用工厂里的方法来创建Bean。
3、spring 管理实例工厂-使用实例工厂的方法创建对象。与上一个的区别在于,这种方式需要把工厂先创建出来。
接下来是最关键的依赖注入部分,我们该如何使用工厂的车间为自己加工货物呢,这就是依赖注入的原理了。
我们可以使用Spring对Bean中的类进行各种属性的传入。有构造函数注入的方法,有set的方法,有p命名空间等方法。