Spring面向切面编程

Spring面向切面编程

一、在Spring容器中详细配置(增强)
首先导入以下jar包
Spring面向切面编程_第1张图片
接着写好Dao层和Service层,最后写Aop实体类以及在Spring容器中的配置(以下详细描述四种增强)

第一种:Throws异常增强(当目标方法抛出异常时调用)

Aop实体类:

    /**
     * @param joinPoint 所有动态代理的类的信息
     */
    public void afterError(JoinPoint joinPoint,RuntimeException e){
        System.out.println(joinPoint.getSignature().getName()+"这个方法的异常信息"+e.getMessage());
    }

Spring容器中配置

<?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:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
	   <bean id="userDao" class="com.offcn.dao.impl.UserDaoImpl"></bean>

	  <bean id="userService" class="com.offcn.service.impl.UserServiceImpl">
		   <property name="userDao" ref="userDao"></property>
	  </bean>
	 <bean id="aopp" class="com.offcn.aop.Aop"></bean>
	<!--配置切面-->
    <aop:config>
        <!-- 定义切入点 -->
        <aop:pointcut id="pointcut" expression="execution(* com.offcn.service.UserService.*(..))" />
        <!-- 引用包含增强方法的Bean -->
        <aop:aspect ref="aopp">
            <!--afterThrowing()方法定义为异常抛出增强并引用pointcut切入点 -->
            <!-- 通过throwing属性指定为名为e的参数注入异常实例
            <aop:after-throwing method="afterError"
                                pointcut-ref="pointcut" throwing="e" 
        </aop:aspect>
    </aop:config>
</beans>

运行结果:
在这里插入图片描述

第二种:After后置增强(在目标方法调用后调用)

Aop实体类

    public void afterInfo(JoinPoint joinPoint){
        System.out.println(joinPoint.getSignature().getName());
    }

因为在Throws异常增强已经完成了以下三步:
1.配置切面
2.设置切点
3.切面与增强bean进行关联
所以在Spring容器中只需要配置增强,也就是在aop:aspect标签内增加aop标签,如下:

             <aop:after method="afterInfo" pointcut-ref="pointcut"></aop:after>
     </aop:aspect>

运行结果:在这里插入图片描述

第三种:Before前置增强(在目标方法调用前调用)
具体步骤同After后置增强类似,区别只是将aop:after配置标签换为aop:before
运行结果:
在这里插入图片描述

第四种:Around环绕增强(拦截对目标方法调用,需要手动执行目标方法)

Aop实体类

    /**
     * @param joinPoint JoinPoint的子类(只适用于环绕增强)
     */
    public  void aroundLogger(ProceedingJoinPoint joinPoint){
        System.out.println(joinPoint.getTarget()+Arrays.toString(joinPoint.getArgs()));
        //执行目标对象相应的方法
        try {
            joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println(joinPoint.getSignature().getName());
    }

Spring容器中配置

            <aop:around method="aroundLogger" pointcut-ref="pointcut"></aop:around>
        </aop:aspect>

运行结果:
在这里插入图片描述

二、还可以通过注解(增强)

导包(和上面导包是一样的)
Spring面向切面编程_第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: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-3.2.xsd
	http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">

	<context:component-scan base-package="com.offcn.service,com.offcn.dao" />
	<bean class="com.offcn.aop.AopError"></bean>
	<!--开启spring注解-->
	<aop:aspectj-autoproxy/>
</beans>

在Aop实体类写注解

@Aspect
public class Aop {
}

分别在各个在方法名上写注解

@AfterThrowing(pointcut = "execution(* com.offcn.service.UserService.*(..))",throwing = "e")
@After("execution(* com.offcn.service.UserService.*(..))")
@Before("execution(* com.offcn.service.UserService.*(..))")
@Around("execution(* com.offcn.service.UserService.*(..))")

你可能感兴趣的:(JAVA框架)