目录
SpringMVC
工作原理
常用注解
Spring
特性
Spring IOC
AOP
常用注解
bean的生命周期
作用
事务
配置文件
bean的自动装配
方式
Shiro
组件
权限控制方式
粗颗粒和细颗粒权限
如何授权
MyBatis
#和$
编程步骤
JDBC与MyBatis
SpringMVC
工作原理
- 用户向服务器发送请求,请求被 springMVC 前端控制器 DispatchServlet 捕获;
- DispatcherServle 对请求 URL 进行解析,得到请求资源标识符(URL),然后根据该 URL 调用 HandlerMapping将请求映射到处理器 HandlerExcutionChain;
- DispatchServlet 根据获得 Handler 选择一个合适的 HandlerAdapter 适配器处理;
- Handler 对数据处理完成以后将返回一个 ModelAndView()对象给 DisPatchServlet;
- Handler 返回的 ModelAndView()只是一个逻辑视图并不是一个正式的视图, DispatcherSevlet 通过ViewResolver 试图解析器将逻辑视图转化为真正的视图 View;
- DispatcherServle 通过 model 解析出 ModelAndView()中的参数进行解析最终展现出完整的 view 并返回给客户端;
常用注解
- @requestMapping 用于请求 url 映射。
- @RequestBody 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。
- @ResponseBody 注解实现将 controller 方法返回对象转化为 json 响应给客户。
Spring
开源框架,为简化企业级应用开发而生,是一个 IOC 和 AOP 容器框架。
特性
- 控制反转(IOC):传统的 java 开发模式需要直接或者间接调用构造方法创建一个对象,spring 开发模式中,spring 容器使用了工厂模式为我们创建了所需要的对象,直接调用 spring 提供的对象就可以了。
- 依赖注入(DI):spring 使用 javaBean 对象的 set 方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程。
- 面向切面编程(AOP):在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。 AOP 底层是动态代理,如果是接口采用 JDK 动态代理,如果是类采用CGLIB 方式实现动态代理。
Spring IOC
负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期
优点:IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和 JNDI 查找机制。最小的代价和最小的侵入性使松散耦合得以实现。
方式:1.Set注入
2.构造器注入
3.静态工厂的方法注入
4.实例工厂的方法注入
AOP
利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。在 Spring AOP 中,切面通过带有@Aspect 注解的类实现。切面是通知和切点的结合。
连接点:Join Point,被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring 中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。
通知:Advice,在方法执行前或执行后要做的动作,实际上是程序执行时要通过 SpringAOP 框架触发的代码段。 有五种类型的通知---------a. before:前置通知,在一个方法执行前被调用。
b. after: 后置通知,在方法执行之后调用的通知,无论方法执行是否成功 c. after-returning: 返回通知,仅当方法成功完成后执行的通知。
d. after-throwing: 异常通知,在方法抛出异常退出时执行的通知。 e. around: 环绕通知,在方法执行之前和之后调用的通知
切点:Pointcut,一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。
目标对象:被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。
代理:代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。
织入:织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。织入可以在编译时,加载时,或运行时完成。
常用注解
- @Required:该注解应用于设值方法
- @Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
- @Qualifier:该注解和@Autowired 搭配使用,用于消除特定 bean 自动装配的歧义。
bean的生命周期
- 定义:在配置文件里面用来进行定义。
- 初始化:两种方式---a.在配置文件中通过指定 init-method 属性来完成 b.实现 org.springframwork.beans.factory.InitializingBean 接口
- 调用
- 销毁:两种方式----a.使用配置文件指定的 destroy-method 属性
b.实现 org.springframwork.bean.factory.DisposeableBean 接口
作用
- Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系,只需要改配置文件即可
- Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。Spring 面向切面编程能提供一种更好的方式来完成,一般通过配置方式,而且不需要在现有代码中添加任何额外代码,现有代码专注业务逻辑。
- Spring 能非常简单的帮我们管理数据库事务。采用 Spring,我们只需获取连接,执行 SQL,其他事物相关的都交给 Spring 来管理了。
- Spring 还能与第三方数据库访问框架(如 Hibernate、 JPA)无缝集成,而且自己也提供了一套 JDBC访问模板,来方便数据库访问。
- Spring 还能与第三方 Web(如 Struts、 JSF)框架无缝集成,而且自己也提供了一套 Spring MVC
- 框架,来方便 web 层搭建。
- Spring 能方便的与 Java EE(如 Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)
事务
声明式事务管理的定义:用在 Spring 配置文件中声明式的处理事务来代替代码式的处理事务。
编程式事务与声明式事务的区别:
1)编程式事务是自己写事务处理的类,然后调用
2)声明式事务是在配置文件中配置,一般搭配在框架里面使用!
配置文件
XML文件,包含类信息,描述如何配置他们,以及怎么调用
bean的自动装配
无须在 Spring 配置文件中描述 javaBean 之间的依赖关系(如配置、 )。 IOC 容器会自动建立 javabean 之间的关联关系。
方式
- no:默认的方式是不进行自动装配,通过显式设置 ref 属性来进行装配
- byName:通过参数名自动装配, Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname,之后容器试图匹配、装配和该 bean 的属性具有相同名字的 bean。
- byType::通过参数类型自动装配, Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byType,之后容器试图匹配、装配和该 bean 的属性具有相同类型的 bean。如果有多个 bean 符合条件,则抛出错误。
- constructor:这个方式类似于 byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
- autodetect:首先尝试使用 constructor 来自动装配,如果无法工作,则使用 byType 方式。
Shiro
Apache Shiro 是 Java 的一个安全框架。可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。
组件
三个核心组件: Subject, SecurityManager 和 Realms
- Subject:当前操作用户,并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物
- SecurityManager:它是 Shiro 框架的核心,典型的 Facade 模式, Shiro 通过 SecurityManager 来管理内部组件实例,并通过它来提供安全管理的各种服务。
- Realm: Realm 充当了 Shiro 与应用安全数据间的“桥梁” 或者“连接器” 。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时, Shiro 会从应用配置的 Realm 中查找用户及其权限信息。
权限控制方式
- url 级别权限控制
- 方法注解权限控制
- 代码级别权限控制
- 页面标签权限控制
粗颗粒和细颗粒权限
粗颗粒度权限控制:对资源类型的管理,比如:用户具有用户管理的权限,具有导出订单明细的权限。
细颗粒度权限管理:对资源实例的控制,即控制到数据级别的权限,比如:用户只允许修改本部门的员工信息,用户只允许导出自己创建的订单明细。
如何授权
粗颗粒权限:可以使用过虑器统一拦截 url。
细颗粒权限:在 service 中控制,在程序级别来控制,个性化编程。
MyBatis
#和$
#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。------防止SQL注入
$将传入的数据直接显示生成在 sql 中。-----无法防止SQL注入,一般用于传入数据库对象
编程步骤
- 创建 SqlSessionFactory
- 通过 SqlSessionFactory 创建 SqlSession
- 通过 sqlsession 执行数据库操作
- 调用 session.commit()提交事务
- 调用 session.close()关闭会话
JDBC与MyBatis
|
JDBC |
MyBatis |
数据库链接 |
创建释放频繁,系统资源浪费 |
使用连接池管理链接 |
SQL语句 |
代码中不易维护 |
mapper.xml文件中,与java代码分离 |
向SQL传参 |
条件不一定,占位符需与参数一致,麻烦 |
自动将java对象映射到sql语句 |
解析结果集 |
解析前需遍历,麻烦 |
自动将 sql 执行结果映射至 java 对象 |