Spring容器的加载方式

227 阅读3分钟

Spring容器的加载方式有三种:基于XML文件的配置方式基于注解的配置方式基于Java配置类的方式

1、基于XML文件的配置方式(传统方式)

在传统方式中,需要通过编写XML文件定义bean,然后通过Spring的ClassPathXmlApplicationContext、FileSystemXmlApplicationContext等类加载应用上下文,从而完成Spring容器的初始化和bean的创建、注入等操作。 Spring的配置XML文件中主要包括:

  • bean元素:用于定义一个bean
  • property元素:用于为一个bean注入属性
  • constructor-arg元素:用于为一个bean注入构造函数参数
  • import元素:用于导入其他配置文件

下面是一个典型的Spring配置文件示例:

<beans>
    <bean id="person" class="com.example.Person">
        <property name="name" value="张三"/>
        <property name="age" value="18"/>
    </bean>
</beans>

2、基于注解的配置方式

在基于注解方式中,不需要编写XML文件,而是使用注解来定义Bean。Spring容器会扫描带有特定注解的类,然后自动将它们转换为bean并存储在容器中。 常见的注解包括:

  • @Component:标识一个类为组件
  • @Repository:标识一个类为数据访问组件
  • @Service:标识一个类为业务逻辑组件
  • @Controller:标识一个类为控制器组件
  • @Autowired:用于自动注入依赖的bean
  • @Qualifier:用于在@Autowired注解中指定具体的bean
  • @Value:用于注入简单属性

下面是一个典型的基于注解的Spring配置示例:

@Component
public class Person {
    @Value("张三")
    private String name;
    @Value("18")
    private int age;
    //...
}

在应用程序中,通过使用AnnotationConfigApplicationContext来加载应用程序上下文。

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.scan("com.example"); //设置需要扫描的包
context.refresh(); //刷新容器

3、基于Java配置类的方式

在基于Java配置类的方式中,需要定义一个Java配置类,通过Java代码来配置Bean和相应的Bean依赖关系。Java配置类中通常使用@Configuration和@Bean注解来定义Bean。 @Configuration标注在类上,表示该类是一个配置类,类中的方法都是Bean的定义方法。在@Bean标注的方法中,返回值即为一个Bean实例。 常用的注解包括:

  • @Configuration:标识一个类为配置类
  • @Bean:用于定义一个Bean
  • @Import:用于导入其他配置类
  • @Autowired:用于自动注入依赖的Bean
  • @Qualifier:用于在@Autowired注解中指定具体的Bean

下面是一个典型的基于Java配置类的Spring配置示例:

@Configuration
public class AppConfig {
    @Bean
    public Person person() {
        Person person = new Person();
        person.setName("张三");
        person.setAge(18);
        return person;
    }
}

在应用程序中,也可以使用AnnotationConfigApplicationContext来加载应用程序上下文。

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(AppConfig.class); //注册配置类
context.refresh(); //刷新容器

以上是三种常见的Spring容器加载方式。开发者可以根据项目需求选择合适的方式。

4、BeanFactory 和 ApplicationContext的区别?

BeanFactory和ApplicationContext都是Spring框架中的两个重要接口,它们之间的主要区别如下:

  1. 初始化时间不同:
  • BeanFactory:BeanFactory是Spring IOC容器的基础接口,它是一种延迟初始化机制。也就是说,当应用程序需要获取一个Bean时,才会对该Bean进行实例化。
  • ApplicationContext:ApplicationContext是BeanFactory的子接口,也被称为应用上下文。与BeanFactory不同,它在容器初始化时对所有的Bean进行实例化。
  1. 功能不同:
  • BeanFactory:BeanFactory提供了基本的依赖注入和Bean的生命周期管理。
  • ApplicationContext:ApplicationContext除了提供BeanFactory的所有功能外,还提供了一些额外的功能,比如国际化、事件通知、资源加载、AOP等。
  1. 配置文件的加载方式不同:
  • BeanFactory:BeanFactory通过BeanDefinitionReader读取配置文件并将Bean实例化。
  • ApplicationContext:ApplicationContext通过ApplicationContext的实现类读取配置文件并将Bean实例化。同时,ApplicationContext提供了多种配置文件的读取方式,如XML配置文件、Java注解配置和Java代码配置等。

综上所述,BeanFactory和ApplicationContext在功能和初始化时间上有所不同,ApplicationContext提供了更多的功能,同时在初始化时会将所有的Bean实例化,它是立即加载的,而BeanFactory则延迟加载的。