手动从spring BeanFactory 获取bean (二)

本文详细介绍了如何在Spring框架中实现自定义的BeanFactoryAware接口,解释了接口中的唯一方法setBeanFactory的作用及应用,并通过配置文件展示了如何在ApplicationContext中注入自定义BeanFactory实例。

自己的类 实现org.springframework.beans.factory.BeanFactoryAware 接口

BeanFactoryAware 接口中只有一个方法 setBeanFactory(BeanFactory beanFactory)

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;

public class SpringBeanFactory implements BeanFactoryAware {

	private static BeanFactory beanFactory;
	
	public static Object getBean(String beanName) {
		 return beanFactory.getBean(beanName);
	}
	
	public static <T> T getBean(String beanName, Class<T> clazs) {
		 return clazs.cast(getBean(beanName));
	}
	
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		SpringBeanFactory.beanFactory = beanFactory;
	}
}


applicationContext.xml

<bean id="springBeanFactory" class="com.xx.service.util.SpringBeanFactory" />

遗留一个问题

spring 容器什么时候 会调用BeanFactoryAware 实现类 也就是说调用SpringBeanFactory setBeanFactory方法 ?

Spring 框架中,获取 Bean 对象是应用开发中的核心操作之一,Spring 提供了多种灵活的机制来实现这一目的。以下是几种常见的方式: ### 一、自动注入方式 通过使用 `@Autowired` 注解,可以实现自动注入 Bean。这种方式是 Spring 推荐的方式之一,它可以在字段、构造函数、方法等位置使用。例如: ```java @Service public class MyService { // ... } @Component public class MyComponent { @Autowired private MyService myService; } ``` 这种方式简化了代码,避免了手动从容器中获取 Bean 的繁琐操作[^1]。 ### 、从 ApplicationContext 手动获取 Bean 可以通过 `ApplicationContext` 获取 Bean,这是一种手动获取 Bean 的方式。通常在配置类或工具类中使用这种方式。例如: ```java ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); MyService myService = (MyService) context.getBean("myService"); ``` 这种方法适用于需要动态获取 Bean 的场景,但需要注意 Bean 的名称和类型是否匹配[^2]。 ### 三、使用 BeanFactory 获取 Bean `BeanFactory` 是 Spring 容器的基础接口,也可以用于获取 Bean。虽然 `ApplicationContext` 是其子接口并提供了更多功能,但在某些轻量级场景中,直接使用 `BeanFactory` 也是可行的。例如: ```java BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml")); MyService myService = (MyService) factory.getBean("myService"); ``` 这种方式适用于资源受限的环境,但功能相对较少[^1]。 ### 四、继承 ApplicationObjectSupport 获取 Bean 通过继承 `ApplicationObjectSupport` 抽象类,可以提供一个工具类来获取 Bean。例如: ```java @Service public class SpringContextHelper extends ApplicationObjectSupport { public Object getBean(String beanName) { return getApplicationContext().getBean(beanName); } } ``` 这种方式可以提供一个统一的接口来获取 Bean,适用于需要全局访问 Bean 的场景[^4]。 ### 五、使用静态工具类获取 Bean 可以通过自定义静态工具类来封装 `ApplicationContext` 的获取逻辑,从而实现全局访问 Bean 的能力。例如: ```java @Component public class SpringContextUtil implements ApplicationContextAware { private static ApplicationContext context; public static <T> T getBean(Class<T> beanClass) { return context.getBean(beanClass); } @Override public void setApplicationContext(ApplicationContext applicationContext) { context = applicationContext; } } ``` 这种方式可以避免重复注入 `ApplicationContext`,提高代码的可维护性[^1]。 ### 六、通过 @Resource 注解获取 Bean `@Resource` 注解也可以用于注入 Bean,与 `@Autowired` 类似,但它默认按名称注入。例如: ```java @Component public class MyComponent { @Resource(name = "myService") private MyService myService; } ``` 这种方式适用于需要明确指定 Bean 名称的场景[^1]。 ### 七、通过构造函数或方法注入 除了字段注入,还可以通过构造函数或方法注入 Bean。例如: ```java @Service public class MyService { // ... } @Component public class MyComponent { private final MyService myService; @Autowired public MyComponent(MyService myService) { this.myService = myService; } } ``` 这种方式可以提高代码的可测试性和可维护性[^1]。 ### 八、通过 @Qualifier 配合 @Autowired 注入 当存在多个相同类型的 Bean 时,可以使用 `@Qualifier` 注解来指定具体的 Bean 名称。例如: ```java @Component public class MyComponent { @Autowired @Qualifier("myService1") private MyService myService; } ``` 这种方式可以解决类型冲突的问题[^1]。 ### 九、通过工厂方法获取 Bean Spring 还支持通过工厂方法创建和获取 Bean,这可以通过配置文件或注解实现。例如: ```java @Configuration public class AppConfig { @Bean public MyService myService() { return new MyServiceImpl(); } } ``` 这种方式适用于需要自定义 Bean 创建逻辑的场景。 ### 十、通过 @Primary 注解指定首选 Bean 当存在多个相同类型的 Bean 时,可以使用 `@Primary` 注解标记某个 Bean 为首选 Bean。例如: ```java @Service @Primary public class MyServicePrimary implements MyService { // ... } @Service public class MyServiceSecondary implements MyService { // ... } ``` 这种方式可以避免手动指定 Bean 名称,提高代码的简洁性[^1]。 ### 总结 Spring 提供了多种获取 Bean 的方式,开发者可以根据具体需求选择合适的方法。无论是自动注入还是手动获取Spring 的灵活性和强大功能都能满足不同场景的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值