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完成之后才会执行