spring======02====AOP_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3005 | 回复: 0   主题: spring======02====AOP        下一篇 
java_along
注册用户
等级:上尉
经验:771
发帖:36
精华:0
注册:2014-2-17
状态:离线
发送短消息息给java_along 加好友    发送短消息息给java_along 发消息
发表于: IP:您无权察看 2014-9-7 0:10:51 | [全部帖] [楼主帖] 楼主

前置通知:

Application.xml引入aop命名空间

xmlns:aop="http://www.springframework.org/schema/aop"


然后配置个切点和切面

配置切点和切面之前 需要写一个日志类。

既然你要使用aop,就是希望在某个操作之前或者之后做一些操作,那么执行这些操作的类当然是由你自己定义。

这里我希望在操作执行之前打印记录~~~~~~~~~~~~

代码:

publicclass LoggerUtil {
      publicvoid log(){
            System.out.println("记录~~~~~~~~~~~~");
      }
}


非常简单,下面需要做的就是,把这个输出操作配置到xml里面。这个操作就像是一个切面,为这个操作找准一个切点。

为了测试 这里还定义了一个接口还一个类

public interface UserDao {
      void insert();
      void update();
      void delete();
}
public class UserDaoImpl implements UserDao{
      public void delete() {
            System.out.println("删除~~~~~~~~~~~~");
      }
      public void insert() {
            System.out.println("插入~~~~~~~~~~~~");
      }
      public void update() {
            System.out.println("更新~~~~~~~~~~~~");
      }
}


application.xml配置bean

<bean id="userDaoImpl" class="com.javalong.spring.day01.UserDaoImpl"></bean>
Test:
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao=(UserDao)context.getBean("userDaoImpl");
userDao.delete();
Out:


记录~~~~~~~~~~~~

删除~~~~~~~~~~~~

在删除前,我做了下记录。

下面看我的xml里面是怎么配置切点和切面的。

<aop:config>

<aop:pointcut expression="execution (* *.*(..))" id="testpointcut"/>

<aop:aspect id="testaspect"  ref="loggerUtil">

<aop:before method="log" pointcut-ref="testpointcut"/>

</aop:aspect>

</aop:config>

execution (* *.*(..)) 意思就是,当我执行任何方法时。

<aop:before method="log" pointcut-ref="testpointcut"/>意思是我在执行这个方法之前,我要执行log方法,这个log方法是哪来的呢?<aop:aspect id="testaspect"  ref="loggerUtil">

是来自loggerUtil这个bean。 执行这个方法之前,这个方法是代表哪个方法呢?

<aop:pointcut expression="execution (* *.*(..))" id="testpointcut"/>任何方法。

后置通知:

<aop:before> 改为 <aop:after-returning>

Out:

删除~~~~~~~~~~~~

记录~~~~~~~~~~~~

出错通知

<aop:before> 改为 <aop:after-throwing>

4.最终通知

<aop:before> 改为 <aop:after> 相当于 finally{},不管是否报错 都执行。

5.环绕通知

<aop:before> 改为 <aop:around> 

log() 由无参变为有参,参数为ProceedingJoinPoint 

代码:

publicvoid log(ProceedingJoinPoint pjp) throws Throwable{
      System.out.println("记录前~~~~~~~~~~~~");
      pjp.proceed();
      System.out.println("记录后~~~~~~~~~~~~");
}


输出:

记录前~~~~~~~~~~~~

删除~~~~~~~~~~~~

记录后~~~~~~~~~~~~




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论