Springboot学习笔记(3)——依赖注入之二(Java配置)

Spring4之后推荐使用Java配置,同时也是Spring boot推荐的配置方式。

Java配置是通过@Configuration和@Bean两个注解来实现的,其步骤同注解方式基本一致。

1、编写Bean

package com.red.demo.ioc;

public class Screen {
  public String display(){
    return "我命由我不由天!";
  }
}

注意这就是一个普通的POJO类,并且不带任何注解。

2、编写使用该Bean的类(被注入的类)

package com.red.demo.ioc;

public class Cinema {
  Screen nezha;

  public void setScreen(Screen screen){
    this.nezha = screen;
  }
  public String playMovie(){
    return nezha.display();
  }
}

这个也是普通的类,不带任何注解,这是增加了一个set方法。当然也可以通过构造方法注入,在配置做相应调整即可。

3、编写配置类

package com.red.demo.ioc;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MovieConfig {

  @Bean
  public Screen screen(){ //和类名同名的方法
    return new Screen();
  }

  @Bean
  public Cinema Cinema(){ //和类名同名的方法
    Cinema cinema = new Cinema();
    cinema.setScreen(screen());
    return cinema;
  }
}

也可以直接这样写

@Configuration
public class MovieConfig {

  @Bean
  public Screen screen(){
    return new Screen();
  }

  @Bean
  public Cinema Cinema(Screen screen){
    Cinema cinema = new Cinema();
    cinema.setScreen(screen);
    return cinema;
  }
}

所有的注入信息都在这个配置类中配置。

和注解方式比较,这里少了一个@ComponentScan注解,多了两个和相关类名的同名方法,并都冠以@Bean注解。

4、运行

package com.red.demo;

import com.red.demo.ioc.Cinema;
import com.red.demo.ioc.MovieConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class DemoApplication {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MovieConfig.class);
        Cinema cinema = context.getBean(Cinema.class);
        System.out.println(cinema.playMovie());
        context.close();
    }

 【Why】关于为何在Spring4.x时,推荐使用Java配置,原因如下:

转自:https://blog.csdn.net/chaleaoch_gmail/article/details/80475992

曾经有段时间Java的生态圈走了极端,为了彻底的解耦,把“什么时候需要什么样的实现”这个问题的解决方案,写在配置文件(也就是xml里),因为xml不需要重新编译,因此达成了“彻底解耦”这个目标(我需要什么实现我就改配置文件就行了,不需要改代码,不需要重新编译),然而随着时间的发展,人们发现了以下问题 
1. 大部分时候我们并不需要解耦的如此彻底,应用级程序甚至很少遇到要到要换接口实现。 
2. xml的配置学习起来门槛太高了,就算老手看一个配置文件经常也能看的云里雾里,再加上xml文件不能做类型检查,有时候你实际上是把一个错误的类装配进接口,导致系统报错,你却要找半天错误。

因此这几年提出了新的口号叫“约定大于配置”,javaconfig实际上就是约定大于配置的产物,它做的事情和xml配置几乎相同,但是因为有类型检查且本身就是java代码的原因,它的可读性和可维护性远高于xml配置,新手接手项目的门槛大大降低。而代价不过是放弃那天知道什么时候才可能用的上“彻底解耦”的能力。所以是值得的。

原文地址:https://www.cnblogs.com/tigerhsu/p/11334238.html