一 Spring是什么
1-1 Spring容器
就是一个Ioc容器,用来存放各种对象,以及其依赖关系的容器。
图一的依赖,如果简单的话,能很快的理清楚依赖的关系,但是像图二那样的,考手动去依赖,就会变得很麻烦
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的对象,就是下面的这些个东西。
// 这里面的 xXXService@AutoWiredXXXService 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动词来代表动作
3.2.2 ModelAndView
四 AOP以及装饰器模式
4-1 什么是AOP(aspect oriented programming)
面向切面编程。main方法里面调用了别的方法,那么在别的方法执行自己本身的逻辑之前的一瞬间,叫做切面。可以在这个前面里面做些事情,就是面向切面编程。
4-2 装饰器模式
调用某个方法自动打出日志,但是不想改变这个方法的代码。可以使用装饰器模式。对这个方法进行包装,在调用真正的方法钱,包装类先执行一些自己想要的代码,然后再执行真正的代码。
接口
package aop.com.decoratordemo;public interface DataService {String a(int i);String b(int i);}
实现类
package aop.com.decoratordemo;import java.util.UUID;public class DataServiceImpl implements DataService {@Overridepublic String a(int i) {return UUID.randomUUID().toString();}@Overridepublic String b(int i) {return UUID.randomUUID().toString();}}
装饰器类
package aop.com.decoratordemo;public class DataServiceDecorator implements DataService{private DataService decorator;public DataServiceDecorator(DataService decorator) {this.decorator = decorator;}@Overridepublic String a(int i) {System.out.println("method a is start");decorator.a(i);System.out.println("method a is end");return "";}@Overridepublic String b(int i) {System.out.println("method b is start");decorator.b(i);System.out.println("method b is end");return "";}}
// 调用package aop.com.decoratordemo;public class DecoratorMain {public static void main(String[] args) {DataService dataService = new DataServiceDecorator(new DataServiceImpl());dataService.a(11);dataService.b(22);}}
4-3 动态代理
4.3.1 jdk动态代理
优点:
- 方便,不需要依赖任何第三方库
- 缺点,功能受限,只适用于接口,只能拦截接口的方法
代理类
package aop.com.jdkproxy;import aop.com.decoratordemo.DataService;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.util.Arrays;public class LogProxy implements InvocationHandler {DataService dataService;public LogProxy(DataService dataService) {this.dataService = dataService;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(method.getName() + " is invoked: " + Arrays.toString(args));Object value = method.invoke(dataService, args);System.out.println(method.getName() + " is finished: " + value);return value;}}
调用方
package aop.com.jdkproxy;import aop.com.decoratordemo.DataService;import aop.com.decoratordemo.DataServiceImpl;import java.lang.reflect.Proxy;public class LogMain {static DataService delegate = new DataServiceImpl();public static void main(String[] args) {DataService dataService = (DataService) Proxy.newProxyInstance(delegate.getClass().getClassLoader(),new Class[]{DataService.class},new LogProxy(delegate));dataService.a(11);dataService.b(22);}}
4.3.2 Cglib/ByteBuddy字节码生成
优点:
- 强大,不受接口限制
缺点:
- 需要引入第三方库
会自动的生成一个动态的class,去继承要增强的类,这个类没有源代码,只会生成class文件
Sprng 框架中,对标注了Cache注解的方法或者类进行拦截,然后打出日志
