Spring的IOC、Aop和Spring框架面试相关问题

一、  Spring的概括

 Spring 是完全面向接口的设计,降低程序耦合性,主要是事务控制并创建bean实例对象。在ssh整合时,充当黏合剂的作用。IOC(Inversion of Control) 控制反转/依赖注入,又称DI(Dependency Injection) (依赖注入) 

 

为了降低Java开发复杂性,Spring采用了一下4种关键策略

  • 基于POJO的轻重量和最小入侵性编程
  • 通过依赖注入和面向接口实现松耦合
  • 基于切面和惯例进行声明式编程;
  • 通过切面和模板减少样板式代码

1.1 Spring框架的优缺点

1、 优点

  • 方便解耦,简化开发
    Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理。

  • AOP编程的支持
    Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。

  • 声明式事务的支持
    只需要通过配置就可以完成对事务的管理,而无需手动编程。

  • 方便程序的测试
    Spring对Junit4支持,可以通过注解方便的测试Spring程序。

  • 方便集成各种优秀框架
    Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持(如:Struts、Hibernate、MyBatis等)。

  • 降低JavaEE API的使用难度
    Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。

2、缺点

  • Spring明明一个很轻量级的框架,却给人感觉大而全
  • Spring依赖反射,反射影响性能
  • 使用门槛升高,入门Spring需要较长时间

1.2 Spring的作用

方便解耦,简化开发,AOP编程支持,声明式事务支持,集成Junit更加方便的进行分层测试,方便集成各种优秀框架

pring框架的设计目标,设计理念,和核心是什么?

  • Spring设计目标:
    Spring为开发者提供一个一站式轻量级应用开发平台;

  • Spring设计理念:
    在JavaEE开发中,支持POJO和JavaBean开发方式,使应用面向接口开发,充分支持OO(面向对象)设计方法;Spring通过IoC容器实现对象耦合关系的管理,并实现依赖反转,将对象之间的依赖关系交给IoC容器,实现解耦;

  • Spring框架的核心:
    IoC容器和AOP模块。通过IoC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务
     

1.3 Spring框架中都用到了哪些设计模式

  1. 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例
  2. 单例模式:Bean默认为单例模式
  3. 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术
  4. 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate
  5. 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。

1.4 Spring框架中有哪些不同类型的事件?

Spring 提供了以下5种标准的事件:

  1.  上下文更新事件(ContextRefreshedEvent):
    在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
  2. 上下文开始事件(ContextStartedEvent):
    当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
  3. 上下文停止事件(ContextStoppedEvent):
    当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
  4. 上下文关闭事件(ContextClosedEvent):
    当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
  5. 请求处理事件(RequestHandledEvent):
    在Web应用中,当一个http请求(request)结束触发该事件。如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知。
     
  6.  1.5 Spring Framework 中有多少个模块,它们分别是什么?

  7. Spring 总共大约有 20 个模块, 由 1300 多个不同的文件构成。 而这些组件被分别整合在核心容器(Core Container) 、 AOP(Aspect Oriented Programming)和设备支持(Instrmentation) 、数据访问与集成(Data Access/Integeration) 、 Web、 消息(Messaging) 、 Test等 几 个模块中。 以下是 Spring 5 的模块结构图:

  8. Spring 核心容器
    提供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)功能。 它包含以下模块:

  •  Spring Core
  • Spring Bean
  • SpEL (Spring Expression Language)
  • Spring Context

1.6. Spring通知有哪些类型?

在AOP术语中,切面的工作被称为通知,实际上是程序执行时要通过SpringAOP框架触发的代码段。

Spring切面可以应用5种类型的通知:

  1.  前置通知(Before):在目标方法被调用之前调用通知功能;
  2. 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
  3. 返回通知(After-returning ):在目标方法成功执行之后调用通知;
  4. 异常通知(After-throwing):在目标方法抛出异常后调用通知;
  5. 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

二、什么是DI

控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。

Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期

 

三、、IOC

3.1 什么是IOC

IOC就是控制反转,把创建对象的权利交给spring

3.2 IOC的作用

  •  管理对象的创建和依赖关系的维护。对象的创建并不是一件简单的事,在对象关系比较复杂时,如果依赖关系需要程序猿来维护的话,那是相当头疼的
  • 解耦,由容器去维护具体的对象
  • 托管了类的产生过程,比如我们需要在类的产生过程中做一些处理,最直接的例子就是代理,如果有容器程序可以把这部分处理交给容器,应用程序则无需去关心类是如何完成代理的

3.3 IOC的注入

  • 通过属性进行注入
  • 通过构造函数进行注入
  • 注入对象组、List集合、Map集合、Properties类型

3.4  IOC自动绑定模式

可以设置autowire按一下方式进行绑定

  • 按byType只要类型一致就会自动寻找
  • 按byName自动按属性名称进行自动查找匹配

3.5 SpringIOC控制反转

原来需要我们自己进行bean的创建以及注入,而现在交给

spring容器去完成bean的创建以及注入。

所谓的“控制反转”就是 对象控制权的转移,

从程序代码本身转移到了外部容器。

官方解释:

控制反转即IoC (Inversion of Control),

它把传统上由程序代码直接操控的对象的调用权交给容器,

通过容器来实现对象组件的装配和管理。

所谓的“控制反转”概念就是对组件对象控制权的转移,

从程序代码本身转移到了外部容器。

3.6 Spring IOC的实现机制

Spring 中的IOC的实现原理就是工厂模式加反射机制。

例:

interface Fruit {
  public abstract void eat();
}
 
class Apple implements Fruit {
  public void eat(){
    System.out.println("Apple");
  }
}
class Orange implements Fruit {
  public void eat(){
    System.out.println("Orange");
  }
}
class Factory {
  public static Fruit getInstance(String ClassName) { 
    Fruit f=null;
    try {
      f=(Fruit)Class.forName(ClassName).newInstance(); } catch (Exception e) {
    e.printStackTrace();
    }
    return f;
  }
}
 
class Client {
  public static void main(String[] a) {
    Fruit f=Factory.getInstance("com.xxx.xxx.Apple");
    if(f!=null){
      f.eat();
    } 
  }
}

3.7 构造器依赖注入和Setter方法注入有什么区别?

构造函数注入setter 注入
没有部分注入有部分注入
不会覆盖 setter 属性会覆盖 setter 属性
任意修改都会创建一个新实例任意修改不会创建一个新实例
适用于设置很多属性适用于设置少量属性

 两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。

3.8 set方式注入

依赖注入:Set注入!

依赖:bean对象的创建依赖于容器!

注入:bean对象中的所有属性,由容器来注入!

​ 【环境依赖】

1、复杂类型

public class Address {
   private  String address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

 2.真实测试环境

public class Student {
    private String name;
    private Address address;
    private String[] books;
    private List<String> hobbys;
    private Map<String,String> card;
    private Set<String> games;
    private Properties info;
    private String wife;

3.beans.xml

 <?xml version="1.0" encoding="UTF-8"?>
<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.xsd">
    <bean id="student" class="com.xing.pojo.Student">
        <!--1.普通注入-->
     <property name="name" value="abc"></property>
        <!--2.-->

    </bean>
</beans>

 4.测试类

 public class MyTests {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext ("beans.xml");
        Student student =(Student) context.getBean("student");
        System.out.println(student.getName());


    }
}

 5.完善信息注入

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">
    <bean id="student" class="com.xing.pojo.Student">
        <!--1.普通注入-->
     <property name="name" value="abc"></property>
        <!---->
     <property name="address" ref="address">
     </property>
        <property name="books">
            <array>
                <value>红楼梦</value>
                <value>西游记</value>
                <value>水浒传</value>
                <value>三国演绎</value>
            </array>
        </property>
        <property name="hobbys">
            <list>
                <value>听歌</value>
                <value>敲代码</value>
                <value>看电影</value>
            </list>
        </property>
        <!--map注入-->
        <property name="card">
            <map>
                <entry key="身份证" value="12312312321"></entry>
                <entry key="银行卡" value="45645645645"></entry>
            </map>
            <!--set注入-->
        </property>
        <property name="games">
            <set>
                <value>lol</value>
                <value>coc</value>
                <value>bob</value>
            </set>
        </property>
        <!--空值或空串-->
        <property name="wife">
            <null></null>
        </property>
        <!--Properties-->
        <property name="info">
            <props>
                <prop key="root">root</prop>
                <prop key="url">url</prop>
                <prop key="password">password</prop>
            </props>
        </property>
    </bean>
    <!--2.bean注入,ref-->
    <bean id="address" class="com.xing.pojo.Address">
        <property name="address" value="北京"></property>
    </bean>

</beans>

四、AOP

4.1 什么是AOP

在软件业,AOP为Aspect Oriented Programming的缩写,意味:面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统 一维护的一种技术,AOP是OOP的延续.将一些共性的内容进行抽取,在需要用到的地方,以动态代理的方式进行插入.在不修 改源 码的基础上,还能对源码进行前后增强。

AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面(切面)编程。

  • 注:OOP(Object-Oriented Programming ) 面向对象编程

 AOP  主要应用于日志记录,性能统计,安全控制,事务处理(项目中使用的)等方面。

4.2 Spring中的AOP技术

 在Spring中可以通过代理模式来实现AOP

代理模式分为:

  • 静态代理:一个接口,分别有一个真实实现和一个代理实现。
  • 动态代理:通过代理类的代理,接口和实现类之间可以不直接发生联系,而可以在运行(Runtme)实现动态关联。
  • 动态代理有两种实现方式

  • 可以通过jdk的动态代理实现也可以通过cglib来实现而AOP默认是通过.3.jdk的动态代理来实现的。

  • jdk的动态代理必须要有接口的支持,而cglib不需要,它是基于类的

4.3 AOP术语
前置通知:比如我要执行add,方法之前执行

后置通知:方法之后执行

环绕通知:方法之前和之后都会执行

异常通知:发生异常执行

最终:相当于finally

切面:把通知应用到切入点guocheng。 比如在登录过程中加一个权限判断

AOP操作(准备)
1、Spring框架一般都是基于AspectJ实现AOP操作
       (1)什么是AspectJ
         AspectJ不是Spring组成部分,独立AOP框架,一般把AspectJ和Spring框架一起使用,进
        行AOP操作
 2、基于AspectJ实现AOP操作
        (1)基于xml配置文件实现
        (2)基于注解方式实现(使用)
3.在项目中引入aop所需要的jar包

4.切入点表达式
(1)切入点表达式作用:知道对哪个类里面的哪个方法进行增强
 (2)语法结构:
execution([权限修饰符[返回类型[类全路径][方法名称[参数列表D)

权限修饰符可以具体,*代表任一修饰符

返回类型可以省略

  • 五、Spring框架

  • 5.1 什么是Spring框架

  • spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,是一个分层的javaEE一站式轻量级开源框架

  • 5.2 ring支持的几种bean的作用

  1. singleton:bean在每一个Spring IOC容器中只有一个实例。

  2. prototype:一个bean的定义可以有多个实例。

  3. request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。

  4. session:在一个HTTP   Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring    ApplicationContext情形下有效。

  5. global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

  6. 缺省的Spring bean 的作用域是Singleton.

5.3 什么是通知   有哪五种类型的通知

通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。Spring切面可以应用五种类型的通知

1)before:前置通知,在一个方法执行前被调用。

2)after: 在方法执行之后调用的通知,无论方法执行是否成功。

3)after-returning: 仅当方法成功完成后执行的通知。

4)after-throwing: 在方法抛出异常退出时执行的通知。

5)around: 在方法执行之前和之后调用的通知

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值