Spring

二、JavaEE部分
❤1、Spring

1、说一下IOC和AOP?

  • AOP是Aspect Oriented Programming的缩写,意思是面向切面编程.与OOP(Object Oriented
    Programming)面向对象编程对等,都是一种编程思想.
    从OOP角度分析,我们关注业务的处理逻辑,是属于纵向的行为,从AOP角度分析,我们关注对象行为发生时的问题,是属于横向的问题.
    AOP就是把贯穿在各个模块之间相同的功能抽取出来,然后封装成一个面. AOP的作用: 1.监控函数的调用 2.捕获异常的发生
    实际应用于:事务,安全,日志等横切关注 两种方式实现AOP的方式:
    1.JDK提供的动态代理实现,Spring规定对于有接口的类用JDK,对于无接口和抽象类使用cglib,虽然cglib均可代理,但是cglib复杂,效率低,而且cglib中代理的类中不能有final的方法.
    2.其中对于AOP来说,他也可以理解为一个面,在这个面里面我们利用代理类来找目标对象是什么,拦截那些方法,然后在这些方法的前后也可以执行一些操作.
  • IOC(Inversion of control):控制反转,依赖注入
    概念:控制权有对象本身专享容器,由容器根据配置文件去创建实例,并创建各个实例之间的关系,则通俗的说,对象的创建再也不需要程序员来管理,而是可以有spring容器来进行创建和销毁,我们只需要关注业务逻辑.
    依赖IOC容器并管理bean,有两种,一种是BeanFactory,另一种是ApplicationContext,但是APPlicationContext
    extends BeanFactory.
    核心:Spring中,bean工厂创建的各个实例称作bean.

2、介绍一下bean的生命周期

  • 一、Bean的定义 Spring通常通过配置文件定义Bean。如: <beans
    xmlns=”http://www.springframework.org/schema/beans”
    xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
    xsi:schemaLocation=”http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd”>
    HelloWorld 这个配置文件就定义了一个标识为 HelloWorld 的Bean。在一个配置文档中可以定义多个Bean。
  • 二、Bean的初始化 有两种方式初始化Bean。 1、在配置文档中通过指定init-method 属性来完成
    在Bean的类中实现一个初始化Bean属性的方法,如init(),如: public class HelloWorld{ public
    String msg=null; public Date date=null; public void init() {
    msg=”HelloWorld”; date=new Date(); } …… } 然后,在配置文件中设置init-mothod属性:
    2、实现 org.springframwork.beans.factory.InitializingBean接口
    Bean实现InitializingBean接口,并且增加 afterPropertiesSet() 方法: public class
    HelloWorld implement InitializingBean { public String msg=null;
    public Date date=null; public void afterPropertiesSet() {
    msg=”向全世界问好!”; date=new Date(); } …… }
    那么,当这个Bean的所有属性被Spring的BeanFactory设置完后,会自动调用afterPropertiesSet()方法对Bean进行初始化,于是,配置文件就不用指定
    init-method属性了。
  • 三、Bean的调用 有三种方式可以得到Bean并进行调用: 1、使用BeanWrapper HelloWorld hw=new
    HelloWorld(); BeanWrapper bw=new BeanWrapperImpl(hw);
    bw.setPropertyvalue(“msg”,”HelloWorld”);
    system.out.println(bw.getPropertyCalue(“msg”)); 2、使用BeanFactory
    InputStream is=new FileInputStream(“config.xml”); XmlBeanFactory
    factory=new XmlBeanFactory(is); HelloWorld hw=(HelloWorld)
    factory.getBean(“HelloWorld”); system.out.println(hw.getMsg());
    3、使用ApplicationConttext ApplicationContext actx=new
    FleSystemXmlApplicationContext(“config.xml”); HelloWorld
    hw=(HelloWorld) actx.getBean(“HelloWorld”);
    System.out.println(hw.getMsg());
  • 四、Bean的销毁 1、使用配置文件中的 destory-method 属性 与初始化属性
    init-methods类似,在Bean的类中实现一个撤销Bean的方法,然后在配置文件中通过
    destory-method指定,那么当bean销毁时,Spring将自动调用指定的销毁方法。 2、实现
    org.springframwork.bean.factory.DisposebleBean接口
    如果实现了DisposebleBean接口,那么Spring将自动调用bean中的Destory方法进行销毁,所以,Bean中必须提供Destory方法

3、Spring里面注解用过没有?autowired 和resource区别?
https://blog.csdn.net/weixin_40423597/article/details/80643990

4、@Controller和@RestController的区别?
https://www.cnblogs.com/clwydjgs/p/9255046.html

5、依赖注入的方式有几种,哪几种?
https://blog.csdn.net/shadow_zed/article/details/72566611

6、springIOC原理?自己实现IOC要怎么做,哪些步骤?

7、Spring中BeanFactory和ApplicationContext的区别?、

  • 1.从ApplicationContext中取bean ApplicationContext ac = new ClassPathXmlApplicationContext(“spring.xml”);
    当我们实例化bean.xml时,该文件中配置的bean都会被实例化。(该bean scope是singleton)

  • 从BeanFactory中取bean
    BeanFactory factory= new XmlBeanFactory(new ClassPathResource(“spring.xml”));
    factory.getBean(“student”); //取bean的时候才会实例化
    当使用beanfactory去获取bean,当你只是实例化该容器,那么容器内的bean不会被实例化,只有当使用某个bean(getBean)时,才会实时去实例化该bean。

  • 总结
    1.如果使用ApplicationContext,则配置的bean如果是singleton不管你用还是不用,都被实例化。好处是可以预先加载,坏处是浪费内存。
    2.BeanFactory,当使用BeanFactory实例化对象时,配置的bean不会马上被实例化。当你使用该bean时才会被实例化(getBean)。好处是节约内存,缺点是速度比较慢。多用于移动设备的开发上。
    3.一般没有特殊要求,应当使用ApplicationContext完成。

  • 三种获取ApplicationContext对象引用的方法
    1.ClassPathXmlApplicationContext 通过类路径。
    2.FileSystemXmlApplicationContext 通过文件路径。
    ApplicationContext ac = FileSystemXmlApplicationContext(“d:\com\bean.xml”);
    3.XmlWebApplicationContext:从web系统中加载。

8、什么是IoC和DI?DI是如何实现的?

  • 什么是IOC和DI?DI是如何实现的? IOC(Inversion of Control)叫控制反转, DI(Dependency
    Injection)叫依赖注入,是对IOC更简单的诠释。 IOC
    控制反转是把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的"控制反转"就是对组件对象控制权的转移,从程序代码本身转移到了外部容器,由容器来创建对象并管理对象之间的依赖关系。
  • DI
    依赖注入的基本原则是应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由容器负责,查找资源的逻辑应该从应用组件的代码中抽取出来,交给容器来完成。DI是对IOC更准确的描述,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
  • 简单的说 IOC(控制反转)是把对象创建交给Spring进行配置 DI(依赖注入)是向类里面的参数设置值
    DI(依赖注入)不能单独存在,需要在IOC(控制反转)的基础上完成操作

9、请问Spring中Bean的作用域有哪些?
https://www.cnblogs.com/goody9807/p/7472127.html

10、谈谈Spring中自动装配的方式有哪些?

在spring框架中共有5种自动装配:

  • no:这是Spring框架的默认设置
    在该设置下自动装配是关闭的,开发者需要自行在bean定义中用标签明确的设置依赖关系。
  • byName:该选项可以根据bean名称设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。
  • byType:该选项可以根据bean类型设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的类型自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。
  • constructor:造器的自动装配和byType模式类似,但是仅仅适用于与有构造器相同参数的bean,如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。
  • autodetect:该模式自动探测使用构造器自动装配或者byType自动装配。首先,首先会尝试找合适的带参数的构造器,如果找到的话就是用构造器自动装配,如果在bean内部没有找到相应的构造器或者是无参构造器,容器就会自动选择byTpe的自动装配方式。

11、aop的应用场景?

AOP用来封装横切关注点,具体可以在下面的场景中使用
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步

12、AOP的原理是什么?
https://blog.csdn.net/weianluo/article/details/81607134

13、你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?

a. 连接点(Joinpoint):程序执行的某个特定位置(如:某个方法调用前、调用后,方法抛出异常后)。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就是连接点。Spring仅支持方法的连接点。
b. 切点(Pointcut):如果连接点相当于数据中的记录,那么切点相当于查询条件,一个切点可以匹配多个连接点。Spring AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。
c. 增强(Advice):增强是织入到目标类连接点上的一段程序代码。Spring提供的增强接口都是带方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。很多资料上将增强译为“通知”,这明显是个词不达意的翻译,让很多程序员困惑了许久。
说明: Advice在国内的很多书面资料中都被翻译成”通知”,但是很显然这个翻译无法表达其本质,有少量的读物上将这个词翻译为”增强”,这个翻译是对Advice较为准确的诠释,我们通过AOP将横切关注功能加到原有的业务逻辑上,这就是对原有业务逻辑的一种增强,这种增强可以是前置增强、后置增强、返回后增强、抛异常时增强和包围型增强。
d. 引介(Introduction):引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过引介功能,可以动态的未该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。
e. 织入(Weaving):织入是将增强添加到目标类具体连接点上的过程,AOP有三种织入方式:①编译期织入:需要特殊的Java编译期(例如AspectJ的ajc);②装载期织入:要求使用特殊的类加载器,在装载类的时候对类进行增强;③运行时织入:在运行时为目标类生成代理实现增强。Spring采用了动态代理的方式实现了运行时织入,而AspectJ采用了编译期织入和装载期织入的方式。
f. 切面(Aspect):切面是由切点和增强(引介)组成的,它包括了对横切关注功能的定义,也包括了对连接点的定义。

14、Spring支持的事务管理类型有哪些?你在项目中使用哪种方式?

·编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。

·声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。

15、介绍一下spring?

Spring的核心是一个轻量级(Lightweight)的容器(Container),它是实现IoC(Inversion of Control)容器和非入侵性(No intrusive)的框架,并提供AOP(Aspect-oriented programming)概念的实现方式;提供对持久层(Persistence)、事物(Transcation)的支持;提供MVC Web框架的实现,并对一些常用的企业服务API(Application Interface)提供一致的模型封装,是一个全方位的应用程序框架(Application Framework),除此之外,对现存的各种框架(Structs、JSF、Hibernate、Ibatis、Webwork等),Spring也提供了与他们相整合的方案。
→ 回答解析:
对于面试者回答什么是Spring,这个问题占6分分值,分值点分布:
1、Spring的核心是一个轻量级(Lightweight)的容器(Container)。
2、Spring是实现IoC(Inversion of Control)容器和非入侵性(No intrusive)的框架。
3、Spring提供AOP(Aspect-oriented programming)概念的实现方式。
4、Spring提供对持久层(Persistence)、事物(Transcation)的支持。
5、Spring供MVC Web框架的实现,并对一些常用的企业服务API(Application Interface)提供一致的模型封装。
6、Spring提供了对现存的各种框架(Structs、JSF、Hibernate、Ibatis、Webwork等)相整合的方案。
总之,Spring是一个全方位的应用程序框架。

简单地说,spring是用来管理你的类的框架,管理它们之间的互相调用和依赖关系,通过接口解藕,可以方便的更换使用多种不同的技术实现来完成你的系统。

16、Struts拦截器和Spring AOP区别?
https://www.cnblogs.com/IcreamPrince/p/3995616.html

17、spring框架的优点?
https://blog.csdn.net/hht006158/article/details/80181207

18、选择使用Spring框架的原因(Spring框架为企业级开发带来的好处有哪些)?

  • IoC容器:IoC容器帮助应用程序管理对象以及对象之间的依赖关系,对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码,因为代码的修改可能意味着项目的重新构建和完整的回归测试。有了IoC容器,程序员再也不需要自己编写工厂、单例,这一点特别符合Spring的精神“不要重复的发明轮子”。
  • AOP:面向切面编程,将所有的横切关注功能封装到切面(aspect)中,通过配置的方式将横切关注功能动态添加到目标代码上,进一步实现了业务逻辑和系统服务之间的分离。另一方面,有了AOP程序员可以省去很多自己写代理类的工作。
  • MVC:Spring的MVC框架是非常优秀的,从各个方面都可以甩Struts 2几条街,为Web表示层提供了更好的解决方案。
  • 事务管理:Spring以宽广的胸怀接纳多种持久层技术,并且为其提供了声明式的事务管理,在不需要任何一行代码的情况下就能够完成事务管理。

19、持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些?

  • 所谓”持久”就是将数据保存到可掉电式存储设备中以便今后使用,简单的说,就是将内存中的数据保存到关系型数据库、文件系统、消息队列等提供持久化支持的设备中。持久层就是系统中专注于实现数据持久化的相对独立的层面。
  • 持久层设计的目标包括: 数据存储逻辑的分离,提供抽象化的数据访问接口。 数据访问底层实现的分离,可以在不修改代码的情况下切换底层实现。
    资源管理和调度的分离,在数据访问层实现统一的资源调度(如缓存机制)。 数据抽象,提供更面向对象的数据操作。
  • 持久层框架有: Hibernate MyBatis TopLink Guzz jOOQ Spring Data ActiveJDBC

**❤4、Mybatis
1、解释一下MyBatis中命名空间(namespace)的作用。

在大型项目中,可能存在大量的SQL语句,这时候为每个SQL语句起一个唯一的标识(ID)就变得并不容易了。为了解决这个问题,在MyBatis中,可以为每个映射文件起一个唯一的命名空间,这样定义在这个映射文件中的每个SQL语句就成了定义在这个命名空间中的一个ID。只要我们能够保证每个命名空间中这个ID是唯一的,即使在不同映射文件中的语句ID相同,也不会再产生冲突了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值