spring源码概览

1.反射:动态拿到类的元数据

2.核心源码原理:

package com.example.demo1.spring;

import org.springframework.beans.factory.annotation.Autowired;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.stream.Stream;

public class UserController {

    public static void main(String[] args) throws Exception {

        UserController userController = new UserController();
        Class<? extends UserController> clazz = userController.getClass();
        Field userServiceField = clazz.getDeclaredField("userService");
        String name = userServiceField.getName();
        String setMethond = "set" + name.substring(0, 1).toUpperCase() + name.substring(1, name.length());
        UserService userService = new UserService();
//        userServiceField.setAccessible(true);
//        userServiceField.set(userController, userService);
        Method method = clazz.getMethod(setMethond, UserService.class);
        method.invoke(userController, userService);


        //注解扫描
        Stream.of(clazz.getDeclaredFields()).forEach(field -> {
            String fieldName = field.getName();
            Autowired annotation = field.getAnnotation(Autowired.class);
            if (annotation != null) {
                field.setAccessible(true);
                Class<?> type = field.getType();
                try {
                    Object o = type.getConstructor().newInstance();
                    field.set(userController, o);
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private UserService userService;

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    static class UserService {

    }
}

3.创建对象(实例化)之前或者之后会有对对象的增强,proccessor(扩展性)

4.设计模式:

为实现扩展性的编码模式,在创建对象之前做一些操作,在容器初始化之前可以做一些操作,在不同的阶段发出不同的事件,做一些操作,抽象出各个接口,面向接口编程,抽象出接口或者定义接口。

5.解耦:

模块化,全部拆成模块,想用啥自己引用就行,

6.上下文:划定一个范围,里面的相关环境数据就是上下文

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Cloud是一个用于构建分布式系统的开发工具包。它基于Spring Boot构建,提供了一组工具和服务,用于解决分布式系统中的常见问题,例如配置管理、服务发现、负载均衡、断路器、路由、微服务追踪等。 Spring Cloud包含许多子项目,例如Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Bus、Spring Cloud Sleuth等。这些子项目提供了不同的功能和服务,但它们都是基于Spring Cloud的核心理念构建的。 在Spring Cloud中,微服务是通过Spring Boot应用程序来实现的。每个微服务都是一个独立的应用程序,可以单独构建、部署和运行。微服务之间通过REST API进行通信,从而实现分布式系统的功能。 Spring Cloud Config是Spring Cloud的一个子项目,用于配置管理。它提供了一个中心化的配置服务器,可以将应用程序的配置信息存储在一个统一的地方。所有的微服务都可以从配置服务器中获取它们自己的配置信息。这样,当配置信息发生变化时,可以通过修改配置服务器上的配置文件来更新整个系统的配置信息。 Spring Cloud Netflix是Spring Cloud的另一个子项目,它提供了一组工具和服务,用于构建基于Netflix OSS的微服务应用程序。Netflix OSS是一个开源项目,包含一组工具和服务,用于构建分布式系统。Spring Cloud Netflix包括以下几个组件:Eureka、Zuul、Ribbon、Hystrix、Feign等。 Eureka是一个服务发现组件,用于实现微服务之间的服务发现和注册。每个微服务都会向Eureka注册中心注册自己的服务信息,包括服务名称、服务地址、服务端口等。当一个微服务需要调用另一个微服务时,它可以通过Eureka查询到目标服务的地址和端口。 Zuul是一个网关组件,用于实现微服务之间的路由和负载均衡。所有的微服务都可以通过Zuul进行访问,从而可以实现请求的路由和负载均衡。 Ribbon是一个客户端负载均衡组件,用于实现微服务之间的负载均衡。当一个微服务需要调用另一个微服务时,它可以通过Ribbon选择一个可用的服务实例进行调用。 Hystrix是一个断路器组件,用于实现微服务之间的容错和降级。当一个微服务发生故障或者响应时间过长时,Hystrix会自动断开与该微服务的连接,从而避免整个系统的崩溃。 Feign是一个声明式REST客户端,用于实现微服务之间的通信。它可以自动将Java接口转换成REST API,从而使得微服务之间的通信更加简单和方便。 Spring Cloud Bus是Spring Cloud的另一个子项目,它用于实现微服务之间的消息总线。当一个微服务的配置信息发生变化时,它会向消息总线发送一条消息,所有的微服务都可以接收到这条消息并更新自己的配置信息。 Spring Cloud Sleuth是Spring Cloud的另一个子项目,它用于实现微服务之间的追踪和监控。它可以自动为微服务生成唯一的跟踪ID,并将该ID传递给微服务之间的请求和响应。从而可以实现对微服务之间的请求和响应的跟踪和监控。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值