欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring 使用annotation和xml配置文件实现AOP

程序员文章站 2022-05-21 09:19:52
...
     
----------------通过Annotation 实现AOP----------

  使用Annotation 控制调用用对应的方法输出对象的日志信息
  1、创建一个annotation :
/**
	 * 创建一个annotation , 利用annotation 方便的控制需要输出的信息
	 * @author Administrator
	 * annotation: 	注视;评注;
	 * retention:	保持力
	 * RetentionPolicy:	保持的
	 */
	@Retention(RetentionPolicy.RUNTIME)//运行时引用
	public @interface LogInfo {
	
		public String value() default "";
	}


2、在需要添加日志的方法上面使用@LogInfo("") 标注需要输出的 信息
public interface UserService {

	//添加
	@LogInfo("实现了添加信息")
	public void addUser(String user);
	
	//获取信息
	@LogInfo("实现了查询一个")
	public UserEntity findOne();


[b]3、在调用的时候对方法进行判断,是否属于annotationPresent ,然后获取对应的值并输出[/b]
//使用annotation 控制输出信息
	if(method.isAnnotationPresent(LogInfo.class)){
		LogInfo li = method.getAnnotation(LogInfo.class);
		com.svse.info.LogInfo.info(li.value());
	}
}

 
    

annotation  实现AOP 切面编程:

[b] 1、创建一个切面类:@Aspect 来表示该类为一个切面 类[/b]
 /**
	 * 实现:annotation 的AOP 管理
	 * 1、创建一个切面类
	 * @author Administrator
	 *
	 */
	@Component("advisor")
	@Aspect //   注意:声明该类为切面类
	public class Advisor {
		
		/**
		 * execution(* com.svse.impl.*.add*(..))
		 * 第一个*表示任意返回值;
		 * 第二个*表示当前包下的所有类;
		 * 第三个*表示以add开头的所有方法;
		 * (..)任意参数方法
		 * @param jp
		 */
		@Before("execution(* com.svse.impl.*.add*(..)) ||" +
				"execution(* com.svse.impl.*.find*(..))")
		public void before(JoinPoint jp){
			LogInfo.info("实现切面的增加,调用了"+jp.getSignature().getName()+"方法!");
		}
		
		@After("execution(* com.svse.impl.*.add*(..)) || " +
				"execution(* com.svse.impl.*.find*(..))")
		public void after(JoinPoint jp){
			LogInfo.info("after調用");
		}
		
		/**
		 * 解释:第一* 表示方法的任意返回类型
		 * @param pjp
		 * @throws Throwable
		 */
		@Around("execution(* com.svse.impl.*.add*(..)) ||" +
		"execution(* com.svse.impl.*.find*(..))")
		public void around(ProceedingJoinPoint pjp) throws Throwable{
			LogInfo.info("開始around()調用!");
			pjp.proceed();//執行程序
			LogInfo.info("結束around()調用!");
		}
		
		/**
		 * 以上方法调用顺序:before() --> around() --> 程序.. --> after() --> around()
		 */
		
	}


[b] 2、配置文件设置为自动匹配:[/b]
 <!-- 使用annotation实现AOP ,切面编程 -->
 <aop:aspectj-autoproxy/>



---------------------------通过XML 文件实现AOP--------------

[b][b]1、配置文件中:[/b][/b]
<!-- 通过XML 文件实现AOP ,切面编程 -->
		<bean id="aopBaseXML" class="com.svse.aop.AopBaseXML"></bean>
		<aop:config>
			<!-- 定义切面 -->
			<aop:aspect id="myLogAspect" ref="aopBaseXML">
				<!-- 在哪些位置加上切面 -->
				<aop:pointcut  id="myPointCut" expression="execution(* com.svse.impl.*.add*(..)) ||
				execution(* com.svse.impl.*.find*(..))"/>
				
				<!-- 加入切面的时机 -->
				<aop:before method="before" pointcut-ref="myPointCut"/>
				<aop:after method="after" pointcut-ref="myPointCut"/>
				<aop:around method="around" pointcut-ref="myPointCut"/>
			</aop:aspect>
		</aop:config>	


2、类:
/**
		 * 基于XML 实现AOP 切面编程
		 * @author Administrator
		 *
		 */
		public class AopBaseXML {
			
			/**
			 * 前通知
			 * @param jp
			 */
			public void before(JoinPoint jp){
				LogInfo.info("开始前加入日志"+jp.getSignature().getName());
			}
			
			/**
			 * 后通知
			 * @param jp
			 */
			public void after(JoinPoint jp){
				LogInfo.info("结束后加入日志"+jp.getSignature().getName());
			}
			
			/**
			 * 
			 */
			public void around(ProceedingJoinPoint pjp){
				LogInfo.info("开始前加入日志"+pjp.getSignature().getName());
				try {
					pjp.proceed();//执行程序
				} catch (Throwable e) {
					e.printStackTrace();
				}
				LogInfo.info("程序结束调用!");
			}
		}