前言
之因此写Java杂谈就是想经过博客记录本身的学习的感悟和本身的理解,今天谈谈Spring 的 IOC和AOP
1、Spring是什么?
Spring是一种轻量级框架,能够说Java EE的春天,是当前主流框架,它可使现有技术更加易用,推动编码最佳实践。
它的设计理念是面向Bean的编程。
sql
2、Spring的优势
一、低侵入式设计
二、独立于各类应用服务器
三、依赖注入特性将组件关系透明化,下降了耦合度
四、面向切面编程特性容许将通用任务集中式处理
五、与第三方框架的良好整合
编程
3、Spring两大核心技术
控制反转(IoC)/依赖注入(DI)
Ioc:
Ioc(Inversion of Control )又称控制反转,它是一种设计思想,使用Ioc就至关于你将设计好的对象交给容器控制,并非面向对象的在对象内部控制。
控制:
传统的程序设计都是在内部直接new进行建立,也就是程序本身建立了对象,这里是程序控制的对象;Ioc是由专门一个容器(Ioc容器)来建立这些对象,这里是Ioc容器控制对象的建立;
能够理解为Ioc使用了Java的23种设计模式的工厂模式,固然Ioc除了控制对象更主要的控制外部资源的获取像文件、常量数据等
反转:
传统的程序是我没本身主动控制去直接获取依赖对象,这里的对象是主动接收依赖,这个能够理解为正转;
Ioc中的反转就是Ioc容器查找及注入对象,这里的对象是被动的接受依赖对象,这就是反转;
通俗的来说,控制反转使用后再也不本身建立对象
DI:
Dependency Injection就是依赖注入的意思,就是理解为容器将某一个依赖关系(日志功能、异常处理功能)注入到一个相似于积木的组件里,这样容器就能够简单灵活的拼接组合这些依赖关系,像搭建乐高积木同样,能够变换成不少功能。
这样作,咱们只须要经过简单的配置,而无需任何代码就可指定目标须要的资源,完成自身的业务逻辑,而不须要关心具体的资源来自何处,由谁实现。
设计模式
面向切面编程(AOP)
了解AOP首先咱们从一段代码入手服务器
代码以下(示例):app
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的原理
将复杂的需求分解出不一样方面,将散布在系统中的公共功能集中解决;
采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行加强处理,增长新的功能
编码
所谓面向切面编程,就是一种经过预编译和运行期动态代理的方式实如今不修改源代码的状况下给程序动态添加功能的技术spa
AOP相关术语设计
- 加强处理(Advice)
- 前置加强
- 后置加强
- 环绕加强、异常抛出加强、最终加强等类型
- 切入点(Pointcut)
- 链接点(Join Point)
- 切面(Aspect)
- 目标对象(Target object)
- AOP代理(AOP proxy)
- 织入(Weaving)
总结
对于Spring这两个核心概念,我相信每个学习Spring的人都会有本身的理解。这种概念上的理解没有绝对的标准答案,仁者见仁智者见智。若是有理解不到位或者理解错的地方,欢迎广大园友指正!