功能性代码:模板算法,业务逻辑就是模板算法中的一步,开发人员只需要关注业务实现,做到了高内聚,低耦合。
业务性代码:业务实现逻辑
NoSql:列存储,key-value的map数据结构形式,结构松散,一般聚合计算能力不强。
数据库:行存储,list的集合数据结构形式,查询需要循环遍历
Spring boot:约定优于配置,存在很多默认的配置,简化依赖配置
Java反射什么是反射:反射就是把java类的各种成分拆分成一个个的java对象,像class对象、构造器对象、属性对象、方法对象。
可以拆分的java对象有:
- Class类:代表一个类
- Field类:代表类的成员变量(类的属性)
- Method类:代表类的方法
- Constructor类:代表类的构造方法
获取Class对象三种方式:
- Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
Class stuClass = stu1.getClass();//获取Class对象
- Class stuClass2 = Student.class;
- Class stuClass3 = Class.forName("fanshe.Student");
Java中编译类型有两种:
- 静态编译:在编译时就确定对象实例,像Student stu1 = new Student()。
- 动态编译:运行时确定对象实例。通过类加载器加载class文件的时候确定对象实例。
什么叫代理:通过代理对象来访问真实对象的方法。代理商代理厂家产品。
完成代理,需要两步骤:
- 建立代理对象与真实对象的代理关系,返回代理对象,代理对象类型是真实对象类型。
- 实现代理对象调用真实对象方法的代理逻辑:在调用真实方法前,或后,或异常情况下的一些处理
代理技术有两种
- JDK动态代理:InvocationHandler
- CGLIB动态代理:第三方包,MethodInterceptor
应用场景:
- 事务管理
- Controller通知,控制器通知
- Spring 缓存管理器
实现InvocationHandler,
- 建立代理对象与真实对象的代理关系,返回代理对象:代理对象可以访问真实对象接口下的所有方法,如果真实对象没有实现接口,不能被jdk代理。
- 实现代理逻辑
- public class JdkProxyTest implements InvocationHandler {
private Object realObject;
public Object getProxy(Object targetObject) {
this.realObject = targetObject;
return Proxy.newProxyInstance(
targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this //当前对象实例作为代理对象
);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//spring事务管理,执行SQL前先获取数据库连接
System.out.println("在目标方法执行前执行的逻辑");
Object value = null;
try {
//在执行目标函数之前,通过责任链模式,执行拦截器,当所有的拦截器都执行通过时,才能执行目标函数, // 在handlerAdapter里,就是先执行拦截器,在执行控制器方法的,封装成了HandlerExecutionChain //执行业务逻辑 value = method.invoke(realObject,args); } catch (Exception e) { e.printStackTrace(); //当目标方法执行出现异常时,spring事务管理回滚事务. System.out.println("在目标方法执行出现异常时执行的逻辑"); } //spring事务管理,在执行完目标方法时,释放数据库连接 System.out.println("在目标方法执行后执行的逻辑"); return value; } }CGLIB动态代理
第三方包,实现MethodInterceptor接口
- 建立代理对象与真实对象的对应关系:真实对象可以没有实现接口,代理对象类型是真实对象类型
- 实现代理逻辑:
- pubic class CgibProxyTest impements MethodInterceptor { pubic Object getProxy(Cass clz) { //增强类 Enhancer enhancer = new Enhancer(); //设置真实对象 enhancer.setSupercass(clz); //设置当前实例对象为代理对象 enhancer.setCalback(this); return enhancer.create(); } @Override pubic Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwabe { //spring事务管理,执行SQL前先获取数据库连接 System.out.printn("在目标方法执行前执行的逻辑"); Object resut = nul; try {
//在执行目标函数之前,通过责任链模式,执行拦截器,当所有的拦截器都执行通过时,才能执行目标函数, // 在handlerAdapter里,就是先执行拦截器,在执行控制器方法的,封装成了HandlerExecutionChain //执行业务逻辑 result = methodProxy.invokeSuper(proxy,args); } catch (Exception e) { e.printStackTrace(); //当目标方法执行出现异常时,spring事务管理回滚事务. System.out.println("在目标方法执行出现异常时执行的逻辑"); } //spring事务管理,在执行完目标方法时,释放数据库连接 System.out.println("在目标方法执行后执行的逻辑"); return result; } }责任链模式
定义一个链条,链条上的每个环节都执行通过后才能去执行目标函数,像handlerAdapter,当所有的拦截器都执行通过后才能去执行控制器的函数(handler)。有的时候需要对拦截器的执行顺序排序,通过@Order注解。
场景:请假审批,项目经理审批、部门经理审批、人力部门审批。
观察者模式又称为发布订阅模式,监听模式。原理:维护一个观察者列表,当有信息发布时,依次调用列表里的观察者通知接口。
场景:银行转账,微信、短信都会通知交易情况
工厂模式工厂模式又分普通工厂模式和抽象工厂模式。原理:通过key-value的形式,根据Key找到具体的类,创建实例对象。只不过普通工厂模式是根据Key直接找到具体的类,抽象工厂模式是根据key,先找到具体的普通工厂,然后再根据Key,找到具体的类
策略模式一个问题存在多种解决方案,具体使用哪种方案需要视情况而定。与工厂模式配合使用的比较多。
场景:将商场节日搞促销,像圣诞节要注销的商品、春节要促销的商品。
模板算法模式将过程拆分成几个步骤,每一步的具体实现放到子类中去做。
场景:就是吃水果,将吃水果这个过程拆分成两个步骤:拿水果和吃水果。拿水果可能拿的是苹果,也可能拿的是橙子。吃水果可能是削削吃,也可能是榨汁喝。假如有个苹果子类,拿水果拿的是苹果,吃水果吃得是削的苹果。
AOP说是动态代理,面向切面编程,我更愿意把代理逻辑实现看成是一种模板算法,在目标方法执行前,执行后,或者执行异常该怎么做。
适配器模式适配器模式就是把两个不相关的类关联起来。适配器模式又可以分为类适配器模式和对象适配器模式。
场景:假如进口了一台电视,这台电视电压要求是110V的,国内的电压都是220V的,这个时候需要一个变压器,这个变压器就是要说的适配器。这个变压器需要获取国内的电压将它变为110V,这个时候有两种解决方案:
第一种实现方式是将变压器类(适配器类)继承国内电压类,这样就能获取国内电压,然后进行一些 *** 作,把它变成110V,输出出去。这种方式就是类适配器模式,它使用到了继承。缺点是高耦合,灵活性低。优点是使用方便,代码简化;
第二种方式是变压器类,有国内电压类的引用,就是国电电压类作为变压器类的属性。这样就能通过国内电压类的实例对象获取到国内电压,然后进行 *** 作,将它变为110V,进行输出。这种方式就是对象适配器模式。
Spring mvc的handlerAdapter使用的就是对象适配器模式。
单例模式 建造者模式欢迎分享,转载请注明来源:内存溢出
评论列表(0条)