Spring-AOP

1.AOP:Aspect Oriented Programming-面向切面编程

2.AOP的目的:提供另外一种编程思想来弥补OOP(面向对象编程)的不足

3.在OOP中的关键单元是模块,而在AOP中的关键单元是切面

4.AOP是对IOC的补充

5.AOP在spring中的作用:

1.声明式服务(声明式事物)

2.允许用户自定义切面

6.AOP的编程模式:原始的编程模式是从上而下的纵向编程模式,而AOP则是横向的编程模式

7.AOP是基于动态代理模式实现的

8.AOP的好处:

1.使真实角色处理的业务更加纯粹,不关心公共的业务

2.公共的业务由代理类来完成,实现了业务的分工

3.公共业务扩展的时候更加集中和方便

8.名词简介:

1.关注点:在原来的程序上新增的业务

2.切面(Aspect):一个关注点的模块

3.连接点:在程序执行过程中某个特定的点,在SpringAOP中,一个连接点代表了一个方法的执行

4.通知:在切面中的特定的连接点上执行的动作

1.通知类型:

1.前置通知

2.后置通知

3.最终通知

4.环绕通知

5.异常通知

9.SpringAOP的根本就是把领域业务和公共业务相结合,我们在执行领域业务的时候也要执行公共的业务,把公共的业务分离出来,封装成一个单独的模块,可以使公共的业务重用,使领域业务更加纯粹,其本质就是动态代理,但是spring中的AOP已经把动态代理进行了封装,我们只需要调用spring提供给我们的接口来实现动态代理

10,spring中实现AOP的应用:spring根据AOP给我们提供的五中通知方式,相应的给我们提供了五个接口来实现AOP的应用

1.前置通知:实现MethodBeforeAdvice接口,重写接口中的before方法

1.代码实现:public class Log implements MethodBeforeAdvice {

public void before(Method method, Object[] objects, Object o) throws Throwable {

System.out.println(method+"方法被执行,打印一条日志");

}

}

2.xml文件的配置:

<bean id="userService" class="com.user.demo.service.UserServiceImpl"></bean>

<bean id="log" class="com.user.demo.service.Log.Log"></bean>

使用<aop:config>标签来表示这是一个AOP的配置

<aop:config>

使用<aop:proutcut>标签来定义一个横切点

expression="execution(* com.user.demo.service.*.*(..))"中的execution是固定格式,后面是我们定义的横切点所在的具体位置

第一个*表示所有返回值,第二个*表示包下的所有类,第三个*表示类中的所有方法,..表示方法中的所有参数

<aop:pointcut id="user" expression="execution(* com.user.demo.service.*.*(..))"></aop:pointcut>

使用<aop:advisor>标签来定义具体横切点要切入的连接点

<aop:advisor advice-ref="log" pointcut-ref="user"></aop:advisor>

</aop:config>

         3.重写方法参数的详解:moethod:调用方法的对象 args:调用方法的参数   target:调用方法的目标对象

2.后置通知:实现AfterReturningAdvice接口,重写接口中的afterReturning方法

1.代码实现:

public class Safeware implements AfterReturningAdvice {
public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
System.out.println(o1.getClass().getName()+"方法被执行,"+"返回值是"+o);
}
}

2.xml文件配置:

<bean id="userService" class="com.user.demo.service.UserServiceImpl"></bean>

<bean id="log" class="com.user.demo.service.Log.Log"></bean>

<bean id="safeware" class="com.user.demo.service.safe.Safeware"></bean>

<aop:config>

<aop:pointcut id="user" expression="execution(* com.user.demo.service.UserServiceImpl.*(..))"></aop:pointcut>

<aop:advisor advice-ref="log" pointcut-ref="user"></aop:advisor>

<aop:advisor advice-ref="safeware" pointcut-ref="user"></aop:advisor>

</aop:config>

3.重写方法的参数详解:o表示我们方法要返回的类型,其他参数同前置通知

         3.自定义类实现AOP:

    1.代码实现:

public class Commos { 

public void Log(){

System.out.println("打印日志");

}

public void Safeware(){

System.out.println("环境安全");

}

}

2.xml文件配置:

<bean id="userService" class="com.user.demo.service.UserServiceImpl"></bean>

    <bean id="log" class="com.user.demo.service.Log.Commos"></bean>

    <aop:config>

        <aop:aspect ref="log">

            <aop:pointcut id="user" expression="execution(* com.user.demo.service.*.*(..))"></aop:pointcut>

            <aop:before method="Log" pointcut-ref="user"></aop:before>

            <aop:after method="Safeware" pointcut-ref="user"></aop:after>

        </aop:aspect>        

    </aop:config>

使用注解来实现AOP:

1.代码实现:

@Aspect

public class Commos {

@Before("execution(* com.user.demo.service.*.*(..))")

public void Log(){

System.out.println("打印日志");

}

@After("execution(* com.user.demo.service.*.*(..))")

public void Safeware(){

System.out.println("环境安全");

}


@Around("execution(* com.user.demo.service.*.*(..))")

public Object sayHello(ProceedingJoinPoint point) throws Throwable {

System.out.println("环绕前");

System.out.println("方法签名:"+point.getSignature());

Object result = point.proceed();

System.out.println("环绕后");

return result;

}

}

2.xml文件配置:

	 <bean id="userService" class="com.user.demo.service.UserServiceImpl"></bean>
   	 <bean id="log" class="com.user.demo.service.Log.Commos"></bean>
    	 <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
3.环绕通知中的环绕前和环绕后都在前置通知和后置通知之前执行
4.方法:point.getSignature()来返回我们的方法签名,也就是包名和类名point.procced()执行方法
 
 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值