Spring面试题01

目录

Spring的核心是什么?

说说你对Spring容器的了解

说说你对BeanFactory的了解

说说你对Spring IoC的理解

Spring是如何管理Bean的


Spring的核心是什么?

spring的核心是IOC容器与AOP功能:

  • IOC是控制反转的意思,这是一种面向对象编程的设计思想。在不采用这种思想的情况下,我们需要自己维护对象与对象之间的依赖关系,很容易造成对象之间耦合度过高,在一个大型项目中很不利于代码的维护。IOC则可以解决这种问题,帮助我们管理对象与对象之间的依赖关系,降低对象之间的耦合度。
  • AOP是面向切面编程思想。简单来说,它可以统一解决一批组件的共性需求(如:权限检查、记录日志、事务处理等)。在AOP思想下,我们可以将解决共性需求的代码独立出来,然后通过配置的方法,声明这些代码在什么时间,什么地点调用。当满足调用条件时,AOP会将该业务代码织入到我们所指定的位置,从而统一解决问题,而不需要修改这批组件的代码。

说说你对Spring容器的了解

Spring主要提供了两种容器类型的对象:BeanFactory和ApplicationContext

  • BeanFactory:是基础类型的IoC容器提供完整的IoC服务支持。如果没有特殊指定,默认采用延迟初始化策略。只有当客户端对象需要访问容器中某个受管对象时,才会对该对象进行初始化以及注入操作。所以相对来说容器启动初期速度较快,所需的资源有限。对于资源有限,并且功能要求不是很严格的场景,BeanFactory是比较合适的IoC容器选择
  • ApplicationContext:它是在BeanFactory的基础上构建的,是相对比较高级的容器实现,除了拥有BeanFactory的所有支持,ApplicationContext还提供了其他高级特性,比如事件发布,国际化信息支持等。ApplicationContext所管理的对象,在该类型容器启动之后,默认全部初始化并绑定完成。所以相对BeanFactory来说,ApplicationContext需要更多的系统资源,同时因为在启动时就完成所有初始化,容器启动时间较BeanFactory也会长一些。在那些系统资源充足,并且要求更多功能的场景中,ApplicationContext类型的容器是比较合适的选择。

说说你对BeanFactory的了解

  • BeanFactory是一个类工厂,与传统工厂不同的是BeanFactory是一个通用类工厂,它可以创建各种类的对象。这些可以被创建和管理的对象本身没有什么特别之处,仅仅是个POJO,Spring称这些被创建和管理的对象为Bean。并且Spring 中所说的Bean比javaBean更宽泛一些,所有可以被Spring容器初始化和管理的java类都可以成为Bean
  • BeanFactory是Spring容器的顶层接口,Spring为BeanFactory提供了多种实现,最常用的是XMLBeanFactory。但它在Spring3.2中已经被弃用,建议使用XMLBeanDefinitionReader、DefaultListableBeanFactory替代。BeanFactory最主要的方法就是getBean(String beanName),getBean(bean.class),该方法从容器中返回特定名称的bean。

说说你对Spring IoC的理解

  • IoC是控制反转的意思,这是一种面向对象编程的设计思想。在不采用这种思想的情况下,我们需要自己维护对象与对象之间的依赖关系,很容易造成对象之间的耦合度过高,在一个大型项目中很不易于对代码的维护。IoC可以解决这种问题,帮助我们管理对象与对象之间的依赖关系,降低对象之间的耦合度。
  • 说到IoC就不得不说DI,DI是依赖注入的意思,它是IoC容器的实现方式。在很多时候我们简单的将IoC和DI画等号,这是一种习惯。而实现依赖注入的关键是IoC容器,它的本质就是一个工厂。

在具体的实现中,依赖注入主要有三种方式:

  • 构造方法注入

           就是被注入对象可以在它的构造方法中声明依赖对象的参数列表,让外部知道它需要哪些依赖对象。然后IoC Serivice Provider会检查被注入对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象。构造方法注入方式比较直观,对象被构造完成后即可使用。

  • Setter方法注入

          通过Setter方法,可以更改相应对象属性。所以,当前对象只要为其依赖对象所对应的属性添加Setter方法,就可以通过Setter方法将相 应的依赖对象这设置到被注入对象中。Setter注入虽不像构造注入那样,让对象构造完成后即可使用,但是相对更宽松一些,可以在对象构造完成后在注入。

  • 接口注入

        相对于前两种注入方式来说,接口注入没有那么简单明了。被注入对象如果想要IOC Service Provider为其注入依赖时,就必须实现某个方法用来为其注入依赖对象。近些年已不再使用。

Spring是如何管理Bean的

Spring通过IoC来管理Bean,我们可以通过XML配置或者注解配置,来指导IOC容器对Bean的管理。因为注解配置比XML配置方便很多,所以现在大多数时候会使用注解配置的方式。

  以下是管理Bean时常用的注解:

  • @ComponentScan:用于声明扫描策略,通过它的声明,容器就知道要扫描哪些包下带有声明的类,也可以知道哪些特定的类是被排除在外的。
  • @Component、@Repository、@Service、@Controller:用于声明Bean,它们的作用一样,但是语义不同。@Component用于声明通用的Bean,@Repository用于声明持久层的Bean,@Service用于声明业务层的Bean,@Controller用于声明视图层的Bean,被这些注解声明的类就可以被容器扫描并创建
  • @Autowired、@Qualifier:用于注入Bean,即告诉容器应该为当前属性注入哪个Bean。其中,@Autowired是按照Bean的类型进行匹配的,如果这个属性的类型有多个Bean,就可以通过@Qualifier指定Bean的名称,以消除歧义。
  • @Scope:用于声明Bean的作用域,默认情况下Bean是单例的,即整个容器中这个类型只有一个实例。可以通过@Scope注解指定prototype值将其声明为多例的,也可以将Bean声明为session级作用域、request级作用域等等,但最常用的还是单例模式。
  • @PostConstruct、@PreDestroy:用于声明Bean的生命周期。其中@PostConstruct修饰的方法将在Bean被实例化后调用,@PreDestory修饰的方法将在容器销毁前被调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值