Spring - IOC底层原理

1、什么是IOC

(1)控制反转,把对象的创建和创建对象的过程交给Spring进行管理
(2)使用目的主要是为了降低代码耦合

2、 ICO的底层原理

1、工厂模式、XML、反射

	//需要被使用的对象
	class UserDao{
		add(){
			.....
		}
	}
	//工厂类
	class UserFactory{
		public static UserDao getUserDao(){
			return new UserDao();
		}
	}
	//调用类
	class UserService{
		execute(){
			//由工厂类获得所需对象,耦合度降低
			UserDao dao = UserFactory().getUserDao();
			dao.add();
		}
	}

2、IOC实现解耦的过程

	//第一步 : xml配置文件中,配置创建对象
	<bean id="对象id(唯一)" class="需要创建的对象的全路径">
	//第二步:创建工厂类
	class UserFactory{
		public static UserDao getUserDao(){
			//1、xml解析
			String classValue = xml中bean的class属性值;
			//2、通过反射来创建对象
			Class clazz = Class.forName(classValue);
			//3、创建对象 (使用配置文件以及反射实现进一步降低耦合)
			return (UserDao)clazz.newInstance();
		}
	}

3、IOC(接口)

1、IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
2、Spring提供了IOC容器实现的两种方式:(两个接口)
(1)BeanFactory:IOC容器的基本实现方式,是Spring内部使用的接口,一般不使用这个接口
特点: 在加载配置文件时不会创建对象,在使用(获取)对象的时候才会去创建对象
(2)ApplictionContext:是BeanFactory接口的子接口,提供更多更强大的功能。
特点: 在加载培训文件时,会把配置文件中所有的bean都会去创建对象
(3)ApplictionContext接口的实现类

  • ClassPathXmlApplication Context:只需填写项目下配置文件的路径
ApplicationContext	context = 
		new ClassPathXmlApplicationContext("配置文件名称");
		
对象  对象名 = context.getBean("bean的id",对象.class);

  • FileSystemXmlApplicationContext:在使用时需要写上配置文件在电脑系统中的盘符全路径
### Spring IOC 容器底层实现原理 #### 对象创建与管理 控制反转(Inversion of Control, IOC),其核心理念在于将对象的创建和依赖关系的管理交由Spring容器负责,从而降低了组件间的耦合度[^1]。具体来说,在传统的应用程序开发中,开发者通常会在代码内部通过`new`关键字实例化所需的对象并建立它们之间的关联。而在采用IOC模式之后,这些工作被转移到了外部配置文件或注解定义之中。 #### XML解析技术 对于基于XML形式描述beans元数据的情况,Spring支持多种标准API来进行文档结构读取操作,包括但不限于DOM4J、SAX以及STAX等方法[^2]。每种方式各有优劣之处: - **DOM4J**:能够一次性加载整个文档树到内存当中,便于随机访问节点; - **SAX/StAX**:采取事件驱动型或者流式的处理策略,适合于大规模文本分析场景下节省资源开销; 无论选用哪种手段,最终目的都是为了获取到标签内的属性值及其子元素内容,进而映射成Java Bean实体类对应的字段信息。 #### 工厂模式的应用 工厂模式在此处扮演着至关重要的角色,它允许程序动态决定应该使用哪一个具体的类来构建目标实例,并且隐藏掉了复杂的构造逻辑细节[^3]。当应用启动时,会先依据预设好的规则定位到相应的bean definition resource位置,接着利用反射机制调用无参构造函数或是带有参数注入特性的setter/getter方法完成初始化流程。 ```java public class UserFactory { public static UserEntity getUser() throws Exception{ Class<?> clazz = Class.forName("com.pengpeng.entity.UserEntity"); return (UserEntity)clazz.getDeclaredConstructor().newInstance(); } } ``` 这段简单的例子展示了如何借助`Class.forName()`配合上默认构造器的方式快速生成一个新的`UserEntity`对象实例[^4]。 #### 配置文件的作用 除了上述提到的技术要点之外,合理的配置也是确保IOC容器正常运作不可或缺的一环。典型的spring-beans.xml片段如下所示: ```xml <bean id="userService" class="org.example.service.UserService"/> <!-- 更多bean定义 --> ``` 这里声明了一个名为`userService`的服务层组件,并指定了其实现的具体全限定名作为class属性值传递给容器知晓[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值