请你谈谈以下问题:DI和IOC?BeanFactory 和 ApplicationContext联系与区别?Spring如何设计容器?依赖注入方式?bean的生命?Spring注解的介绍?

1介绍一下Spring依赖注入和控制翻转

IOC:它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理;Spring 中的 IoC 的实现原理就是工厂模式加反射机制
DI全程Dependency Injection,当某个java 实例需要另一个java实例时,创建被调用者的工作不是由调用者实现,而是由spring容器来完成,然后注入调用者,因此称为依赖注入。

IoC和DI的区别:
IoC和DI其实是同一概念的不同角度描述。IoC强调的是将对象实例的创建控制权由spring容器来统一管理,需要的时候从容器中取出,而不是由调用者自身去创建,从而达到降低代码耦合性与硬代码的目的。依赖注入强调的是当调用者需要使用对象实例时,spring容器为调用者提供对象实例这个过程。

2BeanFactory 和 ApplicationContext有什么区别?

在这里插入图片描述

BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。 ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:(MessageSource)支持国际化等;

BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。这样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,这样有利于检查所依赖属性是否注入。 ApplicationContext启动后预载入所有的单实例Bean,通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。

BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader。

3Spring 如何设计容器的,BeanFactory和ApplicationContext的关系详解?

Spring 作者 Rod Johnson 设计了两个接口用以表示容器:1BeanFactory 2ApplicationContext
BeanFactory 就是个 HashMap,Key 是 BeanName,Value 是 Bean 实例。通常只提供注册(put),获取(get)这两个功能。我们可以称之为 “低级容器”。ApplicationContext 可以称之为 “高级容器”。他继承了多个接口,因此具备了更多的功能。例如资源的获取,支持多种消息(例如 JSP tag 的支持), “应用上下文”, 代表着整个大容器的所有功能。该接口定义了一个 refresh 方法,用于刷新整个容器,即重新加载/刷新所有的 bean
BeanFactory和ApplicationContext的关系:
在这里插入图片描述
ApplicationContext “高级容器”,依赖着 “低级容器”,这里说的是依赖,不是继承哦。他依赖着 “低级容器” 的 getBean 功能。而高级容器有更多的功能:支持不同的信息源头,可以访问文件资源,支持应用事件(Observer 模式)。IoC 在 Spring 里,只需要低级容器就可以实现,2 个步骤:
1 加载配置文件,解析成 BeanDefinition 放在 Map 里
2 调用 getBean 的时候,从 BeanDefinition 所属的 Map 里,拿出 Class 对象进行实例化,同时,如果有依赖关系,将递归调用 getBean 方法 —— 完成依赖注入
至于高级容器 ApplicationContext,他包含了低级容器的功能,当他执行 refresh 模板方法的时候,将刷新整个容器的 Bean同时其作为高级容器,包含了太多的功能

4有哪些不同类型的依赖注入实现方式?

依赖注入是时下最流行的IoC实现方式,依赖注入分为接口注入(Interface Injection),**Setter方法注入(Setter Injection)和构造器注入(Constructor Injection)**三种方式。其中接口注入由于在灵活性和易用性比较差,现在从Spring4开始已被废弃。
在这里插入图片描述最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。

5解释Spring框架中bean的生命周期?

在这里插入图片描述
1 Spring对bean进行实例化;(实例化)
2 Spring将值和bean的引用注入到bean对应的属性中;(填充属性)
3注入Aware的依赖(BeanNameAware,BeanFactoryAware,ApplicationContextAware)

aware的依赖特点
BeanNameAwareSpring将bean的ID传递给setBeanName()方法
BeanFactoryAwareSpring将调用setBeanFactory()方法,将BeanFactory容器实例传入
ApplicationContextAwareSpring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来

4如果bean实现了BeanPostProcessor接口,执行预初始化方法,Spring将调用它们的postProcessBeforeInitialization()方法;
5如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。

6 执行Bean自定义的初始化方法init

此时,创建对象完毕。

对象销毁
1执行 DisposableBean.destory() 方法
2执行自定义的destory方法 或者@PreDestory 标注的方法;

6使用@Autowired注解自动装配的过程是怎样的?

使用@Autowired注解来自动装配指定的bean。在使用 @Autowired注解之前需要在Spring配置文件进行配置,<context:annotation-config />。

在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean:如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;如果查询的结果不止一个,那么@Autowired会根据名称来查找;
如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。

7Spring注解的介绍?

注解用途
@Configuration用于定义配置类,可替换xml配置文件
@Bean它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文

1@Component, @Controller, @Repository, @Service 有何区别?

注解介绍
@Component将 java 类标记为 bean,它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。
@Controller这将一个类标记为 Spring Web MVC 控制器,标有它的 Bean 会自动导入到 IoC 容器中
@Service在服务层类中使用更好的方式指定了意图
@Repository用于标注数据访问组件,即DAO组件

2@Required 注解有什么作用?

这个注解表明bean的属性必须在配置的时候设置,@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。

3@Autowired 注解有什么作用?

@Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。

4@Autowired和@Resource之间的区别?

@Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。
@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。

5@Qualifier 注解有什么作用?

当您创建多个相同类型的 bean希望仅使用属性装配其中一个 bean 时,您可以使用**@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean 来消除歧义**。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值