一.IoC
1.1 IoC 完成的事情原先由程序员主动通过 new 实例化对象事情, 转交给 Spring 负责.
1.2控制反转中控制指的是:控制类的对象.
1.3控制反转中反转指的是转交给 Spring 负责.
1.4 IoC 最大的作用:解耦.
程序员不需要管理对象.解除了对象管理和程序员之间的耦合.
二. DI
1.1 DI 和 IoC 是一样的
1.2当一个类(A)中需要依赖另一个类()对象时,把 B 赋值给 A 的过程就叫做依赖注入.
代码体现:
三.AOP
1. 正常程序执行流程都是纵向执行流程
1.1又叫面向切面编程,在原有纵向执行流程中添加横切面
1.2不需要修改原有程序代码
1.2.1具有高扩展性;
1.2.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. 运行结果:
五. 使用 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
1.2.7.1args() 有几个参数,arg-names 里面必须有几个参数
1.2.7.2arg-names=”” 里面名称必须和通知方法参数名对应