AOP:面向方面编程
一个普通的类 --> 有特定功能的类
a.继承类 b.实现接口 c.注解
public class MyFilter extends/implements Xx
{
}
public class Xxx
{
@Test
a();
}
类 --> “通知” :实现接口
前置通知实现步骤:
a.jar
aopaliance.jar
aspectjweaver.jar
b.配置
c.编写
aop:每当之前add()之前 自动执行一个方法log();
add(); 业务方法(IStudentService)
log(); 自动执行的通知,即aop前置通知
配置前置通知:
如果出现异常:类似java.lang.NoClassDefFoundError:org/apache/commons/pool/impl/GenericObjectPool
则说明缺少jar包
后置通知:
a.通知类,普通实现接口
b.业务类,业务方法
StudentServiceImpl中的addStudent()
c.配置:
将业务类,通知纳入springIOC容器
定义切入点(一端),定义通知类(另一端),通过pointcut-ref将两端连接起来
异常通知:
根据异常通知接口的定义可以发现,异常通知的实现类必须编写以下方法:
public void afterThrowing([Method,args,target],ThrowableSubclass):
a.public void afterThrowing(Method,args,target,ThrowableSubclass)
b.public void afterThrowing(ThrowableSubclass)
环绕通知:
在目标方法的前后,异常发生时,最终在各个地方都可以进行的通知,最强大的一个通知;可以获取目标方法的全部控制权(目标方法是否执行,执行之前,执行之后,参数,返回值等)。
在使用环绕通知时,目标方法的一切信息都可以通过invocation参数获取到。
环绕通知底层是通过拦截器实现的。
通过实现注解实现通知,aop
a.jar
与实现接口的方式相同
b.配置
将业务类,通知纳入springIOC容器
开启注解对AOP的支持<aop:aspectj-autoproxy></aop:aspectj-autopeoxy>
业务类 addStudent-通知
c.编写
通知:
@Aspect //声明该类是一个通知
public class LogBeforeAnnocation{
}
注意:通过注解的形式将对象添加到ioc容器时,需要设置扫描器
扫描器会将指定的包中的 @Componet @Service @Respository @Controller修饰的类产生的对象增加到IOC容器中
@Aspect不需要加入扫描器,只需要开启即可:<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
通过注解形式实现的aop,如果想获取目标对象的一些参数,则需要使用一个对象
@AfterReturning(pointcut="execution(public *addStudent(..))",returning="returningValue")
public void myAfter(JoinPoint jp,Object returningValue){//returningValue是返回值,但需要告诉spring
System.out.println("返回值:"+returningValue);
}
注解形式实现aop时,通知的方法的参数不能多,少
通过配置将类-->通知
基于Schema配置
类似与实现接口的方式
接口方式通知:public class LogAfter implements AfterReturningAdvice
Schema方式通知:public class LogAfter implements AfterReturningAdvice
Schema方式通知:
a.编写一个普通类 pubilc class LogAfter{}
b.将该类通过配置,转为一个“通知”
将准备转为通知的类纳入ioc容器
如果要获取目标对象信息:
注解,schema:JoinPoint
接口:Method method,Object[] args,Object target
schem形式和注解形式相似,不同之处:注解形式使用了注册@After,schema形式进行了多余的配置
注意:环绕通知会返回目标方法的返回值,因此返回值为Object
Spring开发web项目及拆分Spring配置文件
Web项目如何初始化SpringIOC容器:思路:当服务启动时(tomcat),通过监听器将SpringIOC容器初始化一次(该监听器spring-web.jar已经提供)
Spring整合MyBatis
Spring容器初始化I:1.将ioc容器中的所有bean实例化为对象
2.将各个bean依赖的属性值注入进去
new对象 属性赋值