spring容器的工作原理如下:
比如在web应用中,你提供了一系列Controller、Service、Component类等,要想让它们能够被放入spring容器,并按照依赖关系组织起来,你需要告诉spring它们之间的关系,这个需要告诉spring容器的就叫做“配置元数据”(元数据就是描述数据的数据)。
元数据的形式:
1.XML
这是一种传统的方式,在java1.5支持注解前,都是这么使用的。在spring2.5版本引入@Autowired、@Service、@Component等注解,可以把一些类的依赖关系从xml中解脱出来,放到pojo中。这样就可以大大减少xml文件中的<bean>标签,因为可以在xml中像下面这样配置:
<beans>
<context:component-scan base-package="com.acme"/>
</beans>
然后,在base-package包中的类上加上@Controller、@Service、@Component等注解。
2.基于Java类的方式
spring3.0开始引入,如@Configuration, @Bean, @Import这些注解,这种方式允许把配置信息放入java类中,这样可以彻底摆脱xml文件,把所有的配置信息都放到类中。
不使用xml方式,通过编码方式使用纯注解启动spring容器:
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = ctx.getBean(MyService.class);
myService.doStuff();
}
需要说明的是,spring容器并没有和哪一种提供元数据的方式耦合,你可以随意使用上述的2种形式,也可以混合使用。比如在基于java类的配置方式中,你也可以用@ImportResource来引入别的XML文件,类似于传统的<import>标签。不过现在大家都倾向于使用基于java类的方式了。
参考资料:
1.https://docs.spring.io/spring/docs/5.1.5.RELEASE/spring-framework-reference/core.html#spring-core