栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring IOC容器和元信息来源(什么是spring ioc容器,优点是什么)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring IOC容器和元信息来源(什么是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.  
  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 ,还是 @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.     private Collection users;
  4.     
  5.     private BeanFactory beanFactory;
  6.     private ObjectFactory userObjectFactory;
  7.     private ObjectFactory objectFactory;
  8.     public ObjectFactory getObjectFactory() {
  9.         return objectFactory;
  10.     }
  11.     public void setObjectFactory(ObjectFactory objectFactory) {
  12.         this.objectFactory = objectFactory;
  13.     }
  14.     public ObjectFactory getUserObjectFactory() {
  15.         return userObjectFactory;
  16.     }
  17.     public void setUserObjectFactory(ObjectFactory userObjectFactory) {
  18.         this.userObjectFactory = userObjectFactory;
  19.     }
  20.     public Collection getUsers() {
  21.         return users;
  22.     }
  23.     public BeanFactory getBeanFactory() {
  24.         return beanFactory;
  25.     }
  26.     public void setBeanFactory(BeanFactory beanFactory) {
  27.         this.beanFactory = beanFactory;
  28.     }
  29.     public void setUsers(Collection users) {
  30.         this.users = users;
  31.     }
  32. }

Xml配置信息

  1.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.        xsi:schemaLocation="http://www.springframework.org/schema/beans
  3.         https://www.springframework.org/schema/beans/spring-beans.xsd">
  4.     
  5.         
  6.         
  7.     
  8.     
  9.         
  10.     
  11.     
  12.         
  13.     

  1.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.        xmlns:util="http://www.springframework.org/schema/util"
  3.        xsi:schemaLocation="
  4.         http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
  5.         http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
  6.     
  7.     
  8.     
  9.               autowire="byType"> 
  10.         
  11.      
  12.     
  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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/773597.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号