千家信息网

Java Spring AOP该怎么理解

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这篇文章给大家介绍Java Spring AOP该怎么理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得
千家信息网最后更新 2025年01月31日Java Spring AOP该怎么理解

这篇文章给大家介绍Java Spring AOP该怎么理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

    前言

    面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
    即不改变源代码而添加新功能,可插拔的.

    提示:以下是本篇文章正文内容,下面案例可供参考

    一.AOP底层原理

    1.AOP底层使用动态代理

    有接口:jdk动态代理,即创建接口实现类代理对象

    无接口:CGLIB动态代理,即创建子类代理对象

    jdk动态代理的实现

    创建接口

    package com.vector.spring5;public interface UserDao {    public int add(int a,int b);    public String update(String id);}

    接口实现类

    接口实现类的方法,属于源代码,用aop思想增添新功能时这里不能动!

    package com.vector.spring5;public class UserDaoImpl implements UserDao{    @Override    public int add(int a, int b) {        return a+b;    }    @Override    public String update(String id) {        return id;    }}

    使用JDK动态代理对象,增添新功能

    package com.vector.spring5;import java.lang.reflect.Array;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Arrays;public class JDKProxy {    public static void main(String[] args) {        //创建接口实现类代理对象        Class[] interfaces = {UserDao.class};        UserDaoImpl userDao = new UserDaoImpl();        UserDao dao= (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces,new UserDaoProxy(userDao));        int result = dao.add(1,2);        System.out.println("result: "+result);    }}//创建代理对象class UserDaoProxy implements InvocationHandler{    //有参构造传递增强对象    private Object obj;    public UserDaoProxy(){};    public UserDaoProxy(Object obj){        this.obj=obj;    }    //增强的逻辑    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        //方法之前        System.out.println("方法之前执行: "+method.getName()+":传递的参数: "+ Arrays.toString(args));        //被增强的方法执行        //可以根据method.getName()判断选择增强        Object res = method.invoke(obj,args);        //方法之后        System.out.println("方法之后执行: "+obj);        return res;    }}

    jdk代理图像解析

    二.AOP术语

    1.连接点

    类里可以被增强的方法,称为连接点.

    2.切入点

    类中实际被增强的方法,成为切入点.

    3.通知(增强)

    (1)实际被增强的方法中的逻辑部分称为通知(增强).

    (2)通知包含:前置通知,后置通知,环绕通知,异常通知,最终通知

    4.切面

    把增强应用到切入点的过程称为切面

    三.AOP 操作(准备工作)

    Spring 框架一般都是基于 AspectJ 实现 AOP 操作

    (1)AspectJ 不是 Spring 组成部分,独立 AOP 框架,一般把 AspectJ 和 Spirng 框架一起使用,进行 AOP 操作

    maven准备

                org.aspectj            aspectjweaver            1.9.8.RC1        

    方式一:使用Spring的接口实现增添功能

    实现组合crud和日志功能结合

    applicationContext.xml

                                        

    log.java

    package com.vector.log;import org.springframework.aop.MethodBeforeAdvice;import org.springframework.stereotype.Component;import java.lang.reflect.Method;@Component("log")public class Log implements MethodBeforeAdvice {    //method: 要执行的目标对象的方法    //args: 参数    //target: 目标对象    @Override    public void before(Method method, Object[] args, Object target) throws Throwable {        System.out.println(target.getClass().getName()+"的"+method.getName()+"被执行了");    }}

    userService.java

    package com.vector.service;public interface UserService {    public void add();    public void delete();    public void update();    public void query();}

    userServiceImpl.java

    package com.vector.service;import org.springframework.stereotype.Service;@Service("userService")public class UserServiceImpl implements UserService{    @Override    public void add() {        System.out.println("增加了一个用户");    }}

    MyTest.java

    public class MyTest {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");        //动态代理的是接口        UserService userService = (UserService) context.getBean("userService");        userService.add();    }}

    方式二:自定义类

    DiyPoint.java

    package com.vector.diy;import org.springframework.stereotype.Component;@Component("diyPointCut")public class DiyPointCut {    public void before(){        System.out.println("===方法执行前===");    }    public void after(){        System.out.println("===方法执行后===");    }}

    UserServiceImpl.java

    package com.vector.service;import org.springframework.stereotype.Service;@Service("userService")public class UserServiceImpl implements UserService{    @Override    public void add() {        System.out.println("增加了一个用户");    }}

    applicationContext.xml

                                                                

    MyTest.java

    public class MyTest {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");        //动态代理的是接口        UserService userService = (UserService) context.getBean("userService");        userService.add();    }}

    方式三:全注解配置实现

    UserServiceImpl.java

    package com.vector.service;import org.springframework.stereotype.Service;@Service("userService")public class UserServiceImpl implements UserService{    @Override    public void add() {        System.out.println("增加了一个用户");    }}

    AnnotationPointCut.java

    package com.vector;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.context.annotation.EnableAspectJAutoProxy;import org.springframework.stereotype.Component;//标注这个类是一个切面@Aspect@Component("annotationPointCut")//开启aop注解驱动@EnableAspectJAutoProxypublic class AnnotationPointCut {    @Before("execution(* com.vector.service.UserServiceImpl.*(..))")    public void before(){        System.out.println("===方法执行前===");    }    @After("execution(* com.vector.service.UserServiceImpl.*(..))")    public void after(){        System.out.println("===方法执行后===");    }}

    MyTest.java

    public class MyTest {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");        //动态代理的是接口        UserService userService = (UserService) context.getBean("userService");        userService.add();    }}

    关于Java Spring AOP该怎么理解就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

    方法 代理 接口 动态 对象 切面 逻辑 部分 内容 切入点 新功能 方式 框架 用户 业务 功能 参数 实际 底层 文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库单元格只读怎么办 中国年龄大的软件开发者 上海机械软件开发行业 信息学院校园网络安全性分析 计算机网络技术介绍书包 gis独立软件开发 海门选择网络技术诚信经营 数据库怎样查询表中的其中一列 安全风险清单和数据库资料 网络技术工程师简笔画 cnvalues服务器 linux获取服务器密钥 成都萌果果软件开发有限公司 为什么软件开发技术都落后 jsp怎么用数据库的数据库 简单易上手的软件开发工具包 网络安全知识新的体会 数据库的session什么意思 网络技术对音乐发展 海岛奇兵机器人升级数据库 禅游科技有限公司中移互联网 网络安全高起专试卷 服务器安全狗邮件群发 校园网络安全测试 上海通信管理局网络安全评选 奥特曼传奇英雄为什么没有服务器 青岛烈焰畅游网络技术 莫凡网络安全 认知无线网络技术应用 我的世界手机饥饿服务器
    0