Spring常见问题

1.Spring是什么?

Spring是一个开源框架,是为了降低应用开发的复杂度。
他是轻量级、松散耦合的。
他可以集成其他框架如Mybatis、hibernate。
Spring有不同的功能:
IOC 控制反转
AOP面向切面编程
容器 Spring负责创建和管理对象的生命周期和配置
MVC
事务管理

2.Spring IOC 是什么?

Spring框架的核心是Sping容器。容器创建对象,将他们呢装配在一起,配置他们并管理他们的完整生命周期。Spring容器依赖注入来管理组成应用程序的组件。

3.DI是什么?有什么注入方式?

在依赖注入中,你不必创建对象,但必须描述如何 创建他们。
有setter注入
构造器注入
接口注入

4.Spring Bean是很么?

在Spring中,那些组成应用程序的主体及由Spring Ioc容器所管理的对象,被称为bean。简单的讲,bean就是由Ioc容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。
Spring的bean默认都是单例的,这些单例模式怎么保证线程安全的呢?例如对于web应用来说,web容器对于每个请求都创建一个单独的Servlet线程来处理请求,引入Spring框架后,每个action都是单例的,那单例bean在此容器内只有一个,Java的单例是基于JVM。

5.Bean的作用域

singleton 默认值,Spring Ioc容器中仅存在一个bean实例
prototype 每次从容器中调用bean时,都返回一个新的实例,即每次调用getBean时,相当于执行new XxxBean()
request 每个HTTP请求都会创建一个新的Bean,该该作用域仅适用于WebApplicatinContext环境
session 同一个HTTP Session共享一个Bean,不同Session使用不同Bean,仅适用于WebApplicatinContext环境
globalSession

6.Spring AOP是什么?

面向切换编程
Aspect 切面 : 通常是指一个类,里面定义切入点有通知。
JointPoint 连接点:程序执行过程中明确的点,一般是方法的调用。
Advice 通知:
PointCut 切入点:就是带有通知的连接点,在程序中主要体现为书写切入点表达式。

7.Spring AOP底层实现呢?

代理模式:
java.lang.reflect.Proxy:生成动态代理类和对象;
java.lang.reflect.InvocationHandler(处理器接口):可以通过invoke方法实现

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 定义一个处理器
 * @author gnehcgnaw
 * @date 2018/11/5 19:26
 */
public class MyInvocationHandler implements InvocationHandler {
    /**
     * 因为需要处理真实角色,所以要把真实角色传进来
     */
    Subject realSubject ;

    public MyInvocationHandler(Subject realSubject) {
        this.realSubject = realSubject;
    }

    /**
     *
     * @param proxy    代理类
     * @param method    正在调用的方法
     * @param args      方法的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("调用代理类");
        if(method.getName().equals("sellBooks")){
            int invoke = (int)method.invoke(realSubject, args);
            System.out.println("调用的是卖书的方法");
            return invoke ;
        }else {
            String string = (String) method.invoke(realSubject,args) ;
            System.out.println("调用的是说话的方法");
            return  string ;
        }
    }
}
import java.lang.reflect.Proxy;

/**
 * 调用类
 * @author gnehcgnaw
 * @date 2018/11/7 20:26
 */
public class Client {
    public static void main(String[] args) {
        //真实对象
        Subject realSubject =  new RealSubject();

        MyInvocationHandler myInvocationHandler = new MyInvocationHandler(realSubject);
        //代理对象
        Subject proxyClass = (Subject) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Subject.class}, myInvocationHandler);

        proxyClass.sellBooks();

        proxyClass.speak();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_34195546/article/details/87633196