1、Spring实现了工厂模式的工厂类,这个类名为BeanFactory(接口),
在程序中通常用他的子类ApplicationContext。
Spring相当于一个大的工厂类,在其配置文件中通过元素配置用于
创建实例对象的类名和实例对象的属性。

工厂模式是一种生产对象型的设计模式,有了工厂模式后,当需要某个类的
对象时,就不再需要new指定的类,而是调用工厂中的方法即可。也就不需要
关心对象的创建过程。甚至有时候也许你需要的对象只要是某种大分类的类型
就可以了,而不必是某个指定的类型。不会过渡依赖某个类,这些类都是
易于被替换的,以提高整个项目的可维护性。

2、Spring提供了对IOC(控制反转)良好支持,IOC也是一种编程思想,
是一种架构艺术,利用这种思想可以很好地实现模块之间的解耦。
IOC就是对对象的创建、维护、销毁等生命周期的控制,这个过程一般是
由我们的程序去主动控制。
DI也是IOC的重要实现。一个对象的创建往往会涉及到其他对象的创建,
这就是依赖。IOC机制既然负责了对象的创建,
那么这个依赖关系也就必须由IOC容器负责起来。
负责的方式就是DI——依赖注入,通过将依赖关系写入配置文件,
然后在创建有依赖关系的对象时,由IOC容器注入依赖的对象。
如在创建A时,检查到有依赖关系,IOC容器就把A依赖的对象B
创建后注入到A中(组装,通过反射机制实现),然后把A返回给对象请求者,完成工作。

3、Spring提供了对AOP技术的良好封装,AOP称为面向切面编程,
就是系统中有很多各不相干的类的方法,
在这些众多方法中要加入某种系统功能的代码,
如加入日志,权限判断,异常处理,这种应用称为AOP。

实现AOP功能采用的是代理技术,客户端程序不再调用目标,
而调用代理类,代理类与目标类对外具有相同的方法声明。

有两种方式可以实现相同的方法声明,一是实现相同的接口,
二是作为目标的子类。在JDK中采用Proxy类,产生动态代理的
方式为某个接口生成实现类,如果要为某个类生成子类,则采用CGLIB。

系统功能的代理以Advice对象进行提供,要创建出代理对象,
至少需要目标类和Advice类。Spring提供了这种支持,
只需要在Spring配置文件中配置这两个元素即可实现代理和AOP功能。


回答面试题一般都是要讲逻辑的,将从以下三个方面总结以下:

1.spring的工作原理

2.spring的核心技术

3.spring的优缺点

1.spring的工作原理
spring 是按照设计模式精心打造的,它实现了工厂模式的工厂类,这个类名为BeanFactory(接口),在程序中通常使用它的子类ApplicationContext(也是接口)。

spring的核心是IOC(反转控制)容器,IOC也是一种编程思想,用于实现模块之间的解耦,在Spring中它的作用是对对象的创建,维护和销毁等生命周期的控制。IOC:把对象的创建、初始化、销毁交给spring来管理,而不是由开发者控制,实现控制反转。

spring是一个大的工厂类,spring的特点就是基于配置,在其配置文件中通过元素来创建实例对象。

根据业务逻辑来看,对象经常不是独立的,一个对象的创建往往涉及另一个对象的创建,当然这个对象也要由IOC容器负责,负责的方式就是依赖注入DI,通过反射机制实现。有三种注入方式:(1)接口注入(2)构造器注入(3)Setter方法注入。

2.spring的核心技术
spring的核心技术有:IOC,AOP

java 的 高级特性:反射机制,代理

AOP:面向切面编程,系统中有很多各不相干的类的方法,在这众多方法中加入某种系统功能的代码,如加入日志,权限判断等,AOP可以实现横切关注点(如日志,安全,缓存和事务管理)与他们所影响的对象之间的解耦。

实现AOP 功能采用的是代理技术,调用代理类,代理类与目标类具有相同的方法声明。

AOP 在spring中主要表现在两个方面:提供声明式的事务管理 、spring支持用户自定义切面。

spring AOP的使用在另外一位同学的博客中可以看到,我不喜欢造轮子就直接给大家贴一个路径吧

AOP主要包括通知(Advice)切点(PointCut)连接点(JoinPoint)

下面贴一段在springboot 中使用AOP的代码

<!-- aop -->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-aop</artifactId>
 </dependency>
@Aspect
@Component
public class ControllerInterceptor {
 
    private final Logger logger = LogManager.getLogger(this.getClass());
    @Pointcut("execution(public * com.example.homework.controller..*(..))")
    public void controllerMethodPointcut(){}
 
    @Before("controllerMethodPointcut()") //指定拦截器规则
    public Object interceptor(JoinPoint jp){
        MethodSignature signature = (MethodSignature) jp.getSignature();
        Method method = signature.getMethod(); //获取被拦截的方法
        String methodName = method.getName(); //获取被拦截的方法名
        logger.info("interceptor ***************************");
        logger.info("methodName: "+methodName);
        return null;
    }
}
2018-08-21 11:07:22.906  INFO 10392 --- [nio-8088-exec-1] a.s.s.m.AbstractValidatingSessionManager : Enabling session validation scheduler...
2018-08-21 11:07:22.987  INFO 10392 --- [nio-8088-exec-1] c.e.h.controller.ControllerInterceptor   : interceptor ***************************
2018-08-21 11:07:22.987  INFO 10392 --- [nio-8088-exec-1] c.e.h.controller.ControllerInterceptor   : methodName: loginIn

3.spring 的优缺点
Spring 的核心概念是IOC和AOP,这两个核心服务的对象算是bean(POJO),定位是一个轻量级的框架,但是随着他的发展变得很庞大,我们称它为spring 全家桶。

它具备以下优点:
spring中避免了关键字new造成的耦合问题。

spring本身就是一个工厂,不需要再编写工厂类了。

spring不需要进行明确的引用关系的传递,直接通过配置完成

所有框架几乎都可以在spring中整合在一起使用。

spring编程=factory设计模式+proxy设计模式

当然,它的缺点也是不少的:
spring基于大量的xml 配置文件,使得我们花了大量的时间放在配置上,拖慢了开发的进度,springboot 问世后,提倡代码优于配置解决了这个问题。

spring 的内容太庞大,随便打断点查看的时候会出现十几二十层代码,阅览性不强,在实际开发的过程中spring的角色更像是胶水一样,充当整合各种技术的角色,同时作为bean的容器。