已解决
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 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 测试用例设计方法 —— 场景法详解
- 下一篇: JavaScript 基础 - 第1天