SpringAop两种配置:注解方式和xml配置

一,什么是SpringAop?

        所谓的springaop就是面向切面编程,就是在你的原有项目功能上,通过aop去添加新的功能,这些功能是建立在原有的功能基础上的,而且不会修改原来的动能代码以及功能逻辑。例如你用银行卡购物,购物付款,这是一个功能。付款后,银行向你的手机发送一条取钱信息,这就是新加的功能。也就是实现了增强

二,Springaop的实现机制是什么?

        横向抽取机制,那么什么是横向抽取机制呢?所谓的横向抽取机制就是使用动态的代理的方式(cglib代理和jdk代理)来实现对象的代理,实际上我们操作的是假对象。既然有横向抽取机制,那么有没有纵向代理模式呢 ?答案是有的。那么什么是纵向抽取呢?纵向抽取就是把公共的方法写在父类里,所有的类都继承父类,这样就是能调用父类的方法。例如,你购物付款是一个子类的功能,你可能还会取款,这也是一个功能,而在他们结束之后,银行都会发送一个信息给你,这又是一个功能,这个银行给你发送信息是个公共的方法,所以这个发信息的功能就是属于父类的。子类继承父类并调用父类的方法就是纵向抽取。

三,Springaop的使用场景

    一般来说:打印日志,还有短信通知啊,权限验证等,都可以使用aop来实现。

四,sringaop的两种实现方式

        (1)xml文件配置方式

          (2)注解的方式实现

    那么,下面我们就这两个方式以demo的形式讲解一下。

        方式一:xml方式配置

            a:创建被加强类(链接点类)

package cn.ytk.dao;

import org.springframework.stereotype.Repository;

@Repository
public class UserDao {
	
	public  void sys() {
		System.out.println("userDao.....");
	}
	
}

        b:创建增强类

package cn.ytk.strong;

import org.aspectj.lang.ProceedingJoinPoint;

public class Project {
	
	public void before1() {
		System.out.println("前置通知。。。。。。。。。");
	}
	/*
	 * 环绕通知
	 * */
	public void around(ProceedingJoinPoint point) throws Throwable {
		System.out.println("环绕通知前。。。。。");
		point.proceed();
		System.out.println("环绕通知后。。。。。。");
	}
	
	public void after1() {
		System.out.println("后置通知。。。。。。。。。");
	}
}
           c:配置切点和切面
<!-- spring bean的配置 -->
	<bean id="userDao" class="cn.ytk.dao.UserDao"></bean>
	<bean id="userService" class="cn.ytk.service.UserService">
		<property name="userDao" ref="userDao"></property>
	</bean>
	<bean id="project" class="cn.ytk.strong.Project"></bean>
	<aop:config>

		<aop:pointcut expression="execution(* cn.ytk.dao.UserDao.*(..))" id="pointcut1"/>
		<aop:aspect ref="project">
			<aop:before method="before1" pointcut-ref="pointcut1"/>
			<aop:after-returning method="after1" pointcut-ref="pointcut1"/>
			<aop:around method="around" pointcut-ref="pointcut1"/>
		</aop:aspect>
	</aop:config>

        d:运行结果


由上面的配置文件可以看出,配置相当复杂,接下来我们看一下使用spring注解的方式如何使用吧。

方式二:通过springaop注解实现

a:配置spring文件,开启aop注解

 <!-- 开启aop的注解 	-->
        <aop:aspectj-autoproxy/>
        <context:component-scan base-package="cn.ytk.*"></context:component-scan>

b:编写增强类

package cn.ytk.strong;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class Project2 {

	//方式1:
	@Before(value="execution(* cn.ytk.dao.UserDao.*(..))")
	public void before() {
		System.out.println("前置通知。。。。。。");
	}
	//方式二:先编写切点在将切点加到加强上。
	@Pointcut("execution(* cn.ytk.dao.*.*(..))")
	public void after() {}
	
	@AfterReturning("after()")
	public void after1() {
		System.out.println("....后置通知....");
		
	}
}

    我们可以看出上面给出了两种方式,第一种是注解直接加在增强方法上,第二种是先定义切点,在增强,这两种方式都可以实现springaop的操作。


五,springaop常用的相关术语

    

  1. 通知、增强处理(Advice)就是在你已经实现的功能上添加其他的功能,例如打印日志,完成操作时发送短信等。
  2. 连接点(JoinPoint和方法有关的前前后后都是连接点。
  3. 切入点(Pointcut) 上面说的连接点的基础上,你想让增强使用咋什么方法之上就是切点。
  4. 切面(Aspect) 切面是通知(增强)和切入点的结合。

    

详细Demo下载地址:springaop配置Demo下载

猜你喜欢

转载自blog.csdn.net/Mister_yang/article/details/80652190