什么叫做是AOP呢?AOP是横切关注点,主要包括通知、连接点、切入点、目标、代理、主任务和次要任务。
通知 由方面在特定时候所执行的任务
a.前置通知(BeforAdvice.java)
b.后置通知(AfterAdvice.java)
c.拦截器(MyInterceptor.java)
默认情况下主任务的所有的方法都会触发通知
连接点 主任务中可能会触发通知的所有的方法
切入点 主任务中真正触发通知的某些方法(在配置文件中指定条件)
目标 主任务模块(StudentManager类)
代理 主任务模块实现的接口(IStudentManager)
首先实现一个简单的接口类
public interface IStudentManager {
//定义两个方法
public void execute(String name);
public void getInfo(String name);
}
主逻辑程序 继承了接口类
public class StudentManager implements IStudentManager{
public void execute(String name){
System.out.println("这是学生管理"+name);
}
@Override
public void getInfo(String name) {
// TODO Auto-generated method stub
}
}
再有就是三个通知类
a.前置通知(BeforAdvice.java)
public class BeforAdvice implements MethodBeforeAdvice{
/*
*前置通知类
*/
@Override
public void before(Method method, Object[] params, Object targer)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("这是前置通知被执行,学生姓名"+params[0]);
}
}
b.后置通知(AfterAdvice.java)
public class AfterAdvice implements AfterReturningAdvice{
/*
* 后置通知,主任务执行之后执行
* */
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("这是后置通知被执行");
}
}
c.拦截器(MyInterceptor.java)
public class MyInterceptor implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
// TODO Auto-generated method stub
//检查学生姓名是否是Hello
Object[] params = arg0.getArguments();//获取主任务方法的参数
String name = (String)params[0];//因为这里只有一个参数所以直接获取 params[0]
if("Hello".equals(name)){
System.out.println("Hello是个好学生");
arg0.proceed();//使主任务继续执行
}else{
System.out.println("请继续努力!");
}
return null;
}
}
重中之重还是配置文件的配置了,很多小伙伴可能刚开始比较乱,这里列举一下简单的配置文件里面的配置。
1、把已有的主逻辑类,通知类写进bean中让Spring来管理
<!-- AOP目标类 -->
<bean id="target" class="com.niit.logic.StudentManager"></bean>
<!-- 所有的通知类 -->
<bean id="beforeAdvice" class="com.niit.logic.BeforAdvice"></bean>
<bean id="afterAdvice" class="com.niit.logic.AfterAdvice"></bean>
<bean id="myInterceptor" class="com.niit.logic.MyInterceptor"></bean>
2、配置代理工厂一个Spring自带的类使用工厂模式来创建目标类
<bean id="studentManager"
class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 注入AOP的目标类 -->
<property name="target" ref="target"></property>
<!-- 注入通知列表 -->
<property name="interceptorNames">
<list>
<value>beforeAdvice</value>
<value>afterAdvice</value>
<value>myInterceptor</value>
</list>
</property>
<!-- 注入代理类 -->
<property
name="proxyInterfaces"
value="com.niit.logic.IStudentManager">
</property>
</bean>
这里要注入三个东西,主逻辑类、通知类、代理类缺一不可
最后在测试函数中调用的时候注意要使用代理类去调用
IStudentManager student = (IStudentManager)context.getBean("studentManager");
student.execute("Hello");
student.getInfo("Hello");
好了AOP的一个简单的demo学完了。
这里做下通知类的一个小笔记
* method 主任务正在执行的方法本身(例如StudentManager里的execute方法)
* param 主任务方法的参数的集合(例如execute方法的name)
* targer 主任务所在的类(例如StudentManager)