Spring核心概念!

IOC(控制反转)

Spring中有一个容器,我们将Bean放到这个容器中,让这个容器为我们创建实例,当需要时我们直接从这个容器中进行获取即可。

使用IOC最大的好处就是减少了代码的耦合度,降低了程序的维护成本。

image-20231014163541994

实现原理:

Spring实现IOC容器的是通过:工厂 + 反射,实现的。

如果是基于全注解形式的话,只是将读取配置文件的步骤改成了读取配置类。

然后通过配置类获取需要创建实现的Bean,并通过反射将其创建。

image-20231014163541994

DI依赖注入

站在容器的角度,将对象创建依赖的其他对象注入到对象中。

AOP

AOP 面向切面的编程:在不改变源代码的情况下,实现对逻辑功能的修改。

  • 常用的场景包括记录日志、异常处理、性能监控、安全控制(例如拦截器)等。

AOP 原理:

动态的生成代理类,代理类的执行过程为:

  • 执行增加的代码(例如方法日志记录)-> 回调原方法 -> 增加的代码逻辑。

Spring AOP 动态代理采用 JDK 动态代理或 CGlib 动态生成代理类。

  • 判断被切面的类是否有其实现的接口。
  • 如果有对应的接口,则采用 JDK 动态代理,否则采用 CGlib 字节码生成机制动态代理方式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@SuppressWarnings("serial")
public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
@Override
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
Class<?> targetClass = config.getTargetClass();
if (targetClass == null) {
throw new AopConfigException("TargetSource cannot determine target class: " +
"Either an interface or a target is required for proxy creation.");
}
if (targetClass.isInterface()) {
return new JdkDynamicAopProxy(config);
}
return new ObjenesisCglibAopProxy(config);
}
else {
return new JdkDynamicAopProxy(config);
}
}