软件架构技术课堂笔记1
<会存在很多问题,日后的学习会进行更正>
什么是架构?
架构 是一系列相关的抽象模式,用于指导大型软件系统各方面的设计。是软件系统从整体到部分的最高层次的抽象划分(系统设计规划图)
根据关注的角度不同,架构大概有三种:(前几年比较流行:MVC)
逻辑架构 : 主要描述软件系统中元件之间的关系,例如用户界面,数据库,业务逻辑元件等等。
物理架构 : 软件元件是如何安装到硬件上的。
系统架构 : 系统的非功能性特征,如扩展性、可靠性、强壮性、灵活性、性能等。
架构一个软件系统,通常就会用到分层技术。
现在比较流行的架构 MVVM(前后端分离)
分层技术的基本概念
1.软件开发主要任务,是要保证软件的高效运转和功能的正常实现。分层技术通过对软件内部结构进行解析,赋予不同层次结构的不同功能,从而提高软件功能的丰富程度和使用性能。
2.分层技术为软件的不同层次结构分配不同的解决过程,各个层次结构间组成一个严密的封闭系统。不同层面结构彼此平等。分层技术最主要的应用领域是软件架构开发。
3.分层技术是将软件按照一定逻辑关系分解成多个面,每个层面都有各自的功能,组合起来则形成完整的软件。各分层之间具有一定独立性,需要完善软件功能或者对软件进行升级改造时,只需要对涉及到的分层进行完善修改,对其它层面几乎没有影响,使软件升级和改造工作变得更加简单,提高工作效率。
4.分层技术通过分层模式来定义各个功能层次的接口。按照这种设计方式,
软件复用性得以大幅提高,对于软件开发、设计十分有利。开发之后的
各个层面能够充分利用标准接口,有效实现自动对接。
软件分层技术
分层技术是当前软件开发设计中使用频率十分高的一种设计方式,多层分布技术已成为今后软件开发设计的主要方向之一。
软件分层的目的就是为了架构一个好的系统,通过分层:
1.降低耦合,降低层与层之间的依赖。有利于应对需求变更,有利于排错,有利于后期的维护。
2.简化问题复杂度,各层分工明确。例如OSI七层模型和简化的tcpip协议的四层模型。把一个复杂问题分解,达到化繁为简的效果。但是,一般针对系统大小而言的,如果一个小的系统,也可能会把简单问题复杂化(如多人协调工作,要用到分层设计)。
软件分层技术作用特点:
1.有利于团队开发,分工合作。开发人员可以只关注整个结构中的其
中某一层,三层架构中,基本可以将工作分为界面设计人员、业务
实现人员、数据库设计人员。只要各层接口在开发前规定好,那么,
各层可以独立开发升级和维护。
2.有利于标准化。在开发过程中可以将每层的代码进行规范,固定开发语言的风格,可以忽略数据库的差异,设计完善的数据访问层可以将数据库的差异完全屏蔽,可以快速安全地实现数据库的切换等。
3.方便用新的实现来替换原有层次的实现,便于系统维护/升级。各层间通过接口解耦,接口与实现分离,从而可以非常方便的替换掉实现,或者升级实现等。
5.逻辑复用。例如原来基于B/S开发的程序现在要改成C/S,那么只要业务层的接口没有改变,那么业务层和数据层都可以直接复用。
6.方便部署。将各层开发成组件,则可以独立部署。分层可以把各层部署在不同的地方,实现分布式系统。
MVC (模型-视图-控制器)
Model 负责存储系统的中心数据,将数据保存至一个模型中,方便使用。
View: 显示界面(html, jsp,asp,php…)。
Controller: 处理用户输入的信息,进行向模型发送数据。
Spring框架
Spring框架的作用
1.软件架构中利用Spring框架管理系统的各个组件(Action、Service、DAO),使用Spring的Ioc和AOP机制实现应用程序中的Bean组件等的关联,从而实现了低耦合调用,增强系统可维护性和扩展性。
2.Spring通过控制反转(IoC) 技术实现低耦合。
Spring概述
Spring用于管理组件,组件的管理需要进行配置
Spring为组件提供服务,服务的使用也需要配置
Spring是-个轻量级的框架,提供管理组件和提供服务的实现类。
Spring Frame 下载的集成框架包中:
- dist (开发者代码 当前版本可使用的)
- jar包(类zip,解压内容)
- javadoc.jar 文档说明
- source 源码
- docs 开发文档
- schema XML文档约束
schema是新的XML文档约束;DTD出现的比较早. Schema要比DTD强大很多; Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。( XML Schemas Definition )(xmlns : XML namespace)
###Spring 常见核心jar包
core (核心工具类的jar包)
beans (访问配置文件,创建和管理bean的主要内容)
context (提供基础的Ioc功能上的扩展服务)
epression (Spring的表达式语言)
第三方依赖包,Apache 的commons.logging (日志处理的内部包)
移除某个包后变红反映的是
- 耦合:程序之间的依赖关系
包括:
- 类之间的依赖
- 方法之间的依赖
- 解耦操作:
降低程序间的依赖关系(编译期不依赖,运行时才依赖 )
如何进行解耦:- 解耦的思路:
- 使用反射创建对象,避免使用new关键字
(如案例中的 new com.mysql.jdbc.Driver)- 读取配置文件来获取创建对象的全限定类名(运行期,创建对象,工厂模式)
数据库的使用方式
1.注册驱动
2.获取连接
3.获取操控数据的预处理对象
4.执行sql返回执行结果
5.遍历结果集
6.关闭资源
Bean.xml
xml放在src目录下
xml的两种约束形式 限制随意标签的修改,不像html,可以修改写错。
用于作为配置文件。(dtd ,xsd )
Spring framework learn 文档说明 core
把创建对象交给spring来管理
Bean 属性:
Id 创建对象唯一表示
Class 类文件权限名称
Scope:表示当前对象的作用范围
- singleton:默认值,表示当前对象为单例对象
- Prototype:表示当前对象为多例对象
- request:Spring创建bean对象,将对象存储在request域中。
- session:Spring创建bean对象,将对象存储在session域中。
- global session: 分布式环境web项目,如果没有,则与session一样。
1
2
3
4
5
6//singleton
默认:us1==us2 (则为单例模式)
UserService usl = (UserService) ac. getBean( s: " userService" ) ;//强转
UserService us2 = ac. getBean( s:" userService" , UserService. class)
// 转化为UserService的字节码
us1==us2 (则为单例模式) //true
Init-method: 在指定类中初始化方法名称(如果有该方法,则自动进行)
Destroy: 在指定类中销毁方法名称(释放容器时执行)
主线程结束 spring容器还未关闭释放,则无法调用destroy方法
代码演示节选:
1 | import org. spr ingframework. context. Appl icationContext; |
小结: spring 配置步骤:
- 导入相关的jar包并添加
- 在类的根目录下建立一个非中文的任意名称的xml、文件(bean.xml)
- 让spring管理资源,在配置文件中配置要创建的对象
- 测试
1)ApplicationContext 对象 spring容器的顶级接口,超类,
2)根据 id 获取对象
实现类:
- ClassPathXmlApplicationContext:可以加在类路径下的配置文件,要求配置
文件必须在类路径下,如果不在,加载不了。(常用) - FileSystemXmlApplicationContext:可以加在磁盘任意路径下配置文件(绝对
路径–必须要求访问权限) - AnnotationConfigApplicationContext:用于读取注解创建的容器
类的介绍:
BeanFactory: spring 容器的顶级接口
ApplicationContext :BeanFactory 的子接口
ApplicationContext 和 BeanFactory 区别:
创建对象的时间点不一样。
ApplicationContext ,只要读取配置文件,默认情况就会创建对象。
BeanFactory 什么时候用到该对象则才创建对象。
Bean注入方法:
- 方法:Spring 容器调用无参构造方法注入,创立对象。
userService us1 =(UserService) ac.getBean("userService"); //类名
bean属性:
name:指定参数在构造方法中的名称
index:指定参数列表中的索引位置
type:指定参数列表中的参数类型 (多个相同会出问题)
value:赋值,基本类型或String类
ref: 可以赋值其他bean类型的对象
使用构造方法的注入过程
若想要调用有参数的构造方法。则:
使用构造方法的注入过程方式
要求:需要提供一个对应参数列表的构造函数
标签: constructor-arg
1 | <bean id=”userService ” class=”com.test.UserService”> |
== 比较地址的值
equals 实际的值
比较对象 需重写equals方法