《Spring》实战——1.Spring核心思想
Spring学习前
Spring是一个开源框架;(更形象的说,是一种思想,核心就是IOC/DI和AOP);
1. 几个概念及简写?
- POJO,Plain Old Java Object,简单老式Java对象;(例如一个具备某种功能的普通的Java类);
- 组件,Component,Spring用JavaBean来表示”组件”,理论上这个bean可以是任意形式的Java类(POJO),不一定非得遵守JavaBean规范;
- DI,Dependency Injection,依赖注入;即将对象(Bean)之间的依赖关系(例如,持有关系)注入,或者叫对象之间的装配/组合;
- AOP,Aspect-Oriented Programming,面向切面编程;即达到方法级别的控制粒度,不需要重写/修改方法,不需要为了实现某个功能去让当前类持有另一个类的对象,去调用这个对象的方法;核心思想是达到代码的最大程度的复用,减少类之间的耦合关系;
- 装配,创建应用组件(Component/Bean)之间协作的行为通常称为装配(wiring);在Spring中可以使用自动装配、XML、注解的方式分别实现装配;(例如,自动装配采用扫描+@Autowired,注意可能存在多个满足类型的bean的情况;在配置bean的xml文件
里面添加其他的bean(通过已声明的bean的id);或在XXConfig.java里面将@bean的方法名(即一个bean)直接作为另一个bean的方法参数传入,达到装配效果;)
2. Spring减少/降低Java开发的复杂性
(1)基于POJO的轻量级和最小侵入性编程;
(2)通过依赖注入和面向接口实现松耦合;
(3)基于切面和惯例进行声明式编程;
(4)通过切面和模板减少样板式代码。
3. Spring中的POJO
使用了Spring的Java代码与没有使用Spring的代码几乎一致,即不会因为使用Spring去强制改变原有的Java代码的编写规范,任何POJO皆可以视为bean/组件;
4. 依赖注入DI
传统注入:如在当前类的构造器内/或init()方法内去new一个依赖的类的对象(为了获得这个对象的某些功能或属性);
耦合的两面性:
(1)耦合太强,当修改一个类,其他用到这个类的对象的地方可能都要修改,维护性差;
(2)不耦合的话,单个类无法实现多样的功能;
DI:让类之间的偶尔交给一个”中间者”;
一种合理的注入依赖的方式:通过构造器传入参数,这个参数类型是一个接口;即所有接口的实现类的对象都可以通过这个构造器传递给当前类的对象;这种方式称为”构造器注入”;
这样的话,当前类就没有和任意的实际的类发生耦合,而是可以灵活的接受任意实现参数接口的实现类对象;
这就是DI所带来的最大收益——松耦合。
如果一个对象只通过接口(而不是具体实现或初始化过程)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。
5. 配置好了xml怎么使用(取出bean)?
对于XML的方式,使用ClassPathXmlApplicationContext作为应用上下文;
6. AOP
DI是为了实现组件间的”松耦合”,AOP是为了把遍布应用各处的功能分离出来形成可重用的组件,如记录日志、安全认证之类的;
这些系统服务(非核心业务,但是又是每个核心业务都会调用的)通常被称为横切关注点(切面),因为它们会跨越系统的多个组件;被包裹的bean的某个具体方法称之为”切点”,即”切面包裹切点”;
这么做的好处是,不需要一个/多个具有”系统”服务的类的对象,而是采用”切面”的方式,将核心业务”包裹起来”;eg:在XML中实现切面
7. 使用模板消除样板式代码
如JDBC的新建Connection、抛异常、释放;采用模板方法设计模式,如JDBCTemplate;
8. IOC容器(容纳bean的容器)
一般使用应用上下文,分别对于XML、注解、Config.java方式;
通过加载配置(自动扫描、注解、或XML)得到IOC容器,再从容器中获取bean;
9.bean的生命周期;
传统的POJO使用new创建,由JVM自动垃圾回收;而Spring的bean的生命周期有IOC容器管理(大致分为:自定义-初始化-销毁);可以在bean的定义的时候加上init-method/destroy-method来告诉容器在新建/销毁bean前后做些什么(可分别通过xml和注解@bean的方式);
eg:详细的bean生命周期
还没有评论,来说两句吧...