前置知识
1.三层架构及其MVC的关系
三层架构是一个分层式的软件体系架构设计,是一个概念。分为表现层UI,业务逻辑层BLL,数据访问层DAL。三层架构的重点是实现“高内聚,低耦合”,即解耦。
MVC的作用是实现三层架构中的UI层,例如:
M层(model)是应用程序的主体部分,提供数据和数据之间的关系(类与类之间)、转化等等。
V层(view)是应用程序中用户界面相关部分,具体实现数据的展示和输入功能。例如 JSP HTML
C层(controller)是根据用户的输入,控制用户界面的数据显示和更新model对象状态。起到控制整个业务流程、实现mv两层之间协同作战的目的。Servlet service(JAVA WEB)
MVC是一种设计模式,目的是让HTML代码和业务逻辑代码分开,让代码看起来更加清晰,便于开发。
小项目经常会将三层架构和MVC模式混为一谈,认为M对应数据访问层DAL(Dao和实体类),V对应表现层UI,C对应业务逻辑层BLL。这是因为在很多时候一些小项目分层架构不明细、缺少对应的概念分包所导致的。
- 高内聚、低耦合
这个概念是软件工程中的一个概念,是判断设计好坏的标准。简而言之,就是看类的内聚性是否高,耦合度是否低
高内聚:一个软件模块必须由关联性很强的代码组成,也就是一个模块只做一件事。
低耦合:不同的模块之间互相关联的程度是否足够低,面向对象变成面向接口编程(实例,改造dao并采取面向接口编程)。
设计模式之工厂模式(简单工厂、抽象工厂、单例)
(单例)
1. 单例类只能有一个实例
2. 单例类必须创建自己唯一的实例。
3. 单例类必须为其他对象提供这一实例。
那么如何实现满足上述条件的单例类呢?答案是:
1. 私有构造方法。
2. 内部创建静态对象。
3. 提供静态方法返回该静态对象。
懒汉模式/饿汉模式
//饿汉式 class T{ private T(){ } private static T t = new T(); public static T a(){ return t; } } //懒汉式 class T1{ private T1(){ } private static T1 t1; public static T1 a(){ if(t1==null){ t1 = new T1(); } return t1; }
Spring初体验之IOC
- spring是什么,它的优点是什么
a) 一个轻量级的企业开发软件,时至今日已经在很多企业被应用。
b) 非侵入式框架,优点在于松耦合、可配置、易测试。
2.String体系架构
3.Spring主要模块
a) Spring核心模块(Spring Core):Spring的核心容器模块,它提供IOC的支持。该模块中包含BeanFactory,它采用工厂模式来实现IOC,负责对bean的生命周期的管理。
b) Application Context(上下文模块):该模块扩展了BeanFactory的功能,例如提供了i18n,系统生命周期以及验证的支持
c) Spring的AOP模块:该模块为应用系统的AOP开发提供了支持。
d) JDBC和DAO模块:提供了JDBC封装的模板代码,使得使用JDBC开发更加简洁。
e) ORM映射模块:该模块提供了对许多流行的ORM框架的支持,其中包括Hibernate,JDO和iBATIS SQL的支持
f) Spring Web模块:该模块中Spring提供了对其它的WEB框架的支持,包知Struts,JSF,WEBWORK等
g) Spring MVC框架:Spring提供的用于开发WEB应用的MVC框架
4.Spring核心应用之IOC:
a) IOC(控制反转):程序中各个组件之间的关系,不由程序代码直接操控,而由容器控制。控制权由应用代码中转到了外部容器,即所谓的反转。
b) DI(依赖注入):各个组件之间的依赖关系不是在程序中写死,而是写在外部的配置文件中,然后运行时通过容器动态注入。
5。SringIOC开发:
a) 导入jar包:
<dependency> |
b) 声明一个bean
c) 创建配置文件,并从配置文件中配置对象
d) 创建测试类,通过XmlBeanFactory初始化bean工厂,通过bean工厂从xml中读取对象。
6.异同:
a) BeanFactory和ApplicationContext:ApplicationCotext是spring更加高级的IOC容器除BeanFactory的功能外,还有如下特性:
提供文本信息解析工具,包括对国际化支持。
提供载入文件资源的通用方法,如图片。
可以向注册为监听器的bean发送事件。
BeanFactory延迟加载所有bean,直到getBean()方法被调用。ApplicationCotext会在启动后预载入所有单例bean
b) Id和name:使用基本一致,name允许有一些特殊字符
c) 通过property初始化对象属性和constructor-arg初始化对象属性
d) Bean和Property:
7.集合装配:如果对应bean的属性是一个集合则需要使用集合装配,Spring支持多种集合装配类型:
a) <list>对应类型为java.util.List、java.util.Vector 、java.util.Collection 、数组的属性
b) <set>对应类型为java.util.Set的属性
c) <map>对应类型为java.util.Map的属性
d) <props>对应类型为java.util.Properties的属性
- 集合装配示例:
a) List装配:
<property name=“list">
<list>
<value>a</value>
<value>b</value>
</list>
</property>
b) Set装配:
<property name=“set">
<set>
<value>a</value>
<value>b</value>
</set>
</property>
c) Map装配:
<property name=“map">
<map>
<entry key="1" value=“a"></entry>
<entry key="2" value=“b"></entry>
</map>
</property>
8.自动装配:为了方便配置,spring提供了自动装配,有四种类型,分别如下:
a) byName:寻找和属性名相同的bean,若找不到,则装不上。
b) byType:寻找和属性类型相同的bean,若找不到,则装不上,找到多个,抛异常。
c) constructor:查找和bean的构造参数一致的一个或多个bean,若找不到或找到多个抛则异常。按照参数的类型装配,与(2)相似.
d) autodetect:首先尝试用(3)来装配,然后使用(2)方式。不确定性的处理与(3)和(2)一致。
注意:使用最多的是通过byName进行诸如
- Bean的作用域:通过scope标签指定,有如下常见作用域
a) singleton 单实例,即在整个应用程序中有一个Bean的实例。
b) prototype原型,每次请求获取bean时,容器都会构建新的bean实例。
以下几个为Spring2.0新加的作用域:
c) session对应web应用时, 对应Web应用的每个会话会建立一个bean的实例。
d) request对应web应用时,对应Web的每个请求会建立一个bean实例。
- Bean的延迟加载:通过lazy-init 属性确定是否延迟初始化,默认为false
- Annotation注解模式实现注入:
a) 修改spring_ico.xml,写入<context:component-scan base-package="需要扫描的包名"/>。
b) 将需要受Spring管理的组件加入@Component[(“cpmponentName”)]
c) 如果某些组件需要被注入其他组件的话,需要在set方法加入: @Resource[(name=“cpmponentName”)]
9.Annotation的优缺点:
a) 优点:灵活、简单、开发效率高
b) 缺点:如果没有源码,就无法运用annotation,只能使用xml