码迷,mamicode.com
首页 > 编程语言 > 详细

Spring基础3

时间:2019-04-07 10:00:22      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:ack   service   ssr   ice   耦合度   getname   equal   override   his   

一、AOP

  1)AOP简介:

    Aspect Oriented Programming,面向切面编程

    通过预编译方式和动态代理实现程序功能的一种技术,AOP是OOP的延续,是函数式编程的一种衍生范例。利用AOP可以对业务逻辑各个部分进行隔离,从而使得业务逻辑之间的耦合度降低,提高程序的可重用性,同时提高开发效率。

    AOP采用横向抽取机制取代了传统纵向继承,不破坏原有的类,生成一个动态代理类,在原有类的基础上进行增强,可以随时添加,随时取消功能。

    Spring中使用的AOP是Aspectj

二、动态代理

  1)JDK动态代理,依赖接口

      技术图片

    技术图片

技术图片

package com.ual.dao;

public class GoodsDaoImpl implements GoodsDao {
    @Override
    public void save() {
        System.out.println("保存");
    }

    @Override
    public void update() {
        System.out.println("更新");
    }
}
package com.ual.Proxy;

import com.ual.dao.GoodsDao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class GoodsJDKProxy {
    public GoodsDao createProxy(GoodsDao goodsDao) {
        GoodsDao goodsDaoProxy = (GoodsDao) Proxy.newProxyInstance(goodsDao.getClass().getClassLoader(),
                goodsDao.getClass().getInterfaces(), new InvocationHandler() {
            @Override//当调用对象的时候,所有的方法都会来到这里
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
               if("save".equals(method.getName())){
                   System.out.println("保存校验");
                   return method.invoke(goodsDao, args);//返回的代理对象
               }
               if("update".equals(method.getName())){
                   System.out.println("更新校验");//方法执行之前,执行
                   GoodsDao goodsDao1 = (GoodsDao)method.invoke(goodsDao, args);//返回的代理对象
                   System.out.println("日志打印");//方法执行之后
                   return  goodsDao1;
               }
                return method.invoke(goodsDao, args);//返回的代理对象
            }
        });
        return goodsDaoProxy;//返回一个代理对象,代理对象中的方法执行时,会回调匿名内部类中的Invoke方法。
    }
}
package com.ual.test;

import com.ual.Proxy.GoodsJDKProxy;
import com.ual.dao.GoodsDao;
import com.ual.dao.GoodsDaoImpl;
import org.junit.Test;

public class GoodsDaoTest {
    @Test
    public void test() {
        GoodsDao goodsDao = new GoodsDaoImpl();
        /* goodsDao.save();*/
        GoodsJDKProxy goodsJDKProxy = new GoodsJDKProxy();
        GoodsDao proxy = goodsJDKProxy.createProxy(goodsDao);
        proxy.save();
        proxy.update();
    }
}

  2)cglib动态代理,不需要依赖接口,核心是通过子类继承

  Spring会在jdk与cglib之间进行自动切换,有接口使用jdk,没有接口使用cglib。

  技术图片

技术图片

技术图片

三、AOP相关术语

1)JoinPoint:连接点,可以被拦截的方法,能够(可以)被增强的方法,称为连接点。

2)Pointcut:切入点,真正被拦截,增强的方法

3)Advice:通知,增加的内容,通常封装成一个方法,这个方法称之为通知

4)Introduction:引介,类层面的增强,给原有类添加一些新的属性和方法。在开发中通常给方法加强

5)Target:被增强的对象

6)Weaving:织入,将通知应用到目标对象的过程

7)Proxy:代理对象

8)Aspect:切面,多个通知和对各切入点的结合

四、Spring 中AOP的使用

1)引入Spring基本jar包

2)引入AOP开发相关jar包

3)配置文件引入AOP约束

4)Spring 测试

引入这个jar包,这样就不用每次都获取工厂

技术图片

在测试类上添加

技术图片

package com.ual.test;

import com.ual.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UserTest {
    @Autowired
    private UserService userService;
    @Test
    public void test() {
        this.userService.delete();
    }
}

5)编写一个切面类

 即里面写入通知

6)将切面类交给Spring 

7)配置AOP完成对目标产生代理

Spring基础3

标签:ack   service   ssr   ice   耦合度   getname   equal   override   his   

原文地址:https://www.cnblogs.com/UalBlog/p/10663928.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!