1.xml配置
无参构造
静态工厂
实例工厂
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(){
@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();
}
}