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配置,新手接手项目的门槛大大降低。而代价不过是放弃那天知道什么时候才可能用的上“彻底解耦”的能力。所以是值得的。