@Configuration And @Bean And AnnotationConfigApplicationContext

  • 代码样例

    @Configuration
    public class AppConfig{
      @Bean(name = "user")
      public User initUser(){
          User user = new User();
          user.setId(1L);
          user.setUserName("user_name_1");
          user.setNote("note_1");
          return user;
          }
    }

@Configuration

  • 定义:

    放在类名前时代表这是Java配置文件,Spring的容器会根据它来生成IOC容器去装配Bean
    可理解为用spring的时候xml里面的标签

@Bean

  • 定义:

    方法前代表将该方法返回的POJO装配到IoC容器中,name值定义该Bean的名称,若无则默认方法名存入Spring IoC容器中
    可用于将第三方包的类对象装配至IoC内
    可理解为用spring的时候xml里面的标签

AnnotationConfigApplicationContext

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
User user = ctx.getBean(User.class);
代码中通过将JAVA配置文件AppConfig传递给AnnotationConfigApplicationContext的构造方法,读取配置然后将配置内的Bean装配到IoC容器中,于是可以使用getBean方法获取对应POJO,

@Autowired

机制

  • 根据类型(by type)与属性名称(Bean name)找到对应bean注入
  • 无法匹配(同一类型多个不同实现类或找不到实现类时)时抛出异常
  • 可标注方法(在方法上方加注解)
  • 属性可能为空时:@Autowired(required = false)

消除歧义

@Primary——优先顺序

  • 定义:修改@Autowired注入优先权的注解,在需要优先给出的类上加@Primary

    @Component
    @Primary
    public class Cat implements Animal {
      ......
    }

@Qualifier——一一对应

  • 定义:与@Autowired组合,通过类型与配置的字符串名称一起找到Bean

    @Autowired
    @Qualifier("dog")
    private Animal animal = null;

带参数构造方法类装配

public BusinessPerson(@Autowired @Qualifier("dog")  Animal animal){
    this.animal = animal;
}

微服务

单体应用

定义

一个归档包包含所有功能模块的应用程序

优点

  • 架构简单
  • 开发、测试、部署方便

缺点

  • 复杂性高(界限模糊、代码质量参差不齐)
  • 部署慢、频率低
  • 扩展能力受限

微服务(架构方法)

定义

将单体应用拆分为一组小型应用的方法,每个应用运行在自己的进程中。

特性

  • 独立进程
  • 一组独立进程共同构筑整个系统
  • 每个服务为独立的业务开发,一个微服务只关注特定的业务,如用户管理、订单管理
  • 可使用不同语言与数据存储结构
  • 微服务之间通过轻量的通信机制进行通信,如通过REST API进行调用
  • 全自动的部署机制

优点

  • 单个服务更易于开发、维护
  • 单个微服务启动较快
  • 局部修改易部署(无需修改其他服务)
  • 技术栈不受限
  • 按需伸缩(只需以单个服务的需求去扩充机器硬件,无需为整个应用伸缩)

缺点

  • 运维要求高
  • 分布式固有的复杂性

适用场景

  • 大型、复杂的项目
  • 有快速迭代的需求
  • 访问压力大的项目

不适用场景

  • 业务稳定
  • 迭代周期长

微服务拆分

  • 领域驱动设计(Domain Driven Design)

Lombok

中文使用手册
官网

常用注解
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor


@RequiredArgsConstructor

会生成一个包含常量(final),和标识了@NotNull的变量 的构造方法。

怎么使用
它们都有三个参数可以设置

  1. String staticName() default "";

如果设置了它,将原来的构造方法的访问修饰符将会变成 私有的,而外添加一个静态构造方法,参数相同,名字是设置的字符串的名字,访问修饰符为公有的。

AnyAnnotation[] onConstructor() default {};
在构造方法上添加注解。使用方法@RequiredArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}

例如我们在 Spring 项目中需要注入多个值,写很多个 @Autowired 很麻烦,就可以使用这种方式:

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class UserServiceImpl implements IUserService {
private final IUserRepository userRepository;
private final IOrderRepository orderRepository;
………………
AccessLevel access() default lombok.AccessLevel.PUBLIC;
构造函数访问修饰符;

@NoArgsConstructor无参构造函数中还有个注解 boolean force() default false;
作者的注释是 If {@code true}, initializes all final fields to 0 / null / false. Otherwise, a compile time error occurs.

设置为 true 的时候,初始化所有的参数为默认值,否则编译错误。

RestTemplate

  • SpringWeb提供的轻量级HTTP Client,用于简化HTTP调用
  • 使用方法

    RestTemplate restTemplate = new RestTemplate();
          //用HTTP GET方法请求,并返回一个对象
          String forObject = restTemplate.getForObject("http://localhost:8080/users/1",String.class);
          System.out.println(forObject);
          //占位符
          forObject = restTemplate.getForObject("http://localhost:8080/users/{id}",String.class,1);
          System.out.println(forObject);
          ResponseEntity<String> forEntity = restTemplate.getForEntity("http://localhost:8080/users/{id}",String.class,1);
          System.out.println(forEntity.getBody());
          //获取返回的状态码
          System.out.println(forEntity.getStatusCode());