Spring的IOC容器类别概述
Spring的IOC该如何理解呢?
平常在一个方法当中,若要用到外部另一个类里的非静态方法,首先,需要先通过new一个对象,再根据这个对象去调用其方法。若只需要一两个对象还好,一旦涉及的外部对象多了,就要创建一大堆new,管理起来就很麻烦。这时候,IOC的思想就起到关键作用了,它可以实现把创对象创建与操作统一交给框架管理。那么,新创建的对象都是怎么存在spring框架当中的呢?其实,这里面就用到了Map缓存。你可以简单这样理解,spring就像一个map容器,bean都存放在这个map里,若要用到map里存放的对象,就可以通过一个key去map里获取,这个key,可以是id或者bean的默认名。
以后,若要用到这个对象,例如spring最简单的如注解方式——
@Resource
private DemoService demoService;
如此定义之后,Spring框架就会帮我们自动创建一个DemoService单例对象,然后将demoService引用指向对象的地址,接下来,就可以直接通过引用demoService变量调用DemoService里的方法了。至于Spring如何通过注解方式来实现调用Bean对象的,后面会专门写一篇文章介绍。
Spring给我们提供两种类型的IoC容器实现,通过这两种IOC容易,可以生成bean,并获取bean:
- 实现了BeanFactory接口的基本IoC容器。
- 实现了ApplicationContext接口的高级IoC容器。
实现BeanFactory接口的基本IoC容器一般如下:
@Test
public void createWithNullTarget() {
Resource resource = new ClassPathResource("myBean.xml");
// 构造工厂
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
// 新增Xml阅读器
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
// 规则注册入容器
reader.loadBeanDefinitions(resource);
Pet person = factory.getBean(Pet.class);
System.out.println(person.toString());
}
实现了ApplicationContext接口的高级IoC容器一般如下:
XXXServiceImpl XXXService = SpringContextUtils.getBean(XXXServiceImpl.class);
再封装SpringContextUtils工具——
@Component
public class SpringContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
}
实际应用当中,多是使用ApplicationContext接口的高级IoC容器来获取Spring管理的bean。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!