总结spring核心功能 IoC/DI和AOP

  1. Spring 核心功能
    1. IoC/DI   控制反转/依赖注入
    2. AOP    面向切面编程

一.IoC

  1. IoC 是什么?

1.1 IoC 完成的事情原先由程序员主动通过 new 实例化对象事情, 转交给 Spring 负责.

1.2控制反转中控制指的是:控制类的对象.

1.3控制反转中反转指的是转交给 Spring 负责.

1.4 IoC 最大的作用:解耦.

程序员不需要管理对象.解除了对象管理和程序员之间的耦合.

. DI

  1. DI 是什么?

1.1 DI 和 IoC 是一样的

          1.2当一个类(A)中需要依赖另一个类()对象时,把 B 赋值给 A 的过程就叫做依赖注入.

代码体现:

  总结spring核心功能 IoC/DI和AOP_第1张图片

.AOP

1. 正常程序执行流程都是纵向执行流程

   1.1又叫面向切面编程,在原有纵向执行流程中添加横切面

   1.2不需要修改原有程序代码

      1.2.1具有高扩展性;

      1.2.2原有功能相当于释放了部分逻辑.让职责更加明确.

 

总结spring核心功能 IoC/DI和AOP_第2张图片

2. 面向切面编程是什么?

   2.1 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面过程就叫做面向切面编程.

 

3.常用概念

  3.1 原有功能: 切点,pointcut

3.2 前置通知: 在切点之前执行的功能.beforeadvice

3.3 后置通知: 在切点之后执行的功能,afteradvice

3.4 如果切点执行过程中出现异常,会触发异常通知.throwsadvice

3.5 所有功能总称叫做切面.

3.6 织入: 把切面嵌入到原有功能的过程叫做织入

 

4.spring 提供了 2 种 AOP 实现方式

  4.1Schema-based

4.1.1 每个通知都需要实现接口或类

4.1.2 配置 spring 配置文件时在配置

4.2AspectJ

4.2.1 每个通知不需要实现接口或类

4.2.2 配置 spring 配置文件是在的子标签中配置

 

四.Schema-based 实现步骤

1.导入 jar( aopalliance.jar 和 aspectjweaver.jar)

2. 新建通知类

2.1 新建前置通知类

2.1.1arg0: 切点方法对象 Method 对象

2.1.2arg1: 切点方法参数

2.1.3arg2:切点在哪个对象中

public class MyBeforeAdvice implements MethodBeforeAdvice {

@Override

public void before(Method arg0, Object[] arg1, Object

arg2) throws Throwable { System.out.println("执行前置通知");

  } }

2.2 新建后置通知类

2.2.1arg0: 切点方法返回值

2.2.2arg1:切点方法对象

2.2.3arg2:切点方法参数

2.2.4arg3:切点方法所在类的对象

public class MyAfterAdvice implements AfterReturningAdvice {

 @Override

public void afterReturning(Object arg0, Method arg1, Object[] arg2,Object arg3) throws Throwable { System.out.println("执行后置通知");

} }

3. 配置 spring 配置文件

3.1 引入 aop 命名空间

3.2 配置通知类的

3.3 配置切面

3.4* 通配符,匹配任意方法名,任意类名,任意一级包名

3.5 如果希望匹配任意方法参数 (..)

  } }

2.2 新建后置通知类

2.2.1arg0: 切点方法返回值

2.2.2arg1:切点方法对象

2.2.3arg2:切点方法参数

2.2.4arg3:切点方法所在类的对象

public class MyAfterAdvice implements AfterReturningAdvice {

 @Override

public void afterReturning(Object arg0, Method arg1, Object[] arg2,Object arg3) throws Throwable { System.out.println("执行后置通知");

} }

3. 配置 spring 配置文件

3.1 引入 aop 命名空间

3.2 配置通知类的

3.3 配置切面

3.4* 通配符,匹配任意方法名,任意类名,任意一级包名

3.5 如果希望匹配任意方法参数 (..)

xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/sc

hema/beans

http://www.springframework.org/schema/beans/spring-be

ans.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop. xsd">

<bean id="mybefore" class="com.bjsxt.advice.MyBeforeAdvice">bean>

<bean id="myafter" class="com.bjsxt.advice.MyAfterAdvice">bean>

<aop:config>

<aop:pointcut expression="execution(* com.bjsxt.test.Demo.demo2())" id="mypoint"/>

<aop:advisor advice-ref="mybefore" pointcut-ref="mypoint"/> <aop:advisor advice-ref="myafter" pointcut-ref="mypoint"/> aop:config>

<bean id="demo" class="com.bjsxt.test.Demo">bean> beans>

4. 编写测试代码

    public class Test { public static void main(String[] args) {

        // Demo demo = new Demo();

        // demo.demo1();

        // demo.demo2(); // demo.demo3();

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xm l");

  Demo demo = ac.getBean("demo",Demo.class); demo.demo1(); demo.demo2(); demo.demo3();

      } }

5. 运行结果:

 总结spring核心功能 IoC/DI和AOP_第3张图片

. 使用 AspectJ 方式实现

1. 新建类,不用实现

1.1 类中方法名任意

    public class MyAdvice { public void mybefore(String name1,int age1){

        System.out.println("前置"+name1 );

    }

  public void mybefore1(String name1){ System.out.println("前置:"+name1); }

    public void myaftering(){ System.out.println("后置 2"); }

    public void myafter(){ System.out.println("后置 1"); }

    public void mythrow(){ System.out.println("异常"); }

    public Object myarround(ProceedingJoinPoint p)

            throws Throwable{ System.out.println("执行环绕");

            System.out.println("环绕-前置");

            Object result = p.proceed(); System.out.println("环绕后置"); return result;

            }

  }

}

1.2 配置 spring 配置文件

1.2.1 后置通知,是否出现异常都执行

1.2.2 后置通知,只有当切点正确执行时执行

1.2.3 执行顺序和配置顺序有关

1.2.4execution() 括号不能扩上 args

1.2.5 中间使用 and 不能使用&& 由 spring 把 and 解析成&&

1.2.6args(名称) 名称自定义的.顺序和 demo1(参数,参数)对应

1.2.7 arg-names=” 名 称 ” 名 称 来 源 于expression=”” 中 args(),名称必须一样

1.2.7.1args() 有几个参数,arg-names 里面必须有几个参数

1.2.7.2arg-names=”” 里面名称必须和通知方法参数名对应

总结spring核心功能 IoC/DI和AOP_第4张图片

 

你可能感兴趣的:(java)