MVC: 几乎所有的 B/S 的架构都采用了 MVC框架模式
M: Model 数据模型(User.java) 模型代表着一种企业规范,就是业务流程/状态的处理以及业务规则的规定。业务流程的处理过程对其他层来说是不透明的,模型接受视图数据的请求,并返回最终的处理结果。业务模型的设计可以说是 MVC 的核心。
V: View 视图(页面jsp html ...) 视图即是用户看到并与之交互的界面,比如 HTML(静态资源),JSP(动态资源),FreeMarker 模板等等。
C: Controller 控制器(控制业务逻辑web层以及dao层) 控制器即是控制请求的处理逻辑,对请求进行处理,负责请 求转发;
1.spring 是众多开源 java 项目中的一员,基于分层的 javaEE 应用一站式轻量
级开源框架,主要核心是 Ioc(控制反转/依赖注入) 与 Aop(面向切面)两大技术,实现项目在开发过程中的轻松解耦,提高项目的开发效率。在项目中引入 spring 立即可以带来下面的好处 降低组件之间的耦合度,实现软件各层之间的解耦。可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。 容器提供单例模式支持,开发人员不再需要自己编写实现代码。 容器提供了 AOP 技术,利用它很容易实现如权限拦截、运行期监控等功能
2.spring源码框架: Spring 总共大约有 20 个模块,由 1300 多个不同的文件构成。而这些组件被分别整合在核心容器(Core Container )、Aop(Aspect Oriented
Programming)和设备支持(Instrmentation)、数据访问及集成(DataAccess/Integeration)、Web、报文发送(Messaging)、测试 6 个模块集
合中。
要求: jdk 1.7 及以上、Spring 版本:4以上版本.
添加spring框架核心依赖
菜单中的Sources root,将文件变成资源文件.再在下面新建xml文件.配置文件如下:
1.IOC: Inversion of Control,缩写为IoC 控制反转.实例化bean对象的三种方式:(1) 构造器的方式实例化bean 对象(必须存在空构造方法)
<bean id="userServiceImpl"class="com.shsxt.service.impl.UserServiceImpl"></bean>
(2) 静态工厂方法方式实例化 bean:
<bean id="userService" class="com.shsxt.factory.StaticFactory"
factory-method="createUserService"/>
(3) 实例化工厂方式创建 bean
<bean--id="instanceFactory" class="com.shsxt.factory.InstanceFactory"></bean>
<bean id="userService" factory-bean="instanceFactory" factory-
method="createUserService"></bean>
准备:
Dependency Injection
配置文件
须知
<bean id="userDao" class="com.shsxt.factory.StaticFactory" factory-
method="createUserDao"></bean>
<bean id="userService" class="com.shsxt.service.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="sxtBeanFactory" class="com.shsxt.factory.SxtBeanFactory" >
<bean id="instanceFactory" class="com.shsxt.factory.InstanceFactory"></bean>
<bean id="userDao" factory-bean="instanceFactory" factory-
method="createUserDao"></bean>
<bean id="userService" class="com.shsxt.service.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
本质上 IOC 和 DI 时是一个东西!!!
@Autowired 默认按 n bean 配 的类型匹配 改 可以修改 配 按名称匹配 和@Qualifier 配合使用
@Resource 默认 按 名称进行装配,名称可以通过 e name 属性进行指定,如果没有指定name 属性,当注解写在字段上时,默认取字段名进行 匹配注入 ,如果注解写在 setter 方法上默认取属性名进行装配。当找不到与名称匹配的 bean时才按照类型进行装配。 但是需要注意的是,如果 name 属性一旦指定,就只会按照名称进行装配
3.自动扫描bean
Xml文件中添加<context:component-scan base-package="com.shsxt"/>, spring 这时候同样提供了扫描的方式,对扫描到的 bean 对象统一进行管理,简化开发配置,提高开发效率.
Dao 层: : @Repository
Service 层: : @Service
视图控制层: : @Controller
如果对于开发的类实在不明确到底属于哪个层,可以使用@Component 注解定义。
搭建环境
配置文件设置
Model层,返回消息建立实体类
Po层建立对象实体类
Dao层应用实体类
必须加注解
Service层引用Dao层
必须加注解
Controller层引用service层
必须加注解
单元测试类
1.加入依赖
2.配置文件
4.发送代码实现
5.定时发邮件
(1),配置文件
(2),代码实现
(3)带附件
1.代理
设计原则:代理类与委托类具有相似的行为(共同);代理类增强委托类的行为.
分为静态代理和动态代理
静态代理:角色固定,代理类和委托类必须实现共同的接口.
动态代理
它会根据需要通过反射机制在 程序运行期 动态的为目标对象创建代理对象,代理的行为可以代理多个方法,
JDK实现代理:
原理: 基于接口实现
局限: 很多类没有实现接口, 那么jdk就无法实现代理
cglib 动态代理实现:
原理: 基于继承思想
作用: 针对没有实现接口的类,进行代理
区别: 与jdk提供的代理区别,Proxy:委托类必须有接口,制作过程比较快,执行慢;cglib:委托类可以没有接口,继承的思维来实现相似性,制作代理过程比较慢,执行快。主要解决没有接口类的代理实现.
2.AOP
解释: Aspect Oriented Programing 面向切面编程,相比较 oop 面向对象编程来
说,Aop 关注的不再是程序代码中某个类,某些方法,而 aop 考虑的更多的是一种面到面的切入 即层与层之间的一种切入,所以称之为切面。联想大家吃的汉堡(中间夹肉)。
那么 aop 是怎么做到拦截整个面的功能呢?考虑中级学到的 servlet urlpattern
/* 的配置 ,实际上也是 aop 的实现。
带来的好处:
降低模块与模块之间的耦合度,提高业务代码的聚合度。(高内聚低耦合);提高了代码的复用性。提高系统的扩展性。
Joinpoint(连接点)
被拦截到的每个点,spring 中指被拦截到的每一个方法,spring aop 一个连接点即代表一个方法的执行。
Pointcut(切入点)
对连接点进行拦截的定义(匹配规则定义 规定拦截哪些方法,对哪些方法进行处理),spring 这块有专门的表达式语言定义。
Advice(通知)拦截到每一个连接点即(每一个方法)后所要做的操作
i. 前置通知 (前置增强) --before() 执行方法前通知
ii.返回通知(返回增强)--afterReturn 方法正常结束返回后的通知
iii.异常抛出通知(异常抛出增强)--afetrThrow()
iv.最终通知—after 无论方法是否发生异常,均会执行该通知。
v.环绕通知—around 包围一个连接点(join point)的通知,如方法调用。
这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
Aspect(切面)
切入点与通知的结合,决定了切面的定义,切入点定义了要拦截哪些类的哪些方法,通知则定义了拦截过方法后要做什么,切面则是横切关注点的抽象,与类相似,类是对物体特征的抽象,切面则是横切关注点抽象。
Target(目标对象)被代理的目标对象
Weave(织入)将切面应用到目标对象并生成代理对象的这个过程即为织入。
Introduction(引入)在不修改原有应用程序代码的情况下,在程序运行期为类动态添加方法或者字段的过程称为引入.
3.示例:
Service层
单元测试类
测试结果:
常见的面试题:
1.代理模式实现三要素是什么?
i.接口定义
ii.目标对象 与代理对象必须实现统一接口
iii.代理对象持有目标对象的引用 增强目标对象行为
2.jdk 动态代理与 cglib 动态代理区别是什么?
静态代理:手动为目标对象制作代理对象,即在程序编译阶段完成代理对象的创建动态代理:在程序运行期动态创建目标对象对应代理对象。
jdk 动态代理:被代理目标对象必须实现某一或某一组接口实现方式通过回调创建代理对象。
cglib 动态代理:被代理目标对象可以不必实现接口,继承的方式实现。
动态代理相比较静态代理,提高开发效率,可以批量化创建代理,提高代码复用率。
3.Spring AOP 两种实现机制是什么?
动态代理 jdk cglib
i. 面向切面,相比 oop 关注的是代码中的层或面
ii.解耦,提高系统扩展性
iii. 提高代码复用
4. Aop 关键词
1. 连接点:每一个方法
2. 切入点:匹配的方法集合
3. 切面:连接点与切入点的集合决定了切面,横切关注点的抽象
4. 通知:几种通知
5. 目标对象:被代理对象
6. 织入:程序运行期将切面应用到目标对象 并生成代理对象的过程
7. 引入:在不修改原始代码情况下,在程序运行期为程序动态引入方法或字段的
过程
配置系统配置文件
配置自定义配置文件
Dao层
Service层
单元测试类
默认 spring 事务只在发生未被捕获的 runtimeexcetpion 时才回滚。spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样 aop 代理才能捕获到方法的异常,才能进行回滚,默认情况下 aop 只捕获runtimeexception 的异常,但可以通过配置来捕获特定的异常并回滚 换句话说在 service 的方法中不使用 try catch 或者在 catch 中最后加上 throw newRunTimeexcetpion(),这样程序异常时才能被 aop 捕获进而回滚.
原文:https://www.cnblogs.com/ruanjianwei/p/12133416.html