一 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
@AutoWired
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动词来代表动作
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 {
@Override
public String a(int i) {
return UUID.randomUUID().toString();
}
@Override
public 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;
}
@Override
public String a(int i) {
System.out.println("method a is start");
decorator.a(i);
System.out.println("method a is end");
return "";
}
@Override
public 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;
}
@Override
public 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注解的方法或者类进行拦截,然后打出日志