spring 学习笔记(AOP)

一、spring 的aop思想分析如下图:

二、aop 解释
1.1 Spring中的aop
Spring能够为容器中管理的对象生成动态代理对象
以前我们要使用动态代理,我们需要自己调用下面的方法生成对象Proxy.newProxyInstance(xx,xx,xx) 生成代理对象,现在Spring能够帮我们生成代理对象。
1.2 Spring实现aop原理

  • 动态代理(优先)

被代理对象必须要实现实现接口,才能产生代理对象。如果没有接口不能使用动态代理技术。

spring 学习笔记(AOP)_第1张图片
- cglib代理(没有接口使用)

第三方代理技术,cglib代理,可以对任何类实现代理,代理的原理是对目标对象进行继承代理。如果目标对象被final修饰,该类无法被cglib代理。
spring 学习笔记(AOP)_第2张图片

1.3 aop名词解释

  • JoinPoint(连接点):在目标对象中,所有可以增强的方法
    spring 学习笔记(AOP)_第3张图片
  • PointCut(切入点):目标对象,已经增强的方法
  • Advice(通知/增强):增强的代码
  • Target(目标对象):被代理对象 (也就是userServiceImpl)
  • WeAVing(织入):将通知应用到切入点的过程
  • Proxy(代理):将通知织入到目标对象之后,形成代理对象
    spring 学习笔记(AOP)_第4张图片
  • Aspect(切面):切入点+通知 (即invoke方法)
    spring 学习笔记(AOP)_第5张图片
    2.aop代码 演示
    2.1 导包
    (4+2+2(spring_aop+spring_aspects)+2(com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar;com.springsource.org.aopalliance-1.0.0.jar))
    spring 学习笔记(AOP)_第6张图片
    2.2 准备目标对象
public class UserServiceImpl implements UserService{
    @Override
    public void save() {
        System.out.println("保存");
    }
    @Override
    public void delete() {
        System.out.println("删除");
    }
    @Override
    public void update() {
        System.out.println("更新");
    }
    @Override
    public void find() {
        System.out.println("查找");
    }
}

2.3 准备通知(增强的代码)

public class  notice{
    //前置通知,方法名是自己定义的
    public void before() {
        System.out.println("前置通知!");
    }
    //后置通知
    public void afterReturning() {
        System.out.println("后置通知(如果出现异常不会调用)");
    }
    //环绕通知
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("环绕通知之前的部分!");
        Object proceed = pjp.proceed();               
        System.out.println("这是环绕通知之后的部分!");
        return proceed;
    }
    //异常通知
    public void afterException() {
        System.out.println("异常出现了!");
    }
    //后置通知
    public void after() {
        System.out.println("后置通知(出现异常也会调用)");
    }
}

2.4 配置进行织入,将通知织入目标对象中


<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd ">
    
    <bean name="UserService"  class="com.tz.service.Impl.UserServiceImpl">bean>
    
    <bean name="myadvice"  class="com.tz.aop.Myadvice">bean>
    
    <aop:config>
        
        
        <aop:pointcut expression="execution(* com.tz.service.Impl.*ServiceImpl.*(..))" id="pc"/>
        <aop:aspect ref="myadvice">
            
            <aop:before method="before" pointcut-ref="pc"/>
            
            <aop:around method="around" pointcut-ref="pc"/>
            
            <aop:after-throwing method="afterException" pointcut-ref="pc"/>
            
            <aop:after-returning method="afterReturning" pointcut-ref="pc"/>
             
            <aop:after method="after" pointcut-ref="pc"/> 
        aop:aspect>
    aop:config>   

beans>

2.5 测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:com/tz/aop/ApplicationContext.xml")
public class test02 {

    @Resource(name="UserService")
    private UserService us;

    @Test
    public void  aopTest(){
        //调用保存方法
        us.save();

    }
输出:
  前置通知!
  环绕通知之前的部分!
  保存
  这是环绕通知之后的部分!

三、总结
AOP 面向切面编程(不懂的可以看上面的图 ),spring封装了动态代理和cglib代理的代码,可以对任何类进行代理。要熟悉aop的名词含义。以上就是Spring aop的详细分析,有什么问题可以评论或者联系我 qq:2217087909。

你可能感兴趣的:(spring)