spring的三大核心:控制反转、依赖注入、面向切面编程。
控制反转:对象A依赖对象B,如果收到把对象B给new出来,会使代码高度耦合,产生硬编码。为了避免这种情况,通过注解或配置XML将bean托管给spring管理。由spring进行bean实例的创建
依赖注入:当spring把对象B创建出来后,需要设置到对象A中,这一过程称为依赖注入
面向切面编程:什么是面向切面编程?在运行时,动态地将代码织入到指定类的指定方法、指定位置上的编程思想就是面向切面的编程。一般而言,我们管织入到指定类指定方法的代码片段称为切面,而织入到哪些类、哪些方法则叫切入点。对于面向切面编程这里举个实例:在dao层对数据库操作时,都使用到了事务,在对数据库操作时都可能抛出异常,当抛出异常时都要做回滚操作。为避免在dao层对数据库操作时都要捕获异常做回滚,创建一个切面实现做回滚操作功能,然后指定切点,当发生异常时实现切面功能。对于切面代码块什么时候的调用,这里有做一些下列举:
AOP配置元素 | 描述 |
<aop:advisor> | 定义AOP通知器 |
<aop:config> | 顶层的AOP配置元素 |
<aop:pointcut> | 定义切点 |
<aop:aspect> | 定义切面 |
<aop:after-returning> | 定义AOP after-returning通知 |
<aop:after-throwing> | 定义after-throwing通知 |
<aop:after> | 定义AOP后置通知 |
<aop:before> | 定义AOP前置通知 |
当使用面向切面进行编程时,需要做XML文件配置声明哪些类是切面,哪些方法是切点,或者需要添加注解来做声明。做XML配置不再举例,这里以注解方式来说明一下面向切面的编程
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class SleepHelper {
public SleepHelper(){
}
@Pointcut("execution(* *.sleep())")(切点)
public void sleeppoint(){}
@Before("sleeppoint()")
public void beforeSleep(){
System.out.println("睡觉前要脱衣服!");
}
@AfterReturning("sleeppoint()")
public void afterSleep(){
System.out.println("睡醒了要穿衣服!");
}
}
用 @Aspect 的注解来标识切面 , 注意不要把它漏了,否则 Spring 创建代理的时候会找不到它 ,@Pointcut 注解指定了切点, @Before 和 @AfterReturning 指定了运行时的通知,注
意的是要在注解中传入切点的名称