1.xml配置 无参构造
<bean id="xxx" class="xxx"> 复制代码
静态工厂
<bean id="xxx" class="xxx" factory-method="xxx"> 复制代码
实例工厂
<bean id="factoryBean" class="xxx"> <bean id="xxx" class="xxx" factory-bean="factoryBean" factory-method="xxx"> 复制代码
2.注解
@Componse、@Service、@Controller、@Repository
3.javaConfig
@Configuration public classUserConfiguration{ @Bean public User user(){ return new User(); } } 复制代码
4.使用@Import,一般在自定义扩展的时候使用
@Import(User.class) public class webApplication{ public static void main(String[] args){ } } 复制代码
5.实现ImportSelector或者ImportBeanDefinitionRegistrar接口
这个一般会结合@Import一起使用,通过扩展自定义注解的方式来实现动态Bean注入
// 设置class public class MyImportSelector implements ImpportSelector{ @Override public String[] selectImports(AnnotationMetadata annotationMetadata){ return new String[]{User.class.getName()}; } } // 创建自定义的BeanDefinition public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{ @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry){ BeanDefinition beanDefinition = new RootBeanDefinition(User.class.getName()); beanDefinitionRegistry.registerBeanDefinition(User.class.getName(),beanDefinition); } } 复制代码
@Retention(RetentionPolicy.RUNTIME) @Documented @Target(ElementType.TYPE) @Import({MyImportSelector.class,MyImportBeanDefinitionRegistrar.class}) public @interface EnableImportSelector { String value(); } 复制代码
6.手动注入Bean实例,或者BeanDefinition
@Component public class LocationRegister implements BeanFactoryAware { @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { DefaultListableBeanFactory listableBeanFactory = (DefaultListableBeanFactory)beanFactory; //方式1 // Location location = new Location(); // listableBeanFactory.registerSingleton(Location.class.getName(),location); //方式2 BeanDefinition locationBeanDefinition = new RootBeanDefinition(Location.class); listableBeanFactory.registerBeanDefinition(Location.class.getName(),locationBeanDefinition); } } 复制代码
7.FactoryBean实现Bean注入
实现FactoryBean接口,重写getObject()方法
8.通过Supplier方式创建Bean
// 方式1 AnnotationConfigApplicationContext.registerBean("user",new Supplier<User>(){ @Override public User get(){ return new User(); } }); // 方式2 GenericBeanDefinition beanDefinition=new GenericBeanDefinition(); beanDefinition.setInstanceSupplier(()->new User()); AnnotationConfigApplicationContext.registerBeanDefinition("user", beanDefinition); 复制代码
9.通过Spring boot starter的方式
在resources下创建META-INF/spring.factories文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.test.UserConfiguration 复制代码
public class UserConfiguration{ @Bean public User user(){ return new User(); } } 复制代码
以上9种创建Bean的方式,你用过几种?