网站首页 > java教程 正文
之前文章太长了,在此重新解读并分割下,我也正好重新再学习了。
一、IOC容器
IOC:控制反转,对象的创建不是我们平常使用new关键字去创建,而是通过容器在初始化的时候自动创建,反转的是对象的创建方式,此种方式和我们之前的工厂模式比较相似,对象在工厂创建的时候会自动一并创建,也就是说IOC基础其实就是工厂模式,IOC的最基本的一个接口就是BeanFactory。
DI:依赖注入,当一个对象在容器中创建时,对象中的依赖属性可能是其他对象,因此会依次创建其依赖的对象,并以此继续依赖创建直至所有的依赖对象均创建成功。
IOC/DI两个说的其实是一种,只是理解角度的不同。
IOC容器如何运作?
活生生的工厂模式的应用。
二、IOC容器概述
BeanFactory是一个基本的简单工厂,而ApplicationContext是一个高级工厂,它扩展了一些更高级更常用的功能(与AOP的集成、消息资源处理(国际化)等),我们一般都是基于ApplicationContext接口来实际操作。
然后有四大常用的实现类:
- ClassPathXmlApplicationContext
- FileSystemXmlApplicationContext
- AnnotationConfigApplicationContext
- WebApplicationContext
ApplicationContext接口代表的是SpringIOC容器,负责实体化、配置、组装Bean,容器通过读取配置元数据来获取有关实例化、配置和组装的基本信息,配置元数据通常以XML、java注解和java代码的方法。
在spring的早期版本中,XML是定义元数据的传统方式,XML配置比较繁琐,因此spring后面增加了基于注解的方式来配置元数据,现在我们可以仅使用少量的XML结合注解或者纯注解方式来使用Spring的相关功能。
三、元数据的配置
元数据的配置是告诉IOC容器如何去实体化、配置、组装对象的关键信息。
在早期版本中使用XML格式的配置比较常见。
XML配置不是唯一的方式,springIOC容器本身和配置文件格式是完全无关的,因此可以自定义配置文件,当然现在基于注解和java的配置是主流。
- 基于注解的配置:Spring 2.5引入了对基于注释的配置元数据的支持。
- 基于java的配置:从Spring 3.0开始,可以使用Java而不是XML文件来定义应用程序类外部的bean。如 @Configuration, @Bean, @Import和@DependsOn注释等。
配置元数据管理至少一个以上的Bean,在基于XML中以<bean></bean>节点表示,java配置中以@bean@component@Configuration等注解表示。
bean定义对应的除了简单java类之外,还包括服务层对象、数据访问对象等。
一个典型的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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="...">
</bean>
<bean id="..." class="...">
</bean>
<!--更多的bean定义 -->
</beans>
四、实例化容器
通过给 ApplicationContext构造函数提供一个或多个资源位置字符串,可以让容器从部资源加载配置元数据。
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
service.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
<property name="accountDao" ref="accountDao"/>
<property name="itemDao" ref="itemDao"/>
</bean>
</beans>
daos.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="accountDao"
class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
</bean>
<bean id="itemDao"
class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
</bean>
</beans>
也可以加载一个主XML配置文件,主XML文件内引入其他XML配置文件。
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml");
services.xml
<beans>
<import resource="resources/daos.xml"/>
<bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
<property name="accountDao" ref="accountDao"/>
<property name="itemDao" ref="itemDao"/>
</bean>
</beans>
注意:resouce资源路径,建立使用相对路径或者classpath路径,classpath路径一般在项目中指代src文件夹或者resource文件夹。
五、容器的使用
ApplicationContext是一个维护bean定义以及相互依赖的注册表的高级工厂的接口。通过使用方法getBean您可以获取bean的实例。
T getBean(String name, Class<T> requiredType)
// 创建容器
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
// 获取对象
PetStoreService service = context.getBean("petStore", PetStoreService.class);
// 使用对象
List<String> userList = service.getUsernameList();
猜你喜欢
- 2024-11-08 太强了,阿里P8面试官用1个多月,总结1000道题的Java面试文档!
- 2024-11-08 准备2023金三银四的Java程序员注意:40+文档5000+页面试资料来啦
- 2024-11-08 java语言基本学习文档一(java语言入门知识)
- 2024-11-08 霸榜GitHub!BAT内部学习资料:Java核心知识点文档限时开源
- 2024-11-08 Java 获取PowerPoint文档中文本的位置
- 2024-11-08 Java 计算Word文档的字数和字符数(计空格或不计空格)
- 2024-11-08 基于JAVA的社团管理系统—文档(基于javaee的管理系统)
- 2024-11-08 Java 文档解析工具:Apache Tika 开源的文档内容解析工具
- 2024-11-08 计算机等级考试辅导:Java类的基本组成和使用单元辅导文档
- 2024-11-08 Java生成word文档(java生成word文档却只有1kb)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)