当前位置:首页 > 编程笔记 > 正文
已解决

springBoot bean的多种加载方式

来自网友在路上 146846提问 提问时间:2023-11-03 02:20:39阅读次数: 46

最佳答案 问答题库468位专家为你答疑解惑

1、通过xml

2、通过注解@Component及其衍生注解@Controller、@Service、@Repository定义bean

    例子:

        @Component

       public void Car{

       }

3、使用@Configuration定义成一个配置类

     @Configuration

      public void Car{

       }

4、实现FactoryBean

       例子:        

public class Car {
}
public class CarFactoryBean implements FactoryBean<Car> {@Overridepublic Car getObject() throws Exception {Car car = new Car();//创建这个bean前,在这边可以自定义处理一些业务逻辑return car;}@Overridepublic Class<?> getObjectType() {return Car.class;}@Overridepublic boolean isSingleton() {return FactoryBean.super.isSingleton();}
}
@Configuration
public class SpConfig {@Beanpublic CarFactoryBean car(){return new CarFactoryBean();}
}

5、加载配置类并加载配置文件

例子:

public class Car {
}

app.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="car" class="com.melax.ailatest.bean.Car"></bean>
</beans>
@Configuration
@ImportResource("app.xml")
public class SpConfig2 {}

6、使用@Import注解方式导入,被导入的bean无需使用注解申明为bean

public class Car {
}
@Import({Car.class})
public class SpConfig3 {}

7、导入实现了ImportSelector接口的类,实现了对导入源的编程时处理

示例:

public class Car {
}
public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {//各种条件判断boolean b = importingClassMetadata.hasAnnotation("org.springframework.context.annotation.Import");System.out.println("flag:"+b);if (b){return new String[]{"com.melax.ailatest.bean.car"};}else {return new String[0];}}
}
@Import({MyImportSelector.class})
public class SpConfig4 {}

8、导入实现了ImportBeanDefinitionRegistrar接口的类,通过BeanDefinition注册器注册实名bean,实现对容器中bean的裁定,例如对现有bean的覆盖,进而达成不修改源代码的情况下更换实现的效果

public class Car {
}
public class Dog {
}
public class MyImportBeanDefinition implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Dog.class).getBeanDefinition();//实现对car bean的覆盖,当前car的对象是dogregistry.registerBeanDefinition("car",beanDefinition);}
}
@Import({MyImportBeanDefinition.class})
public class SpConfig5 {@Beanpublic Car car(){return new Car();}
}

9、导入实现了BeanDefinitionRegistryPostProcessor接口的类,通过BeanDefinition的注册器注册实名bean实现对容器中bean的最终定义

public class Car {
}
public class Car2 {private String name;@Overridepublic String toString() {return "Car2{" +"name='" + name + '\'' +'}';}
}
public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {//各种条件判断boolean b = importingClassMetadata.hasAnnotation("org.springframework.context.annotation.Import");System.out.println("flag:"+b);if (b){return new String[]{"com.melax.ailatest.bean.car"};}else {return new String[0];}}
}
@Import({MyPostProcessor.class})
public class SpConfig6 {@Beanpublic Car car(){return new Car();}
}

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"springBoot bean的多种加载方式":http://eshow365.cn/6-30703-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!