IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring IOC容器和元信息来源 -> 正文阅读

[Java知识库]Spring IOC容器和元信息来源

BeanFactory和ApplicationContext谁才是Spring Ioc容器?

BeanFactory 接口提供了能够管理任何类型对象的高级配置机制。ApplicationContext 是BeanFactory 的子接口。ApplicationContext添加了以下特性:

  1. 更容易与 Spring 的 AOP 特性集成
  2. 消息资源处理(用于国际化)
  3. 事件发布。
  4. 应用层特定的上下文,例如 web 应用程序中使用的 WebApplicationContext。
  1. public?interface?ApplicationContext?extends?EnvironmentCapable,?ListableBeanFactory,?HierarchicalBeanFactory,
  2. ??MessageSource,?ApplicationEventPublisher,?ResourcePatternResolver?{

  1. public?interface?ListableBeanFactory?extends?BeanFactory?{

简而言之,BeanFactory 提供了配置框架和基本功能,ApplicationContext 添加了更多特定于企业的功能。

总结:BeanFactory和ApplicationContext可以说都是Spring Ioc容器,在底层实现时,ApplicationContext不止实现了BeanFactory接口,同时还组合了BeanFactory的另一个实现类DefaultListableBeanFactory。

  1. public?class?ClassPathXmlApplicationContext?extends?AbstractXmlApplicationContext?{
  2. public?abstract?class?AbstractXmlApplicationContext?extends?AbstractRefreshableConfigApplicationContext?{
  3. public?abstract?class?AbstractRefreshableConfigApplicationContext?extends?AbstractRefreshableApplicationContext
  4. ??implements?BeanNameAware,?InitializingBean?{
  5. public?abstract?class?AbstractRefreshableApplicationContext?extends?AbstractApplicationContext?{
  6. ?@Nullable
  7. ?private?Boolean?allowBeanDefinitionOverriding;
  8. ?@Nullable
  9. ?private?Boolean?allowCircularReferences;
  10. ?/**?Bean?factory?for?this?context.?*/
  11. ?@Nullable
  12. ?private?DefaultListableBeanFactory?beanFactory;
  13. @Override
  14. ?public?final?ConfigurableListableBeanFactory?getBeanFactory()?{
  15. ??synchronized?(this.beanFactoryMonitor)?{
  16. ???if?(this.beanFactory?==?null)?{
  17. ????throw?new?IllegalStateException("BeanFactory?not?initialized?or?already?closed?-?"?+
  18. ??????"call?'refresh'?before?accessing?beans?via?the?ApplicationContext");
  19. ???}
  20. ???return?this.beanFactory;
  21. ??}
  22. ?}

configurableApplicationContext <-ApplicationContext<-BeanFactory
configurableApplicationContext#getBeanFactory()

Spring容器启动的过程中,会将Bean解析成Spring内部的BeanDefinition结构。 不管是是通过xml配置文件的 <Bean> 标签,还是通过注解配置的 @Bean ,还是 @Compontent 标注的类,还是扫描得到的类,它最终都会被解析成一个BeanDefinition对象,最后Bean工厂就会根据这份Bean的定义信息,对bean进行实例化、初始化等等操作。

Bean定义配置注意基于xml文件、properties文件、Java注解以及java Api;

Ioc容器配置注意基于xml文件、Java注解以及Java Api;

外部化属性配置基于Java注解 @Value。

Spring IoC依赖注入

  1. public?class?UserRepository?{
  2. ????/**
  3. ?????*?自定义bean
  4. ?????*/
  5. ????private?Collection<User>?users;
  6. ????/**
  7. ?????*?bean工厂
  8. ?????*?内建非bean对象
  9. ?????*/
  10. ????private?BeanFactory?beanFactory;
  11. ????private?ObjectFactory<User>?userObjectFactory;
  12. ????private?ObjectFactory<ApplicationContext>?objectFactory;
  13. ????public?ObjectFactory<ApplicationContext>?getObjectFactory()?{
  14. ????????return?objectFactory;
  15. ????}
  16. ????public?void?setObjectFactory(ObjectFactory<ApplicationContext>?objectFactory)?{
  17. ????????this.objectFactory?=?objectFactory;
  18. ????}
  19. ????public?ObjectFactory<User>?getUserObjectFactory()?{
  20. ????????return?userObjectFactory;
  21. ????}
  22. ????public?void?setUserObjectFactory(ObjectFactory<User>?userObjectFactory)?{
  23. ????????this.userObjectFactory?=?userObjectFactory;
  24. ????}
  25. ????public?Collection<User>?getUsers()?{
  26. ????????return?users;
  27. ????}
  28. ????public?BeanFactory?getBeanFactory()?{
  29. ????????return?beanFactory;
  30. ????}
  31. ????public?void?setBeanFactory(BeanFactory?beanFactory)?{
  32. ????????this.beanFactory?=?beanFactory;
  33. ????}
  34. ????public?void?setUsers(Collection<User>?users)?{
  35. ????????this.users?=?users;
  36. ????}
  37. }

Xml配置信息

  1. <?xml?version="1.0"?encoding="UTF-8"?>
  2. <beans?xmlns="http://www.springframework.org/schema/beans"
  3. ???????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. ???????xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. ????????https://www.springframework.org/schema/beans/spring-beans.xsd">
  6. ????<bean?id="user"?class="org.mango.spring.ioc.overview.domain.User"?>
  7. ????????<property?name="id"?value="1"/>
  8. ????????<property?name="name"?value="mango"/>
  9. ????</bean>
  10. ????<bean?id="superUser"?class="org.mango.spring.ioc.overview.domain.SuperUser"?parent="user"?primary="true">
  11. ????????<property?name="address"?value="西安"></property>
  12. ????</bean>
  13. ????<bean?id="objectFactory"?class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean"?>
  14. ????????<property?name="targetBeanName"?value="user"></property>
  15. ????</bean>
  16. </beans>

  1. <?xml?version="1.0"?encoding="UTF-8"?>
  2. <beans?xmlns="http://www.springframework.org/schema/beans"
  3. ???????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. ???????xmlns:util="http://www.springframework.org/schema/util"
  5. ???????xsi:schemaLocation="
  6. ????????http://www.springframework.org/schema/beans?https://www.springframework.org/schema/beans/spring-beans.xsd
  7. ????????http://www.springframework.org/schema/util?https://www.springframework.org/schema/util/spring-util.xsd">
  8. ????<!--通过导入复用?dependency-->
  9. ????<import?resource="dependency-lookup-context.xml"></import>
  10. ????<!--autowire自动注入-->
  11. ????<bean?id="userRepository"?class="org.mango.spring.ioc.overview.repository.UserRepository"
  12. ??????????autowire="byType">?
  13. ????????<!--硬编码-->
  14. ?????<!--???<property?name="users">
  15. ????????????<util:list>
  16. ????????????????<ref?bean="user"/>
  17. ????????????????<ref?bean="superUser"/>
  18. ????????????</util:list>
  19. ????????</property>-->
  20. ????</bean>
  21. </beans>
  1. ?//配置xml文件?启动spring?应用上下文
  2. ????????BeanFactory?beanFactory?=?new?ClassPathXmlApplicationContext("META-INF/dependency-injection-context.xml");
  3. ????????//来源1:?自定义bean
  4. ????????UserRepository?userRepository?=?(UserRepository)?beanFactory.getBean("userRepository");
  5. ????????//实时注入bean
  6. ????????userRepository.getUsers().forEach(System.out::println);
  7. ????????//来源2:?依赖注入?(内建依赖)
  8. ????????System.out.println(userRepository.getBeanFactory());
  9. ????????System.out.println(userRepository.getBeanFactory()?==?beanFactory);
  10. ????????//延时注入
  11. ????????ObjectFactory?userFactory?=?userRepository.getUserObjectFactory();
  12. ????????System.out.println(userFactory.getObject());
  13. ????????ObjectFactory?objectFactory?=?userRepository.getObjectFactory();
  14. ????????System.out.println(objectFactory.getObject());
  15. ????????System.out.println(objectFactory.getObject()?==?beanFactory);
  16. ????????//来源三:?容器内建?bean
  17. ????????Environment?environment?=?beanFactory.getBean(Environment.class);

? ? ? ? ? ? ? ? ?System.out.println("获取Environment类型的bean"?+?environment);

?System.out.println(userRepository.getBeanFactory()?==?beanFactory); 输出为false

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:35:37  更:2022-03-21 20:37:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:18:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码