你的浏览器不支持canvas

做你害怕做的事情,然后你会发现,不过如此。

Spring bean的几种加载方式

时间: 作者: 黄运鑫

本文章属原创文章,未经作者许可,禁止转载,复制,下载,以及用作商业用途。原作者保留所有解释权。


1.在xml配置文件中加载bean

<bean id="user" class="com.test.bean.user"/>

2.使用@Component类注解加载bean

  • 需要注意:类必须在扫描范围ComponentScan内,否则注解不生效
  • @Component有三个常用的衍生注解
    • @Controller:用于控制层
    • @Service:用于服务层,处理业务
    • @Repository:用于数据层,访问数据
@Component
public class User {
}

3.使用@Bean注解加载bean

  • 有两种实现方式
    • 第一种是在配置类中直接创建对象return new User()
    • 第二种是实现FactoryBean

3.1 配置类中直接创建对象

@Configuration
public class MyConfig {
    @Bean
    public User user(){
        return new User();
    }
}

3.2 实现FactoryBean

  • 创建UserFactoryBean类,并实现FactoryBean
public class UserFactoryBean implements FactoryBean<User> {
    @Override
    public User getObject() throws Exception {
        return new User();
    }

    @Override
    public Class<?> getObjectType() {
        return User.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}
  • 配置类中使用UserFactoryBean加载bean
@Configuration
public class MyConfig {
    @Bean
    public UserFactoryBean user(){
        return new UserFactoryBean();
    }
}

4.使用@ImportResource导入bean

  • @ImportResource用于从指定配置文件加载bean

  • 创建配置文件config1.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="com.test.bean.User"/>
</beans>
  • 配置类使用@ImportResource导入配置文件
@Configuration
@ImportResource("config1.xml")
public class MyConfig {
}

5.使用@Import导入bean

  • @Import有多方式

5.1 @Import将指定的类加载为bean

  • 配置类中使用@Import指定需要加载的bean
@Configuration
@Import({User.class, Role.class})
public class MyConfig {
}

5.2 导入ImportSelector

  • 这种方式的好处是可以通过AnnotationMetadata获取到MyConfig配置类的相关信息
  • 创建MyImportSelector类,并实现ImportSelector
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"com.test.bean.User", "com.test.bean.Role"};
    }
}
  • 配置类中使用@Import导入MyImportSelector
@Configuration
@Import(MyImportSelector.class)
public class MyConfig {
}

5.3 导入ImportBeanDefinitionRegistrar

  • 创建MyBeanRegistrar类,并实现ImportBeanDefinitionRegistrar
public class MyBeanRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
        AbstractBeanDefinition definition = BeanDefinitionBuilder.rootBeanDefinition(User.class)
            .getBeanDefinition();
        registry.registerBeanDefinition("user", definition);
    }
}
  • 配置类中使用@Import导入MyBeanRegistrar
@Configuration
@Import(MyBeanRegistrar.class)
public class MyConfig {
}

5.4 导入BeanDefinitionRegistryPostProcessor

  • 这种方式的好处是可以对bean进行后处理,可以修改已经加载的bean或添加自定义的bean
  • 创建MyBeanPostProcessor类,并实现BeanDefinitionRegistryPostProcessor
public class MyBeanPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
        AbstractBeanDefinition definition = BeanDefinitionBuilder.rootBeanDefinition(User.class)
            .getBeanDefinition();
        registry.registerBeanDefinition("user", definition);
    }
}
  • 配置类中使用@Import导入MyBeanPostProcessor
@Configuration
@Import(MyBeanPostProcessor.class)
public class MyConfig {
}

6.使用AnnotationConfigApplicationContext注册bean

public static void main(String[] args) {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class);
    ctx.register(User.class);
    System.out.println(ctx.getBean("user"));
}

对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。