• Java通过Spring实现Aop


    首先导入包(划掉的可以先忽略):

    blob.png

    首先,AOP联盟定义的类型分为:

    前置通知 org.springframework.aop.MethodBeforeAdvice,在目标方法执行前实施增强(执行切面方法)

    后置通知 org.springframework.aop.AfterReturningAdvice,在目标方法执行后实施增强(执行切面方法)

    环绕通知 org.aopalliance.intercept.MethodInterceptor,在目标方法执行前后实施增强(执行切面方法)

    异常抛出通知 org.springframework.aop.ThrowsAdvice,在方法抛出异常后实施增强(执行切面方法)

    引介通知 org.springframework.aop.IntroductionInterceptor,在目标类中添加一些新的方法和属性

    其中,环绕通知用的最多。



    假设已有如下目标接口和目标类:

    public interface UserService {
    	void addUser();
    	String updateUser();
    	void deleteUser();
    }
    public class UserServiceImpl implements UserService {
    
    	@Override
    	public void addUser() {
    		System.out.println("c_spring_aop add user");
    	}
    
    	@Override
    	public void updateUser() {
    		System.out.println("c_spring_aop update user");
    	}
    
    	@Override
    	public void deleteUser() {
    		System.out.println("c_spring_aop delete user");
    	}
    
    }

    在此基础上,不修改源代码,在调用UserServiceImpl的实例方法前后,输出其他的信息。

    首先,新建要给切面类。如下:

    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    
    public class MyAspect implements MethodInterceptor {
    
    	@Override
    	public Object invoke(MethodInvocation arg0) throws Throwable {
    		System.out.println("befor...");
    		Object object = arg0.proceed();
    		System.out.println("after...");
    		return object;
    	}
    
    }

    然后配置文件如下:

    <?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.xsd 
           					   http://www.springframework.org/schema/aop 
           					   http://www.springframework.org/schema/aop/spring-aop.xsd">
    
    	<bean id="userService" class="com.kye.c_spring_aop.UserServiceImpl"></bean>
    
    	<bean id="myAspect" class="com.kye.c_spring_aop.MyAspect"></bean>
    
    	<aop:config>
    	        <!--切入点表达式-->
    		<aop:pointcut expression="execution(* com.kye.c_spring_aop.UserServiceImpl.*(..))" id="myPointCut"/>
    		<aop:advisor advice-ref="myAspect" pointcut-ref="myPointCut"/>
    	</aop:config>
    
    </beans>

    其中切入点表达式"execution(* com.kye.c_spring_aop.UserServiceImpl.*(..))"。

    第一个* 表示目标函数返回的类型任意

    第二个com.kye.c_spring_aop表示包名,可用*代替

    第三个UserServiceImpl表示目标类的类名,可用*代替

    最后一个*表示目标方法任意,还可以add*

    (..)表示目标方法的参数任意,还可以(int,int)

    可以同时使用多个切入点表达式用 || 连接


    最后测试:

    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MyTest {
    
    	@Test
    	public void test1() {
    
    		String path = "com/kye/c_spring_aop/beans.xml";
    
    		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(path);
    		UserService userService = applicationContext.getBean("userService", UserService.class);
     
    		userService.addUser();
    		userService.updateUser();
    		userService.deleteUser();
    	}
    
    }

    输出内容如下:

    befor...
    c_spring_aop add user
    after...
    befor...
    c_spring_aop update user
    after...
    befor...
    c_spring_aop delete user
    after...


  • 相关阅读:
    P4281 [AHOI2008]紧急集合 / 聚会
    P2622 关灯问题II
    CF1092F Tree with Maximum Cost
    10.28记
    威尔逊定理及证明
    CF895C Square Subsets
    洛谷 P5556 圣剑护符
    Multi-nim结论及证明
    AT2667 [AGC017D] Game on Tree
    洛谷 P4643 [国家集训队]阿狸和桃子的游戏
  • 原文地址:https://www.cnblogs.com/wugang/p/14232331.html
Copyright © 2020-2023  润新知