前言
之所以写Java杂谈就是想通过博客记录自己的学习的感悟和自己的理解,今天谈谈Spring 的 IOC和AOP
一、Spring是什么?
Spring是一种轻量级框架,可以说Java EE的春天,是当前主流框架,它可以使现有技术更加易用,推进编码最佳实践。
它的设计理念是面向Bean的编程。
二、Spring的优点
1、低侵入式设计
2、独立于各种应用服务器
3、依赖注入特性将组件关系透明化,降低了耦合度
4、面向切面编程特性允许将通用任务集中式处理
5、与第三方框架的良好整合
三、Spring两大核心技术
控制反转(IoC)/依赖注入(DI)
Ioc:
Ioc(Inversion of Control )又称控制反转,它是一种设计思想,使用Ioc就相当于你将设计好的对象交给容器控制,并不是面向对象的在对象内部控制。
控制:
传统的程序设计都是在内部直接new进行创建,也就是程序自己创建了对象,这里是程序控制的对象;Ioc是由专门一个容器(Ioc容器)来创建这些对象,这里是Ioc容器控制对象的创建;
可以理解为Ioc使用了Java的23种设计模式的工厂模式,当然Ioc除了控制对象更主要的控制外部资源的获取像文件、常量数据等
反转:
传统的程序是我没自己主动控制去直接获取依赖对象,这里的对象是主动接收依赖,这个可以理解为正转;
Ioc中的反转就是Ioc容器查找及注入对象,这里的对象是被动的接受依赖对象,这就是反转;
通俗的来讲,控制反转使用后不再自己创建对象
DI:
Dependency Injection就是依赖注入的意思,就是理解为容器将某一个依赖关系(日志功能、异常处理功能)注入到一个类似于积木的组件里,这样容器就可以简单灵活的拼接组合这些依赖关系,像搭建乐高积木一样,可以变换成很多功能。
这样做,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
面向切面编程(AOP)
了解AOP首先我们从一段代码入手
代码如下(示例):
public class UserServiceImpl implements UserService {
private static final Logger log = Logger.getLogger(UserServiceImpl.class);
public boolean addNewUser(User user) {
log.info(“添加用户 ” + user.getUsername());//记录日志
SqlSession sqlSession = null;
boolean flag = false;
//异常处理
try {
sqlSession = MyBatisUtil.createSqlSession();
if (sqlSession.getMapper(UserMapper.class).add(user) > 0)
flag = true;
sqlSession.commit(); //事务控制
} catch (Exception e) {
log.error("添加用户 " + user.getUsername() + "失败", e); //记录日志
sqlSession.rollback(); //事务控制
flag = false;
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
return flag;
}
}
这里的业务代码如下(示例):
sqlSession = MyBatisUtil.createSqlSession();
if (sqlSession.getMapper(UserMapper.class).add(user) > 0)
flag = true;
大家也发现了我们构建系统的目的是解决业务问题,现在却要维护多个方面的事情(日志、事务、异常处理)。有些喧宾夺主的感觉,这时候大家就可以用AOP解决代码复用,让我们专心写业务。
AOP的原理
将复杂的需求分解出不同方面,将散布在系统中的公共功能集中解决;
采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增加新的功能
所谓面向切面编程,就是一种通过预编译和运行期动态代理的方式实现在不修改源代码的情况下给程序动态添加功能的技术
AOP相关术语
- 增强处理(Advice)
- 前置增强
- 后置增强
- 环绕增强、异常抛出增强、最终增强等类型
- 切入点(Pointcut)
- 连接点(Join Point)
- 切面(Aspect)
- 目标对象(Target object)
- AOP代理(AOP proxy)
- 织入(Weaving)
总结
对于Spring这两个核心概念,我相信每一个学习Spring的人都会有自己的理解。这种概念上的理解没有绝对的标准答案,仁者见仁智者见智。如果有理解不到位或者理解错的地方,欢迎广大园友指正!