一 Spring是什么

1-1 Spring容器

就是一个Ioc容器,用来存放各种对象,以及其依赖关系的容器。
image.png
图一的依赖,如果简单的话,能很快的理清楚依赖的关系,但是像图二那样的,考手动去依赖,就会变得很麻烦

1-2 Spring MVC

MCV就是Model,View,Controller的缩写,用来处理web请求。基于spring和servlet的web应用框架

1-3 Springboot

集成,自动化程度更高。内嵌了servlet容器。

二 Spring容器的核心概念

2-1 Bean

容器中最小的工作单元,通常为一个java对象。
bean就是咖啡豆,在容器里面都是单例的。
就是Controller,Service,Dao的对象,就是下面的这些个东西。

  1. // 这里面的 xXXService
  2. @AutoWired
  3. XXXService xXXService;

2-2 BeanFactory/ApplicationContext

容器本身对应的java对象。意思就是BeanFactory就是ioc容器,从这里面拿bean对象。

2-3 依赖注入(DI)

容器负责注入所有的依赖
一个service里面依赖dao,java的约定是,一个对象刚刚new出来之后,他的成员变量都是null,spring的依赖注入可以使得成员变量由null变成有值的对象,这个过程就是依赖注入。

2-4 反转控制(IOC)

用户将控制权交给了容器.
不需要自己控制依赖的生成和装配,只需要自己声明依赖关系,spring容器会自己生成bean然后进行装配,这个就是反转控制。

三 Spring Web应用

3-1 Restful Api

设计Api的一种约定。
使用Http动词来代表动作

  • Get: 获取资源
  • Post: 新建资源
  • Put: 更新资源
  • Delete: 删除资源

    3-2 freemaker模板引擎

    3.2.1 搜索freemaker maven查看用法

3.2.2 ModelAndView

四 AOP以及装饰器模式

4-1 什么是AOP(aspect oriented programming)

面向切面编程。main方法里面调用了别的方法,那么在别的方法执行自己本身的逻辑之前的一瞬间,叫做切面。可以在这个前面里面做些事情,就是面向切面编程。

4-2 装饰器模式

调用某个方法自动打出日志,但是不想改变这个方法的代码。可以使用装饰器模式。对这个方法进行包装,在调用真正的方法钱,包装类先执行一些自己想要的代码,然后再执行真正的代码。

接口

  1. package aop.com.decoratordemo;
  2. public interface DataService {
  3. String a(int i);
  4. String b(int i);
  5. }

实现类

  1. package aop.com.decoratordemo;
  2. import java.util.UUID;
  3. public class DataServiceImpl implements DataService {
  4. @Override
  5. public String a(int i) {
  6. return UUID.randomUUID().toString();
  7. }
  8. @Override
  9. public String b(int i) {
  10. return UUID.randomUUID().toString();
  11. }
  12. }

装饰器类

  1. package aop.com.decoratordemo;
  2. public class DataServiceDecorator implements DataService{
  3. private DataService decorator;
  4. public DataServiceDecorator(DataService decorator) {
  5. this.decorator = decorator;
  6. }
  7. @Override
  8. public String a(int i) {
  9. System.out.println("method a is start");
  10. decorator.a(i);
  11. System.out.println("method a is end");
  12. return "";
  13. }
  14. @Override
  15. public String b(int i) {
  16. System.out.println("method b is start");
  17. decorator.b(i);
  18. System.out.println("method b is end");
  19. return "";
  20. }
  21. }
  1. // 调用
  2. package aop.com.decoratordemo;
  3. public class DecoratorMain {
  4. public static void main(String[] args) {
  5. DataService dataService = new DataServiceDecorator(new DataServiceImpl());
  6. dataService.a(11);
  7. dataService.b(22);
  8. }
  9. }

4-3 动态代理

拦截已有的方法实现,追加自己想要的功能

4.3.1 jdk动态代理

优点:

  • 方便,不需要依赖任何第三方库
  • 缺点,功能受限,只适用于接口,只能拦截接口的方法

代理类

  1. package aop.com.jdkproxy;
  2. import aop.com.decoratordemo.DataService;
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5. import java.util.Arrays;
  6. public class LogProxy implements InvocationHandler {
  7. DataService dataService;
  8. public LogProxy(DataService dataService) {
  9. this.dataService = dataService;
  10. }
  11. @Override
  12. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  13. System.out.println(method.getName() + " is invoked: " + Arrays.toString(args));
  14. Object value = method.invoke(dataService, args);
  15. System.out.println(method.getName() + " is finished: " + value);
  16. return value;
  17. }
  18. }

调用方

  1. package aop.com.jdkproxy;
  2. import aop.com.decoratordemo.DataService;
  3. import aop.com.decoratordemo.DataServiceImpl;
  4. import java.lang.reflect.Proxy;
  5. public class LogMain {
  6. static DataService delegate = new DataServiceImpl();
  7. public static void main(String[] args) {
  8. DataService dataService = (DataService) Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
  9. new Class[]{DataService.class},
  10. new LogProxy(delegate));
  11. dataService.a(11);
  12. dataService.b(22);
  13. }
  14. }

4.3.2 Cglib/ByteBuddy字节码生成

优点:

  • 强大,不受接口限制

缺点:

  • 需要引入第三方库

会自动的生成一个动态的class,去继承要增强的类,这个类没有源代码,只会生成class文件

Sprng 框架中,对标注了Cache注解的方法或者类进行拦截,然后打出日志
image.png