Spring AOP

什么叫做是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)



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值