Spring IoC如何存取Bean对象
小王学习录
IoC(Inversion of Control)
1. 什么是IoC
Inversion of Control, 控制反转
. 所谓控制, 就是控制对象的生命周期. 对象的生命周期由创建这个对象的类控制. 有时对控制权进行反转, 可以起到很好的编程效果, 从而完成特定的功能.
例如: 创建了一个对象, 称为对象1, 对象1要依赖于对象2, 对象2要依赖于对象3.
如果在对象1中创建对象2, 在对象2中创建对象3. (也就是对象3的控制权在类2中, 对象2的控制权在类1中)
当改变一个类的构造方法时, 如在构造方法中增加参数, 同时也需要对依赖这个类的类中的代码进行修改.
也就是如果此时要对类3的构造函数进行修改, 同时类2和类1中的构造函数也要进行修改. 这就造成了高耦合.
如果将创建对象的操作都在类1中进行, 也就是将控制权反转给类1, 那么此时如果要对类3的构造函数进行修改, 只需要对类1和类3的构造函数进行修改即可了.
2. 什么是Spring IoC
上面已经介绍了IoC控制反转, 所谓Spring IoC就是将控制权交给Spring
, 即将对象的创建以及后续的管理(对象的生命周期交给Spring). 实际上IoC是Spring框架中的一个核心理念
, 因此, Spring也可以看作是实现了IoC功能的容器(框架), 是一个包含了众多工具和方法的IoC容器.
Spring容器中用于存储JavaBean对象, 既然是容器, 就又有了两大核心功能, 即对象(Bean)的存和取
.
3. 什么是DI
Dependency Injection, 依赖注入
. 是将依赖的某个对象注入到当前类的行为.
DI依赖注入是一种技术
, 而IoC是一种思想
. Spring为IoC提供了容器. 而依赖注入是用于解决容器中取Bean的技术之一. 因此可以说DI是IoC的一种实现.
IoC(Inversion of Control)和DI(Dependency Injection)通常被认为是同一件事的不同表述
,因为它们都涉及到将控制权从应用程序本身转移到外部容器
,并通过容器来管理对象的创建、装配和生命周期。
在通过将对象之间的关系交给外部容器来实现解耦、可维护和可测试这件事中. IoC强调的是控制的反转
,即应用程序不再控制对象的创建和生命周期,而是将这些任务交给外部容器。而DI强调的是依赖的注入
,即对象不再负责自己依赖关系的创建,而是通过外部注入的方式获取依赖。
4. Spring IoC的作用
- Spring IoC通过控制反转的思想, 将对象的创建和管理交给了Spring, 实现了
解耦
- 使用对象时更加
方便
. 程序员不必关注对象的创建以及这个对象背后的依赖关系, 而是直接向Spring容器中通过DI取对象, 当不需要再利用此对象时, 再交给Spring继续对对象进行管理即可. - 创建对象更加
高效
. 对于一个类的实例来说, 不必再进行重复的创建操作, 而是由Spring创建(默认是单例的), 每当有程序要用到实例时, 直接从Spring中取即可.
存储Bean对象
spring作为一个容器, 要完成的两大核心功能是存储Bean对象和取出Bean对象.
存储Bean对象需要先创建Bean, 然后将Bean注册到Spring容器中.
1. 创建Bean
所谓Bean对象就是java中的普通对象. 在Spring中, 将被多次使用(取)的对象称为Bean对象. 创建Bean很简单, 和之前创建一个类的写法无异. 以下是创建一个简单的Bean
public class UseController {
public void print(){
System.out.println("do_useController");
}
}
2. 将Bean注册到Spring中.
- 首先要在resources目录下创建一个spring配置文件(spring-config.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">
</beans>
- 将bean注册到spring中, 这一步也很简单. 在配置文件中加入如下代码
<bean id="useController" class="com.annotation.UseController"></bean>
id是对象名, class是类的路径. 以上步骤就将useControoller这个Bean对象存储到Spring中了, 接下来我们看如何从Spring中吧Bean取出来.
取Bean对象.
取Bean对象分为以下两步:
- 获取Spring上下文信息. Bean对象交由Spring进行管理, 因此要想获取到Bean对象, 就需要先获取Spring上下文信息.
- 使用getBean方法获取Bean对象.
1. 获取Spring上下文信息
在获取Spring上下文信息时, 需要获取Spring的配置信息. 即xml文件.
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("Spring-config.xml");
获取Spring上下文信息除了使用ApplicationContext外, 还可以使用BeanFactory, 如下代码
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("Spring-config.xml"));
使用ApplicationContext和BeanFactory的区别
继承关系和功能??来说
:Spring 容器有两个接?:BeanFactory 和
ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能?,? ApplicationContext属于 BeanFactory 的?类
,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化?持、资源访问?持、以及事件传播等??的?持。
从性能??来说
:ApplicationContext 是在Spring框架使用时?次性加载并初始化所有的 Bean对象, BeanFactory 是需要哪个才去加载哪个,因此更加轻量。
2. 获取指定Bean对象
获取指定Bean对象有以下三种写法:
UseController useController =
(UseController) applicationContext.getBean("useController");
//这种方法不适于同一类有多个Bean对象的情况.
//因为当同一类有多个Bean对象时, 不知道具体要获取UseController的哪个对象
UseController useController =
applicationContext.getBean(UseController.class);
UseController useController =
applicationContext.getBean("useController", UseController.class);
本篇文章到此结束, 下篇文章将具体介绍如何通过更简单的方式(基于注解)来存取Bean对象.
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!