1. 框架概念
程序的架子,可以快速的构建起程序的基本骨架,并为通用问题提供了便捷统一的解决方案。
2. EE开发中的框架
SSH
SSM - SpringMVC Spring MyBatis
3. Spring框架
IOC(DI) 控制反转(依赖注入)
AOP 面向切面编程
a. IOC - 低耦合
将对象创建的权利和生命周期管理的过程交由Spring容器来进行。
接口 + IOC 实现软件分层的解耦。
a. 配置文件
b. 注解方式
配置包扫描context:component-scan
通过注解将bean交由Spring管理
@Component
@Controller
@Service
@Repository
生成id的策略 - 看类名的第二个字母,如果第二个字母是小写则首字母小写作为id,如果第二个字母是大写,则首字母保持不变作为id。
也可以通过value属性手动指定id
b. DI实现
i. 配置文件
ii. 注解方式
开启注解方式DI
context:annotation-config</context:annotation-config>
通过注解实现DI
a. String 、基本数据类型
@Value(“xx”)
@Value("${xx}")
b. 集合、Map、Properties等
@Value("#{@xxx}")
3. 自定义Bean的注入
@Autowired
先按类型匹配,如果找到唯一的则自动注入,如果找不到或找到多个接着按id注入,用当前属性的属性名作为id寻找对应的bean如果找到就注入,还找不到就抛出异常。
可以通过@Qualifier(xxx)修饰,一旦修饰,则上来就按照指定id寻找bean,不再按类型寻找。
c. 其他注解
@Scope 单例/多例
@Lazy 懒加载
@PostConstruct 初始化方法
@PreDestory 销毁
d. AOP - 面向切面编程 - 高内聚
service增加了大量功能型代码造成代码混杂在一起,功能型代码重复。
通过动态代理为service创建代理,web调用的其实是代理对象,在代理对象内部调用目标service对象目标方法时,可以在方法执行之前和之后执行额外代码,从而增强service功能,可以将功能型代码从service中提取到动态代理即切面中。
i. 代理设计模式
- 静态代理
简单
所有方法都要手工实现代理,麻烦且代码重复
ii. 动态代理 - java动态代理
相对静态代理,代码不再重复,写一遍就行
概念不好理解
基于接口开发,如果目标方法不属于任何借口,则无法代理。
ii. cglib动态代理
基于继承实现,无需接口也可以实现代理。
不是java原生的需要导入第三方开发包才可以使用。
ii. SpringAOP中的重要概念 - 连接点
- 切入点
- 动态代理
- 切面
- 通知
- 目标对象 目标方法
- 织入
iii. 切入点表达式 - within - 粗
- execution - 细
iv. 通知
前置
环绕
控制目标方法是否执行
控制目标方法的返回值是否可以返回
改变返回值
后置
异常
最终
v. 配置文件方式
vi. 注解方式
aop:aspectj-autoproxy
@Aspect
@Before
@Around
@AfterReturning
@AfterThrowing
@After
@Pointcut
4. Spring-JDBC
Spring管理数据源
SpringJDBC - JDBCTemplate
SpringJDBC - 声明式事务管理
@Transactional
5. SpringMVC
web层框架
6. SpringMVC工作流程
a. @RequsetMapping
将处理器方法映射到路径
可以用在类上 和 方法上
value
method
params
headers
b. 获取请求参数
通过request获取
直接获取
@RequestParam直接获取,手工指定
封装请求参数到bean
复杂类型处理
多个同名请求参数处理
中文乱码处理
日期处理
文件上传
表单的写法
必须有name属性
必须采用POST提交
必须设置enctype为multipart/form-data
后台处理程序的写法
RESTFul风格路径处理 - 将路径的一部分截取作为参数传入
c. 请求转发重定向 定时刷新的实现
forward:/index.jsp
redirect:/index.jsp
d. 域的使用
request域
通过request对象使用
通过Model对象使用
session与
通过session对象使用
通过Model对象配合@SessionAttributes
@ModelAttribute
xxx
e. 异常处理
配置控制器异常处理方法
配置全局异常处理
配置文件方式全局异常处理
f. 返回一段数据
@ResponseBody
g. 总结:可以用作控制器方法参数和返回值的类型
7. MyBatis
数据访问层框架 - 一行代码都不用事先CRUD
JDBC - Hibernate - MyBatis
sqlMapConfig.xml --> 配置数据源 别名 缓存开关
xxxMapper.xml -->映射文件
Map传递
bean传递
单值传递
#{} ${}的区别
增删改查的实现
手动映射结果集
如果查询的列名和bean属性名对不上 – 可以通过手工映射结果集完成封装
实现多表查询
笛卡尔积查询
内连接查询
外连接查询
左外
右外
全外
MyBatis的缓存机制
一级缓存默认开启,在一个事物内起作用
二级缓存默认关闭,全局起作用
基于接口开发MyBatis - 不写代码实现CRUD
接口的全路径名应为映射文件中声明的名称空间
接口中应该声明和映射文件中sql对应的id相同名称的方法
方法接收的参数应该和sql中接收的参数一致
方法的返回值应该和sql中声明的返回值类型一致