spring 的优势
方便解耦,简化开发
- 通过 Spring 提供的 IoC 容器,可以将对象间的依赖关系交由 Spring
进行控制,避免硬编码所造成的过度程序耦合。用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
AOP 编程的支持
- 通过 Spring 的 AOP 功能,方便进行面向切面的编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松应付。
声明式事务的支持
- 可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务的管理,提高开发效率和质量。方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
方便集成各种优秀框架
- Spring
可以降低各种框架的使用难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。
降低 JavaEE API 的使用难度
- Spring 对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些 API 的
使用难度大为降低。 Java 源码是经典学习范例 Spring 的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对 Java
设计模式灵活运用以 及对 Java 技术的高深造诣。它的源代码无意是 Java 技术的最佳实践的范例。
IOC (设计思想 主要限制new使用 降低耦合 提高类的重用性)
- 设计思想历程:
- —new魔咒导致 >>暴露接口子类>>产生耦合
- —采用工厂模式 >>解决调用者和具体子类的耦合
- —反射机制
ClassLoader.loadClass
传人“包 类名称”通过工厂获取实例对象>>降低耦合
Spring IOC 容器使用ClassLoader.loadClass
不使用Class.forName
我个人猜测, 应该和 Spring IoC 的 Lazy loading 有关, Spring IoC 为了加快初始化速度, 因此大量使用了延时加载技术. 而使用 classloader 不需要执行类中的初始化代码, 可以加快加载速度, 把类的初始化工作留到实际使用到这个类的时候.
存在问题:
- 需要配置文件 获取对应包类名称 调用反射
- 配置文件应该包含依赖关系配置
- 应该合理配置多线程管理,避免过多重复对象产生
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Bean 容器
-
配置文件 引用关系处理 —使用P命名空间—集合 参数 构造方法注入等
-
自动匹配(
@Resource
) -
-
Bean实例化管理 单例配置
-
Spring容器启动时可以自动实现Bean的实例化处理—饿汉式单例设计
-
延迟进行初始化—懒汉加载 LayLoading
-
初始化与销毁 销毁由容器自动完成
-
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Annotation 配置
- Context 扫描配置
<context:component-scan base-package=”包名”/>
@Repository
数据层注解@Service
业务层注解@Controller
控制层注解@Component
定义组件@Resource=@Autowired+@Qualifier
自动注入—自动匹配Bean容器
@Resource
可直接通过name 属性设置bean名称
- 四个注解功能相同,区别只是为了描述的准确性
总结:
Spring所有被管理的程序都要通过配置文件或注解进行定义,默认情况随着容器启动而启动
Spring 可以直接通过配置文件实现Bean的依赖关系管理,也可以利用类名或名称实现自动关联配置
Spring支持自动扫描配置,context配置要扫描的包或类
资源注入可以使用@Resource
或@Autowired
注解实现
Spring资源管理
-
Resource
接口InputStreamSource
的子接口—所有资源由Resource接口对象负责读取 -
ResourceLoader
接口----解耦合—
提供两个方法:
Public classloader getClassloader();
获取类加载器
Public Resource getResource(String location);
根据指定路径返回Resource接口实例 -
利用配置文件实现的资源访问配置,实际上就是对ResourceLoader接口功能的包装
-
Spring支持Ant路径匹配模式,如:? 可以匹配任意字符,* 匹配零个,一个,多个字符,如果进行目录匹配,可以使用“**”
Spring表达式
- SpEL表达式语言
ExpressionParser
表达式解析器(spring源码中经常遇到)Expression
表达式执行类—最终计算结果EvaluationContext
表达式计算
SpringTask 任务调度
AOP切面编程
本身是代理功能的增强
-
Aop主要用于横切关注点分离和织入。
-
关注点:如何东西,如业务接口,支付处理,消息发送处理
-
关注点分离:将业务处理拆分成一个个不可拆分的独立组件
-
横切关注点:实现代理功能 ,利用代理功能可以将辅助操作在多个关注点上执行,横切点可能包括事务处理,日志记录,性能统计等;
-
织入:将横切点分离后,可能需要确定关注点的执行位置,可能在业务方法调用前,也可能是调用后,或者产生异常时。
-
-
基于Annotation 的Aop配置–
@Around
@Before
@AfterThrowing
@AfterReturning
@After
注解 -
AOP实现与代理模式相比 ,最大特点在于可以通过切入点表达式进行代码整合
-
Aop通知分三类 : 前置通知,后置通知和环绕通知,其中环绕通知可以实现全部的切面控制。
Spring与其他组件整合
待更新:
消息组件:JMS,ActiveMQ
NOSQL:Redis
JDBC
SpringDataJPA,Mybatis,SpringMvc