Spring AOP 复习

个人理解:可以分离代码,降低方法耦合度,增强方法功能

一、注解方式

package com.sunj.dao;

import org.springframework.stereotype.Repository;

@Repository("userDao2")
public class UserDao {
    public void add(){
        System.out.println("flag= "+ this.flag);
        System.out.println("添加方法1");
    }

    private boolean flag;

    public void setFlag(boolean flag) {
        System.out.println("注解构造bean");
        this.flag = flag;
    }

}
package com.sunj.service;

import com.sunj.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
//    @Resource(name = "userDao")
    private UserDao userDao1;

    public void add(){
//        int i = 1/0;
        System.out.println("service方法");
        userDao1.add();
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="com.sunj"></context:component-scan>
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    
</beans>


package com.sunj.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component  //该注解把类实例化到spring容器中
@Aspect
public class TransactionAop {


    @Before("execution(* com.sunj.service.UserService.add(..))")
    public void  begin(){
        System.out.println("前置通知");
    }

    @After("execution(* com.sunj.service.UserService.add(..))")
    public void end(){
        System.out.println("后置通知");
    }

    @Around("execution(* com.sunj.service.UserService.add(..))")
    public void around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕处理之前");
        joinPoint.proceed();
        System.out.println("环绕处理之后");
    }


    /*
    该方法在位切面方法未遇到错误时不会执行
     */
    @AfterThrowing("execution(* com.sunj.service.UserService.add(..))")
    public void meetException() throws Throwable {
        System.out.println("异常通知");
    }


//    @AfterReturning("execution(* com.sunj.service.UserService.add(..))")
//    public void returnNo() throws Throwable {
//        System.out.println("返回通知");
//    }




}
package com.sunj.entity;

import com.sunj.UserController;
import com.sunj.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;

public class Test3 {
    public static void main(String[] args) {

        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("applicationContext2.xml");
        UserService userService = (UserService) applicationContext.getBean("userService");
        userService.add();
    }
}

 1、首先需要在xml开启aop注解

2、各注解讲解

1)、@Component   该注解把类实例化到spring容器中

2)、@Aspect, 表示切面

3)、 @Before ,切入点方法之前执行

4)、@After, 切入点方法之后执行

5)、@around,比@Before和@After都晚

6)、@AfterThrowing,切入点方法报错时会执行,不报错则不执行

二、xml方式

1、背景:去掉@Component之后, aop的切面类就不能注入到ioc容器中,所以切面则不会起作用

2、采用xml配置解决

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="com.sunj"></context:component-scan>
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    <bean id="transactionAop" class="com.sunj.aop.TransactionAop"></bean>  <!--注入aop  bean -->
    <aop:config>
        <aop:pointcut expression="execution(* com.sunj.service.UserService.add(..))" id="pt" /> <!-- 切点-->
        <aop:aspect ref="transactionAop">
            <aop:around method="around" pointcut-ref="pt"/>      <!--切入方法 -->
            <aop:after-throwing method="meetException" pointcut-ref="pt"/>
            <aop:before method="begin" pointcut-ref="pt"/>
            <aop:after method="end" pointcut-ref="pt"/>
        </aop:aspect>


    </aop:config>


</beans>


package com.sunj.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//@Component  //该注解把类实例化到spring容器中
@Aspect
public class TransactionAop {


//    @Before("execution(* com.sunj.service.UserService.add(..))")
    public void  begin(){
        System.out.println("前置通知");
    }

//    @After("execution(* com.sunj.service.UserService.add(..))")
    public void end(){
        System.out.println("后置通知");
    }

//    @Around("execution(* com.sunj.service.UserService.add(..))")
    public void around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕处理之前");
        joinPoint.proceed();
        System.out.println("环绕处理之后");
    }


    /*
    该方法在位切面方法未遇到错误时不会执行
     */
//    @AfterThrowing("execution(* com.sunj.service.UserService.add(..))")
    public void meetException() throws Throwable {
        System.out.println("异常通知");
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值