spring两个核心IOC、AOP
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
spring主要包括两个核心IOC和AOP
一、IOC Inversion of Control,即“控制反转”不是一种技术,是一种设计思想
谁控制谁,控制什么:传统Java 程序中,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建
为何是反转,哪些方面反转了:传统JAVA程序中,由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,依赖对象的获取被反转了。
如下面的代码,传统的程序是有程序员new出来HoteDaoAddImpl
而在spring中,只需要在xml文件中配置如下,支持程序员动态配置,而不需要修改代码
二、AOP
AOP(Aspect Oriented Programming),即面向切面编程,是面向对象编程的的有力补充。面向对象编程关注的主要是业务处理,与之关系不大的部分是切面关注点。他们经常发生在核心业务的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心业务和切面关注点分离开来。
例:如果需要在程序中的每个类执行前都加上日志“开始“,执行后都加上“结束”,传统的做法有三种,1、手动在每个类中加上日志代码,2、利用继承重写函数,3、利用组合的方式添加日志代码,但是这样做重复的代码会编写多次,降低了代码的效率。
而利用aop只需要定义一个日志类,定义切点就可以了,只需要编写一次。如:
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Aspect @Component public class log { // 切入点定义 @Pointcut("execution(* com.pjf.spring.dao.*.*(..))") public void myPointcut() { }; // 前置通知 : 在执行目标方法之前执行 @Before("myPointcut()") public void before() { System.out.println("开始"); } // @After 后置通知:在目标方法之后执行(出不出现异常始终执行) @After("myPointcut()") public void after() { System.out.println("结束"); } //@AfterReturning 在目标方法完成之后运行(出现异常不执行) @AfterReturning("myPointcut()") public void afterReturning() { System.out.println("afterReturning()"); } //@AfterThrowing 出现异常时执行 @AfterThrowing("myPointcut()") public void afterThrowing() { System.out.println("afterThrowing()"); } // @Around 既可以在目标完成之前织入,也可以在目标完成之后织入 @Around("myPointcut()") public void around(ProceedingJoinPoint pjp) throws Throwable { System.out.println("环绕前...."); pjp.proceed(); // 执行目标方法 System.out.println("环绕后...."); } }
上面的代码定义了五种advice:before、after、around、AfterThrowing、afterReturning。