Spring创建Bean的6种方式

Spring创建Bean的6种方式

方式一 xml

xml

方式二 @Component

@Component
@Service
@Controller
@Repository
...

不多说明

方式三 @Bean

@Bean
@Configuration
public class RedisConfig {
    @Bean
    public RedisUtil redisUtil(RedisTemplate<String, Object> redisTemplate) {
        RedisUtil redisUtil = new RedisUtil();
        redisUtil.setRedisTemplate(redisTemplate);
        return redisUtil;
    }
}

@Configuration用来表示这是一个SpringBoot配置类,会扫描其中的@Bean注解
@Bean是加在方法上的,作用是将这个方法返回的对象添加到IOC容器中
@Bean(name="")可以自定义beanName
同一种类型可以有多个,但必须指定不同的beanName

方式四 @Import

@Import(TestBean.class)

方式五 ImportSelector

// 配合@Import可以实现平时使用的@EnableXXX注解的效果
ImportSelector
ImportBeanDefinitionRegistrar

实现ImportSelector

public class TestImportSelector implements ImportSelector {
	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		return new String[]{TestBean.class.getName()};
	}
}
@Import(TestImportSelector.class)

实现ImportBeanDefinitionRegistrar

可以自定义beanDefinition

public class TestImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		RootBeanDefinition definition = new RootBeanDefinition("testBean2");
		registry.registerBeanDefinition(TestBean.class.getName(), definition);
	}
}
@Import(TestImportBeanDefinitionRegistrar.class)

自定义@EnableXXX

@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
@Import({TestImportBeanDefinitionRegistrar.class,TestImportSelector.class})
public @interface EnableXXX{

    String value();

}

方式六 BeanFactoryAware

可以创建自己多个需要的bean
例如维护多个不同的redisTemplate对象

BeanFactoryAware
public class TestUtil implements BeanFactoryAware {

	private static BeanFactory beanFactory;

	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		DefaultListableBeanFactory listableBeanFactory = (DefaultListableBeanFactory) beanFactory;
		listableBeanFactory.registerSingleton("user1", new User(1));
		listableBeanFactory.registerSingleton("user2", new User(2));
		TestUtil.beanFactory = beanFactory;
	}
}

setBeanFactory方法中可以使用@Autowired注入的对象,以及@Value获取的配置,因为这个方法是执行在spring自动装配的bean完成之后才会执行

发布了37 篇原创文章 · 获赞 1 · 访问量 1056

猜你喜欢

转载自blog.csdn.net/zhuchencn/article/details/103823867