Spring框架整体架构

Spring框架由大约20个功能模块组成,这些模块被分为6个部分,分别是Core,Container,Data Access/integration,Web,AOP,Instrumentainer以及test
image.png

spring框架的特点

Spring的优点
低侵入式设计
独立于各种应用服务器
依赖注入特性将组件关系透明化,降低了耦合度
面向切面编程特性允许将通用任务进行集中式处理
与第三方框架的良好整合

spring设计理念

spring是面向bean的编程

spring两大核心技术

控制反转(IoC)/依赖注入(DI)
面向切片编程(AOP)

AOP

面向切面编程是软件编程思想发展到一定阶段的产物,是对面向对象编程的有益扩充
AOP一般适用于具有横切逻辑的场合,如访问事务管理,性能检测等
面向切面编程就是在不改变原有的程序的基础上为代码段增加新的功能,对其进行增强处理,它的设计思想来自于代理模式设计

AOP基本概念:
切面(Aspect):一个模块化横切逻辑(或称为横切关注点),可能会横切多个对象
连接点(JoinPoint):程序执行中的某个具体的执行点,
增强处理(Advice):切面在某个特定连接点上执行的代码逻辑
切入点(Pointcut):对连接点的特征进行描述,可以使用正则表达式,增强处理和一个切入点表达式相关联,并在与这个
切入点匹配的某个连接点上运行
目标对象(Target object):被一个或多个切面增强的对象
AOP代理(AOPproxy):由AOP框架所创建的对象实现执行增强处理方法等功能
织入(Weaving):将增强处理连接到应用程序中的类型或象上的过程
增强处理类型:前值增强,后置增强,环绕增强,异常增强,最终增强等类型
AOP切面类

  1. @Component
  2. @Aspect//代表这是一个切面类
  3. public class LogAop {
  4. @Autowired
  5. LogDao logDao;
  6. /*
  7. * service后面的两个点:表示service包及其下面子包,所以要用两个点
  8. * *.* :表示所有类下面的所有方法
  9. * 总体: service包及其子包下面的所有类的所有方法
  10. * */
  11. @Pointcut("execution(* service..*.*(..))")
  12. public void pointcut(){}
  13. //前置增强
  14. /*jp:连接点我们可以从该对象里面获取目标方法的信息*/
  15. @Before("pointcut()")
  16. public void before(JoinPoint jp){
  17. String name = jp.getSignature().getName();//获取目标方法名
  18. Object[] args = jp.getArgs();//获取方法参数
  19. System.out.println("这是前置增强,目标方法是"+name+",参数是:"+ Arrays.toString(args));
  20. }
  21. //后置增强
  22. /*result: 目标方法的返回值
  23. * 发生移异常不执行*/
  24. @AfterReturning(pointcut = "pointcut()",returning = "result")
  25. public void afterReturing(JoinPoint jp, Object result){
  26. String name = jp.getSignature().getName();
  27. System.out.println("这是后置增强,目标方法是"+name+",方法的 返回值是:"+result);
  28. }
  29. //最终增强
  30. /*result: 目标方法的返回值
  31. * 一定会增强,类似于finally*/
  32. @After("pointcut()")
  33. public void after(JoinPoint jp){
  34. String name = jp.getSignature().getName();
  35. System.out.println("最终增强:"+name+"方法执行完毕!");
  36. }
  37. //异常增强
  38. @AfterThrowing(pointcut = "pointcut()",throwing = "e")
  39. public void afterTrowing(JoinPoint jp ,Exception e){
  40. String name = jp.getSignature().getName();
  41. System.out.println("异常增强"+name+"产生了异常:"+e.getMessage());
  42. }
  43. //环绕增强
  44. @Around("pointcut()")
  45. public Object around(ProceedingJoinPoint jp){
  46. String name = jp.getSignature().getName();//获取目标方法名
  47. Object[] args = jp.getArgs();//获取方法参数
  48. List list=new ArrayList();
  49. list.add(1);
  50. System.out.println("这是环绕增强,目标方法是"+name+",参数是:"+ Arrays.toString(args));
  51. Object reult=null;
  52. try {
  53. reult= jp.proceed(args);//执行目标方法
  54. } catch (Throwable throwable) {
  55. throwable.printStackTrace();
  56. }
  57. finally {
  58. logDao.add(list);
  59. }
  60. return reult;
  61. }
  62. }