spring-aop
一、AOP与过滤器的区别
二、代理模式
代理的模式的作用:就是使用一个代理类来管理被代理类对象(源对象)的统一处理。我们将这种统一处理的理解称为控制访问。
代理模式的缺陷:
1. 代理类必须要继承或者实现一个基类或者接口!!(很笨重)。每个接口都要实现一个新的代理类。限制了代理的源对象的类型!!!
2. 每个方法的逻辑处理,还是要重复编写。(代理模式并不可以减少代码)
如何解决代理模式的缺陷呢?可以使用动态代理模式(不需要指定代理类的固定接口)。
三、动态代理
动态代理模式的问题:它会拦截的被代理类对象的方法,无法通过规则来拦截指定的方法。
四、AOP(主要用在日志管理):可通过规则拦截指定的方法
注意点:
在(使用@Aspect声明为切面类)Aop类中使用注解
@xxx(value="execution(拦截规则)")
拦截规则:
表达式语法:execution([修饰符] 返回值类型 包名.类名.方法名(参数))
写法说明:
全匹配方式:
public void cn.gzsxt.service.impl.CustomerServiceImpl.saveCustomer()
访问修饰符可以省略
void cn.gzsxt.service.impl.CustomerServiceImpl.saveCustomer()
返回值可以使用*号,表示任意返回值
* cn.gzsxt.service.impl.CustomerServiceImpl.saveCustomer()
包名可以使用*号,表示任意包,但是有几级包,需要写几个*
* *.*.*.*.CustomerServiceImpl.saveCustomer()
使用..来表示当前包,及其子包
* com..CustomerServiceImpl.saveCustomer()
类名可以使用*号,表示任意类
* com..*.saveCustomer()
方法名可以使用*号,表示任意方法
* com..*.*()
参数列表可以使用*,表示参数可以是任意数据类型,但是必须有参数
* com..*.*(*)
参数列表可以使用..表示有无参数均可,有参数可以是任意类型
* com..*.*(..)
全通配方式:
* *..*.*(..)
1.Joinpoint(连接点):
所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点。
---就是根据规则,可以指定拦截的方法,我们将每一个被拦截的方法称为连接点。
2.Pointcut(切入点):
--所谓的切入点,就是拦截方法设置的规则
所谓切入点是指我们要对哪些Joinpoint进行拦截的定义。
3.Advice(通知/增强,场景:在之前拦截,还是方法执行后拦截呢?):
--就是可以设置在方法之前拦截或者方法执行之后拦截或者方法出异常后拦截,或者方法之前和之后都拦截。我们将这些拦截场景称为通知
4.Aspect(切面):
--所谓的切面就是我们的拦截处理类。
是切入点和通知(引介)的结合。
基于xml配置的大体框架:
<bean name="aop" class="cn.gzsxt.aop.StudentAOP"></bean>
<!-- aop配置 -->
<aop:config >
<aop:pointcut expression="execution(* cn.gzsxt.service..*.*(..))" id="public_pointcut"/>
<!-- 配置切面 -->
<aop:aspect id="aop" ref="aop">
<!-- 方法执行前 -->
<aop:before method="before" pointcut-ref="public_pointcut"/>
<!-- 方法执行后 -->
<aop:after method="after" pointcut-ref="public_pointcut"/>
<!-- 方法执行前后都需要拦截 -->
<aop:around method="around" pointcut-ref="public_pointcut" />
<!-- 方法正常执行后 ,如果出了异常就不拦截了-->
<aop:after-returning method="afterReturning" pointcut-ref="public_pointcut"/>
<aop:after-throwing method="afterThrowing" pointcut-ref="public_pointcut"/>
</aop:aspect>
</aop:config>
五、定时任务
注意点:
1.在配置文件中
六、发送邮件
1.导包
在xml中配置发送类