本文介绍: IoC (Inversion of Control 控制反转)是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序手动创建对象控制权,交由给 Spring 框架管理。AOP(Aspect Oriented Programming)即面向切面编程。AOP 的目的是将横切关注点(例如日志管理事务管理权限控制接口控制)从核心业务逻辑中分离出来,通过动态代理字节操作技术实现代码复用和解耦,提高代码的可维护性和可扩展性。OOP(面向对象编程

Spring IOC

什么是 IoC ?

IoC (Inversion of Control 控制反转)是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序手动创建对象控制权,交由给 Spring 框架管理

为什么叫控制反转?

        将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器来完成对象的注入。这样可以很大程度上简化应用开发,并做到解耦合,把应用复杂依赖关系中抽取出来,开发人员需要关注对象使用,而不需要关心对象如何创建的。

        在实际项目中,一个 Service 类可能依赖很多其他的类。假如我们需要实例化这个 Service ,每次都需要搞清楚这个 Service 所有底层类的构造函数。如果使用 IoC的话,只需要配置好Bean ,在需要的地方注入就行了,大大降低了项目的可维护性和开发难度

什么是 Spring Bean?

可以简单理解为 Bean 指代的就是那些 被 IoC 容器所管理的对象。一般在 Spring Boot使用以下几种注解声明:

IoC 和 DI 有什么区别

IoC 可以理解为以中国控制反转的设计思想,而 DI 可以理解为这种设计思想的具体实现方式

IoC 解决了什么问题

  1. 对象之间的耦合度降低
  2. 资源管理变得容易

例如,一个针对 User 的操作,利用 Service 和 Dao 层进行开发

没有使用 IoC 思想的情况下,Service 层想要使用 Dao 层的话,需要通过 new 关键字UserServiceImpl 手动 new 一个 UserDao 的具体实现 UserDaoImpl

但是,如果开发过程中出现新的需求针对 UserDao 接口 开发出另一个 具体的实现类。由于 Service依赖了 UserDao 的具体实现,所以我们需要修改 UserServiceImpl 中 new 的对象。这就导致,如果我们项目中很多地方都依赖于 UserDao 的实现类的话,就需要修改每一处,这就导致维护起来非常麻烦。

使用 IoC 的思想,我们将对象的控制权交给 Spring 容器管理后,我们使用的时候直接向 IoC 容器 “要” 就行了。


Spring AOP

什么是 AOP?

AOP(Aspect Oriented Programming)即面向切面编程

AOP 的目的是将横切关注点(例如日志管理、事务管理权限控制、接口控制)从核心业务逻辑中分离出来,通过动态代理字节操作技术实现代码复用和解耦,提高代码的可维护性和可扩展性

OOP(面向对象编程

AOP 和 OOP 其实并不冲突,两者互补

OOP的目的是将业务逻辑按照对象的属性行为进行封装,通过类、对象、继承、多态概念,实现代码的模块化和层次化,提高代码的可读性和可维护性

AOP 为什么面向切面编程

因为 AOP 的核心思想是将横切关注点从核心业务逻辑中分离出来,形成一个一个的切面。

使用示例

AOP解决了什么问题

OOP不能很好的处理一些分散在多个类或对象中的公共行为,这些行为通常被称为 横切关注点 。如果我们每个类或者对象中都重复实现这些行为就会导致代码的冗余、复杂和难以维护。

AOP 可以将横切关注点 从 核心业务逻辑 中分离出来,实现关注点的分离。

比如说日志记录记录每次访问请求参数信息


@Aspect
@Slf4j
@Component
@Order(0)
public class AopLog {

    private static final String START_TIME = "request-start";
    /**
    *切入点
    * */
    @Pointcut("execution( * com.whgcdx.demo1.controller..*Controller.*(..))")
    public void log(){}

    /**
     * 环绕操作
     */
    @Around("log()")
    public Object aroundLog(ProceedingJoinPoint point) throws Throwable {
        Object result = point.proceed();
        log.info("【返回值】:{}", JSON.toJSONString(result));
        return result;
    }

    /***
     * 前置操作
     */
    @Before("log()")
    public void beforeLog(JoinPoint point){
        //利用 RequestContextHolder 获取 HttpServletRequest 对象
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
        UserAgent userAgent = UserAgentUtil.parse(httpServletRequest.getHeader(Header.USER_AGENT.toString()));

        //重组请求信息
        StringBuffer sb = new StringBuffer();
        sb.append("---------------------------------收到请求-------------------------------------------");
        sb.append("rn【浏览器类型】: " + userAgent.getBrowser() + " 【版本号】: " + userAgent.getVersion());
        sb.append("rn【user-agent】: " + httpServletRequest.getHeader(Header.USER_AGENT.toString()));
        sb.append("rn【访问URL】: " + httpServletRequest.getRequestURI());
        sb.append("rn【访问Method】: " + httpServletRequest.getMethod());
        sb.append("rn【访问IP】: " + httpServletRequest.getRemoteAddr());
        sb.append("rn【访问类名】:"+ point.getSignature().getDeclaringTypeName() + ", 【访问方法名】:" + point.getSignature().getName());
        Map<String ,String[]> paramerMap = httpServletRequest.getParameterMap();
        sb.append("rn【请求参数】: " + paramerMap);

        log.info(sb.toString());

        httpServletRequest.setAttribute(START_TIME,System.currentTimeMillis());
    }



    /***
     *
     */
    @After("log()")
    public void afterLog(){
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
        Long start= (Long) request.getAttribute(START_TIME);
        Long end=System.currentTimeMillis();
        log.info("【请求耗时】:{}ms",end-start);

        String header=request.getHeader(Header.USER_AGENT.toString());
        UserAgent userAgent=UserAgentUtil.parse(header);
        log.info("【操作系统】:{},【原始User-Agent】:{}",
                userAgent.getOs().toString(),
                header);
    }


}

原文地址:https://blog.csdn.net/qq_48626761/article/details/134605541

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_12951.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注