关于Javaspring什么是耦合及如何解决数据库的优化
Posted 小坏蛋至尊宝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Javaspring什么是耦合及如何解决数据库的优化相关的知识,希望对你有一定的参考价值。
java编程模型
1、面向对象编程(OOP):封装性,派生型,多态性。
1.1、封装性:决定了数据的访问限制。
1.2、派生型:决定了上下流的关系。
1.3、多态性:决定了一种接口多种实现。
2、面向切面编程(AOP):拦截判断,拦截执行。
2.1、拦截判断:方法,注解,参数,异常。
2.2、拦截执行:前置,后置,返回,异常。
2.3、什么是面向切面
当我执行一段代码的时候这个地方就会做一定的拦截,会有一些事件和回调的发送。
2.4、AOP实现主要分为 静态代理和动态代理 。
静态代理 主要是 AspectJ
动态代理 主要是 Spring AOP
3、面向元信息编程(MDOP):泛型,反射,注解。
4、面向函数编程(FOP):函数式接口,默认方法,方法引用。
5、面向模块编程(MOP):一种全新的编程思想,是基于OOP,
AOP之上的编程思想,即在AOP之上进行了封装,和模块进行相关联,主要让编程人员专注分析模块的数据关系 与业务流程,至于模块本身的增加,删除,修改,查询,数据展现,性能优化,安全,事务,日志,权限都将由容器来实现,容器基于AOP思想封装了模块的常规编程方面,并且让外部程序可以切入到模块的创建,查询,删除,修改等方面。
Java编程思想
1、契约编程
1.1、操作对象:字段(Fieid),方法(Method),构造器(Contructor)
1.2、语义命名:模块名,包名,类名,枚举;字段,方法,常量。
1.3、访问控制:private 默认,protectted ,public
1.4、方法返回类型:类型(数据结构,泛型),多态性(层次性),约束(注解)
1.5、异常错误:类型(检查和非检查),层次(Throwable,Error,Exception),来源(JDK,自定义,三方库)
2、设计编程
2.1、面向对象设计模式(OOP):构造模式,结构模式,行为模式,并发模式
2.2、面向切面设计模式(AOP):判断模式,拦截模式
2.3、面向元数据设计模式(MDOP):泛型接口设计,注解驱动设计
2.4、面向函数设计模式(FOP):函数式接口设计(SCFP),Fluent API设计,Reactive/stream API设计
3、模式驱动
3.1、接口驱动
JavaSE(Gof 23模式)
JavaEE API(servlet,JSF,EJB.......)
spring core API(interface 21)
3.2、配置驱动
Java Sysem properties
OS环境变量
文件配置(XML,properties,YAML)
Java EE配置(JDNI,servlet,EJB.....)
3.3、函数驱动
java 8 stream API
java 9 Flow API
Rxjava , spring boot webFlux
Vertx
spring cloud Gateway/Function
3.4、模块驱动
java OSGI
java 9 Module
spring @Ehable
spring boot AutoConfinguration
spring boot Actuator
3.5、注解驱动
java SE(java Beans,JMX....)
java EE(servlet3.0+,jax-Rs,BeanValidation,EJB3.0+.....)
Spring (@Component,@service,@Respository......)
spring boot (@spring boot Application)
spring Cloud (@spring CloudApplication)
java服务器开发三层
1、springMVC框架 表现层
2、spring框架 业务层
3、MyBatis框架 持久层
Java中实现多线程之间的通信和协作,是通过中断和共享变量实现的。
什么是线程池,为什么要使用它?
创建线程要花费昂贵的资源和时间,如果任务来了才创建线程,那么响应时间会变长,而且一个进程能创建的线程数有限,为了避免这些问题,在程序启动时就创建若干线程来响应处理,他们被称为线程池,里面的线程叫工作线程。
为什么调用start()方法时会执行run()方法?
当你调用start()方法时你将创建新的线程,并且执行在run()方法里的代码。
为什么不直接调用run()方法?
如果直接调用run()方法,它不会创建新的线程池,不会执行调用线程的代码,只会执行run()方法当作普通方法执行。
面向对象的特性
1、抽象:只关注对象有那些行为和属性。
2、继承:是从已有类得到继承信息的创建类过程。
3、封装:把数据和操作数据的方法绑定起来。
4、多态性:指允许不同子类型的对象同一消息作出不同响应。
方法重载:实现的是编程时 的多态性。
方法重写:实现的是运行时的多态性。
构造器不能被继承,因此不能被重写,但可以被重载。
&&与&的区别
&:运算符有两种用法:1、按位与,2、逻辑与
&&:运算符是短路与运算。
string,stringbuilde,stringbuffer的区别
1、三个类型可以储存和操作字符串。
2、string只能读字符串,内容不能被改变的,其余两个不可以。
3、stringbuilde与stringbuffer方法完全相同,区别是stringbuilde是在单线程环境下使用。
解决stringbuffer拼接字符串频繁循环,解决效率
创建stringBuffer对象的时候,对拼接的字符串长度做预估。
例:StringBuffe strBu = New StringBuffe(capacity:预估值);
抽象类与接口
1、两个都不能实例化,但可以定义抽象类和接口类型的引用。
2、抽象类中可以定义构造器,可以有抽象类方法和具体方法。
3、接口中不能定义构造器,而且其中的方法全部都是抽象方法。
4、抽象类中的成员可以是private,默认,protected,public。
5、接口中的成员全是public,抽象类中可以定义成员变量。
6、接口中定义的实际是常量,有抽象方法的类必须声明为抽象类,而抽象类未必要是抽象方法。
关键字final
修饰类:不能为继承
修饰方法:方法不能被重写
修饰变量:变量只能一次赋值以后值不能被修改(常量)
进行异常处理的关键字:throws throw try catch finally
线程与进程的区别
进程是操作系统分配资源的最下单元。
线程是操作系统调用的最下单元。
什么是阻塞队列,实现原理是什么?
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。
两个附加操作是:在队列为空时,获取元素的线程会等待队列变为空。当队列满时,储存元素的线程会等待队列可用。
阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程,阻塞队列就是生产者存放元素的容器,而消费者也是从容器里拿元素。
Java VM的内存模型
1、方法区(Method Area)
2、堆(Heap)
3、虚拟机栈(Java Stack)
4、本地方法栈(Native Method Stack)
5、程序计数器( Program Counter Register)
垃圾回收算法
1、标记清除:标记阶段,清除阶段
2、复制算法
3、标记整理
4、分代收集算法
什么是耦合
耦合性是编程中的一个判读代码模构成质量的属性,不影响已有的功能,但影响未来扩展,与之对应的是内聚性。
耦合性:也称块间联系。指软件系统结构中各模块间互相联系紧密程度的一种度量。模块之间联系越紧密,耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂度性,调用方式及传递的信息。
内聚性:又称内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间,程序度之间)联系的越紧密,则它的内聚性就越高。
因此,现代程序讲究高内聚低耦合,即将功能内聚在同一模块,模块与模块之间尽可能独立,互相依赖低,没有绝对没有耦合的模块,只有尽量降低互相之间的影响,使模块越独立越好。
spring在SSM框架中起什么作用
spring:轻量级框架
作用:Bean工厂,用来管理Bean的生命周期和框架集成。
两大核心:AOP面向切面编程,动态代理。
IOC控制反转:把DAO依赖注入到service层
DI依赖注入:service层转给action层,spring顶层容器为BeanFatory。
spring的事务
1、编程式事务管理:编程方式管理事务,极大灵活性,难维护。
2、声明式事务管理:可以将业务代码和事务管理分离,用注解和XML配置来管理事务。
IOC在项目的作用
Ioc解决对象之间的依赖问题,把所有Bean的依赖关系通过配置文件或注解关联起来,降低耦合度。
spring实现的两种模式
1、工厂模式:工厂模式,简单工厂模式,抽象工厂模式
2、单态模式
spring是什么
spring是一个轻量级的DI和AOP容器框架(支持用户自定义切面)。
DI:称作依赖注入和控制反转一个概念。
DI的两种方式
1、构造器注入:通过构造方法初始化。
<constructor-arg name = "dao"></constructor-arg>
2、setter注入:通过setter方法初始化注入。
<property name = "dao" ref = "dao2"></property>
AOP:spring对面向切面编程提供了让我们将业务逻辑从应用服务(如事务管理)中分离出来,实现高内聚开发。
AOP的两种实现方式
1、JDK代理(动态的代理)
2、CGLib的方式
CGLib所创建的动态代理在实际运行时候要高。CGLib在创建对象的时候所花费时间比JDK多,因此对于singleton(单例模式)的代理对象或者具有实例池的代理,因为无需频繁的创建代理对象,所以比较适合CGLib动态代理,相反则比较JDK动态代理。
OOP:静态的抽象,AOP:动态的抽象。
容器:spring是一个容器,因为它包含并且管理应用对象的生命周期和配置。如对象创建,销毁,回调等。
框架:spring作为一个框架,提供了基础功能,如:事务管理,持久层集成等,使开发人员更专注于应用逻辑的开发。
优点:
1、降低组件之间的耦合性
2、提供众多事务,事务管理,WS等
3、AOP很好支持,方便面向切面编程
4、对主流框架提供了很好的集成支持 ,如Struts2
5、springDI机制降低了业务对象替换的复杂性
6、属于低侵入,代码污染底低
7、高度可开发性,不强制依赖,可自由选择
缺点:
1、JSP中药写很多代码
2、不支持分布式
3、失去IDE的支持
4、调试阶段不直观,后期bug对于阶段,不容易判断问题所在
spring配置文件有如下内容
1、开启事务注解驱动
2、事务管理器
3、开启注解功能,并配置扫描包
4、配置数据源
5、配置SQL会话工厂,别映射文件
6、不用编写DAO层的实现类(代理模式)
数据库中如何做优化
1、对查询进行优化,尽量避免全表扫描,应考虑在where即order by 涉及的列上建索引。
2、避免在where子句中对字段进行null值得判断。
3、避免在where子句中使用!=或<>操作符。
4、避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
5、in和not in也要慎用,否则会导致全表扫描。
6、like模糊全匹配也将致全表扫描。
mybaits和hibernate的区别
共同点:都是通过orm对象关系映射框架,都是持久层数据框架。
不同点:hibernate是重量级框架,mybaits是轻量级的。
hibernate对JDBC的封装比较深,对开发者写SQL的能力不是很高,只需要通过Hql语句操作对象即完成持久化。
mybatis也是对JDBC的封装,但是没有hibernate那么深,它的SQL语句都在配置里,可以通过重写配置SQL来实现数据持久化,实施起来比较方便,处理大数据SQL优化更方便。
以上是关于关于Javaspring什么是耦合及如何解决数据库的优化的主要内容,如果未能解决你的问题,请参考以下文章
javaSpring 自己模拟 Spring 实现 IOC依赖注入 并且 解决 循环依赖
操作系统关于多线程同步中的死锁问题一篇文章让你彻底搞明白死锁到底是什么情况及如何解决死锁