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();
}
}
网友评论