1 xml配置
通过xml文件配置,主要是就是配置bean,指定参数值。
2 注解配置
需要在main方法中指定配置文件,下面就是用AnnotationConfigApplicationContext加载配置文件,然后启动。其他配置类需要学习一下
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(DiConfig.class);
UseFunctionService useFunctionService = context.getBean(UseFunctionService.class);
System.out.println(useFunctionService.SayHello("world"));
context.close();
}
}
在配置文件里面,
用@Configuration表明自己是配置文件,这个一定要记住,要特别熟悉。
@ComponentScan,用来指定扫描哪个目录的bean对象
@Configuration
@ComponentScan("com.wisely.highlight_spring4.ch1.di") // 这种扫描是配合注解配置用的
public class DiConfig {
}
3 代码配置
通过@Bean注解的方式,参数的设置都通过Java指定,主要是set方法指定。springboot中很多。
没用@ComponentScan,也就是说这个注解的功能是能够和一段代码互相替换的。
这种方式也很常见,要注意。
@Configuration // 这里不用@ComponentScan,不用注解配置,用java配置
public class JavaConfig {
@Bean
public FunctionService functionService() {
return new FunctionService();
}
@Bean
public UseFunctionService useFunctionService() {
UseFunctionService useFunctionService = new UseFunctionService();
useFunctionService.setFunctionService(functionService()); // 注入方式1,构造器注入
return useFunctionService;
}
// @Bean
// 注入方式2,如果某个Bean已经在容器中,可以作为参数放入另一个Bean的声明方法中
// public UseFunctionService useFunctionService(FunctionService functionService){
// UseFunctionService useFunctionService = new UseFunctionService();
// useFunctionService.setFunctionService(functionService);
// return useFunctionService;
// }
}
具体到bean类里面,就不用@Service那几个注解了。所以原来扫描注解加标记bean的注解都被代码替代了
@Autowire注解也被代码替换了
// 这里没有加注解
public class FunctionService {
public String sayHello(String word) {
return "Hello " + word + " !";
}
}
关于web开发时候,视图解析器的配置,在jsp情况下:
4 yml配置
关于web开发时候,视图解析器的配置,在jsp情况下:
springboot通过yml,大大化简前几种。
下面是默认配置的实现
5 总结对比
应用的基本配置(如数据库配置)用xml,业务配置用注解。
基本不变的用java方式,需要根据环境、业务改变的放到yml中
Java配置让你更理解你配置的Bean
全局配置使用Java配置(如数据库相关配置、MVC相关配置),业务Bean的配置使用注解配置(@Service、@Component、@Repository、@Controller)
java方式,配置写在代码里面更加直观,简单(有的配置 spring boot 自己已经做了),使用链式编程。
因为spring里面有很多配置其实一旦配置完成就不会去改变了,而且也没必要改变,例如大多数bean的依赖关系。把这些不会改变的配置都放在xml里面是没有意义的,只是会让配置越来越大,spring 3.x的时候就被诟病配置太多,已经变成了基于配置编程了,本末倒置了,所以把这些近乎静态的配置放在代码里面其实更好。
XML更方便修改,而且无需编译即可生效,所以把那些需要根据环境,业务改变的配置放在XML里面更好。
Spring Boot吸收了Rails的配置基于约定的方式,使得配置减少了很多,不过如果不熟悉它的底层是怎么配置的话,可能会遇到很多问题。
Spring时代前的Java配置是命令式的(一路写下来,依赖执行顺序),改成了XML声明式,到了Spring Boot时代,又实现了声明式的Java配置(分散在多个被注解的方法中,不依赖执行顺序)。
另外很多配置可以用application.properties覆盖,早该这样嘛!
spring的发展,采用了约定优于配置的原则。
1.xml中维护bean之间的依赖关系,随着业务逻辑的增长变得臃肿。
2.在.java中的配置效率是没有xml效率高的。