开发者社区> 问答> 正文

关于spring ioc的问题

spring ioc控制反转(依赖注入),要在配置文件中配置需要的bean,如果配置的bean太多,会不会导致内存不足,如果会怎么解决啊

展开
收起
小旋风柴进 2016-03-05 10:47:29 2119 0
1 条回答
写回答
取消 提交回答
  • 一、spring 中的概念

    ##beanFactory容器
    1、容器是spring框架的核心,容器使用ioc依赖注入来管理所有组成应用系统的组件。

    2、spring中的两种容器: beanFactory 这个容器提供了基础的依赖注入支持,而且是延迟加载的,而 applicationcontext是对beanFactory 这个容器的扩展,

    3、beanFactory :beanFactory就是一个Bean工厂,使用了工厂模式,但bean工厂不像一般的工厂,只提供特定类的bean而是一个通用的工厂,可以创建和分发各种类型的bean,beanFactory不仅仅只是创建和分发bean因为我们知道,这个bean工厂知道应用中的很多对象,在创建这些对象的时候,创建出了这些对象之间的关联关系,bean工厂还管理这些对象的生命周期。
    4、beanFactory 接口的实现类有很多,我们这里就举一个常用的类: XMLBeanFactory, XMLBeanFactory构造方法的参数是一个inputStream对象,而传递进来的就是我们定义bean的xml文件

    5、实例:BeanFactory beanfactory = new XMLBeanFactory(newFileInputStream(bean.xml)); 这样beanFactory就获取了配置文件中bean的信息,但是bean是延迟实例化的所以现在只是加载进来了,但还是没有创建实例,只有在使用的时候尽心创建

    6、 User user=(User)beanfactory.getBean("user");

    当我们调用getBean()时工厂会实例化并且会依赖注入设置相关属性值。

    ApplicationContext 容器

    1、applicationcontext和beanFactory看来都是一样的,都是加载bean的信息,配置bean和分发bean,但是application context作为beanFactory的扩展有一些额外的功能:(1)文本信息解析工具,包括对国际化的支持(2)应用上下文提供了载入文件资源的通用方法(3)应用上下文可以向注册为监听器的bean发送事件,因为application context的额外功能所以在应用中大都使用application context而beanFactory在资源较少的移动设备上使用

    2、ApplicationContext的实现:ClassPathXmlApplicationContext()类路劲中的xml文件中载入上下文信息,FileSystemXmlApplicationContext()文件系统xml获取上下文信息

    XmlWebApplicationContext()从网络获取上下文信息。
    3、我们知道 ApplicationContext是对beanFactory的扩展所以我们同样可以使用 .getBean("User")来获取对象,但是这里有点不同,那就是在beanFactory中使用的就是懒加载,在调用getBean()的时候才会创建实例而ApplicationContext () 在上下文预加载的时候就创建了实例,在使用的时候不用等待创建而是直接使用。

    Spring中bean的周期

    1、容器寻找bean的定义信息,并且实例化bean
    2、使用依赖注入,spring按照bean定义信息配置bean的所有属性
    3、如果bean实现了BeanNameAware接口则工厂调用bean的setBeanName() 方法传递bean的Id
    4、如果bean实现了beanFacgtoryAware 接口则工厂调用 setBeanFactory()方法传入工厂本身。
    5、如果有BeanPostProcess和bean关联那么他们的PostProcessBeforeInitialzation()方法将被调用
    6、如果bean指定了init-method 方法则将被调用
    7、如果有BeanPostProcess和bean关联那么他们的PostProcessAfterInitialzation()方法将被调用
    到这里bean就可以在系统中被使用了,并将一直保存在BeanFactory 中直到他不在使用。
    8、删除: spring 中有两种方式:(1)、如果bean实现了Disposable接口则destory方法将会被调用(2)、自己定义定义了销毁方法则执行他 destroy-method

    依赖注入

    1、所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象地说,即由容器动态地将某种依赖关系注入到组件之中。
    装配
    在spring容器内拼凑bean叫做装配,装配bean的时候你是在告诉容器需要哪些bean,以及容器如何使用依赖注入将他们配合在一起。

    实例化
    1、在使用spring容器进行bean类的管理的时候,我们获取bean类有两种类型,一种就是在spring中使用了单例模式,获取的都是第一次加载的时候创建的那个bean实例,第二种就是在spring中没有定义单例模式,每获取一次就会产生一个新的bean实例。

    区别这两种的配置:

    <beanid="user" class="com.inspur.User" singleton=off>

    </bean>

    // singleton(单一的 唯一的) 这里关闭了单例模式,所以每次获取的bean对象都是新的,而在spring中singleton默认是开着的,因为像数据库连接池,网络资源等创建新对象很浪费资源,所以还是使用单例模式比较好,如果没有特别需求还是使用单例模式比较好!

    2019-07-17 18:53:01
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多