整理IOC和AOP以及spring框架

1.什么是ioc

IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。

  1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC 这个概念。对于面向对象设计及编程的基本思想

,简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。

引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系

对象之间已经没有了耦合关系,彼此毫无联系,这样的话,当你在实现A的时候,根本无须再去考虑B、C和D了,对象之间的依赖关系已经降低到了最低程度。

3.IOC的优点

灵活性

为广泛使用的接口更改实现类更简单(例如,用生产实例替换模拟web服务)

更改给定类的检索策略更简单(例如,将服务从类路径移动到JNDI树)

添加拦截器很简单,只需在一个地方完成(例如,向基于JDBC的DAO添加缓存拦截器)

可读性

该项目有一个统一一致的组件模型,没有工厂(如DAO工厂)

如果没有依赖项查找代码(例如对JNDI InitialContext的调用),代码更简洁,也不会杂乱无章

可测试性

当依赖项通过构造函数或setter公开时,它们很容易替换mock

更容易的测试导致更多的测试

更多的测试会带来更好的代码质量、更低的耦合性和更高的内聚性

4.IOC的缺点

使用IOC框架产品能够给我们的开发过程带来很大的好处,但是也要充分认识引入IOC框架的缺点,做到心中有数,杜绝滥用框架。

    第一、软件系统中由于引入了第三方IOC容器,生成对象的步骤变得有些复杂,本来是两者之间的事情,又凭空多出一道手续,所以,我们在刚开始使用IOC框架的时候,会感觉系统变得不太直观。所以,引入了一个全新的框架,就会增加团队成员学习和认识的培训成本,并且在以后的运行维护中,还得让新加入者具备同样的知识体系。

    第二、由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。如果你要追求运行效率的话,就必须对此进行权衡。

    第三、具体到IOC框架产品(比如:Spring)来讲,需要进行大量的配制工作,比较繁琐,对于一些小的项目而言,客观上也可能加大一些工作成本。

    第四、IOC框架产品本身的成熟度需要进行评估,如果引入一个不成熟的IOC框架产品,那么会影响到整个项目,所以这也是一个隐性的风险。

    我们大体可以得出这样的结论:一些工作量不大的项目或者产品,不太适合使用IOC框架产品。另外,如果团队成员的知识能力欠缺,对于IOC框架产品缺乏深入的理解,也不要贸然引入。最后,特别强调运行效率的项目或者产品,也不太适合引入IOC框架产品,像WEB2.0网站就是这种情况。

Aop

AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。

AOP的作用
AOP 采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。

主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性。

简单的说,AOP 的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能。

AOP的应用场景

比如典型的AOP的应用场景:\

 

  • 日志记录
  • 事务管理
  • 权限验证
  • 性能监测

AOP可以拦截指定的方法,并且对方法增强,比如:事务、日志、权限、性能监测等增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离。

Spring AOP的术语

在深入学习SpringAOP 之前,让我们先对AOP的几个基本术语有个大致的概念。

 

 

 

前置通知
后置通知
异常通知
最终通知

public class Loger {
   @Before("execution(* *..BookServiceimpl.*(..))")
    public void check(){ System.out.println("前置通知/增强:执行系统的权限验证"); }
    @AfterReturning("execution(* *..BookServiceimpl.*(..))")
    public void logPrint(){ System.out.println("后置通知/增强:执行日志的打印"); }
    @AfterThrowing("execution(* *..BookServiceimpl.*(..))")
    public void exeption(){ System.out.println("异常通知/增强:做出异常的通知"); }
    @After("execution(* *..BookServiceimpl.*(..))")
    public void distory(){ System.out.println("最终通知/增强:资源的释放"); }
}

方法类

整理IOC和AOP以及spring框架_第1张图片

 

接口

整理IOC和AOP以及spring框架_第2张图片

 

测试类

整理IOC和AOP以及spring框架_第3张图片

运行结果

整理IOC和AOP以及spring框架_第4张图片

 

Spring框架
什么是spring框架?
spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,是一个分层的javaEE一站式轻量级开       源框架

spring的作用
方便解耦,简化开发,AOP编程支持,声明式事务支持,集成Junit更加方便的进行分层测试,方便集成各种优秀框架

什么是IOC?
控制反转,把创建对象的权利交给spring

什么是DI
属性的依赖注入,spring在通过IOC创建对象的时候,如果对象还有属性,就一并给赋值进去DI是在IOC的基础上进行对象的属性       注入

依赖注入的三种实现方式?
构造器注入,Setter方法注入,接口注入

解释Spring支持的几种bean的作用域
a、singleton : bean在每个Spring ioc 容器中只有一个实例。b、prototype:一个bean的定义可以有多个实例。

c、request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。

 
d、session:在一个HTTP   Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring    ApplicationContext情形下有效。

e、global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

缺省的Spring bean 的作用域是Singleton.

Spring支持的事务管理类型
a、编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。

b、声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。

你更倾向用那种事务管理类型?
大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。       声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。

解释AOP
在软件业,AOP为Aspect   Oriented    Programming的缩写,意味:面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP是OOP的延续.将一些共性的内容进行抽取,在需要用到的地方,以动态代理的方式进行插入.在不修       改源码的基础上,还能对源码进行前后增强。

什么是通知?有哪五种类型的通知?
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。Spring切面可以应用五种类型的通知:

a、before:前置通知,在一个方法执行前被调用。

b、after: 在方法执行之后调用的通知,无论方法执行是否成功。c、after-returning: 仅当方法成功完成后执行的通知。

d、after-throwing: 在方法抛出异常退出时执行的通知。e、around: 在方法执行之前和之后调用的通知。

Mybatis框架
什么是 MyBatis?
MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。

Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一下动态 sql 的执行原理不?
a、Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。b、Mybatis 提 供 了 9 种 动 态 sql 标 签 : trim|where|set|foreach|if|choose|when|otherwise|bind。

c、其执行原理为,使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能。

#{}和${}的区别是什么?
a、#{}是预编译处理,${}是字符串替换。

b、Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;

c、Mybatis 在处理${}时,就是把${}替换成变量的值。

d、使用#{}可以有效的防止 SQL 注入,提高系统安全性。

 
为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
Hibernate 属于全自动 ORM 映射工具,使用 Hibernate 查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 Mybatis 在查询关联对象或关联集合对象时,需要手动编写 sql 来完成,所以,称之为半自动ORM 映射工具。

MyBatis 与 Hibernate 有哪些不同?
a、Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己编写 Sql 语句,不过 mybatis 可以通过 XML 或注解方式灵活配置要运行的 sql 语句,并将java 对象和 sql 语句映射生成最终执行的 sql,最后将 sql 执行的结果再映射生成 java 对象。

b、Mybatis 学习门槛低,简单易学,程序员直接编写原生态 sql,可严格控制 sql 执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套 sql 映射文件,工作量大。

c、Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate 开发可以节省很多代码,提高效率。但是Hibernate 的缺点是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

MyBatis 的好处是什么?
a、MyBatis 把 sql 语句从 Java 源程序中独立出来,放在单独的 XML 文件中编写,给程序的维护带来了很大便利。

b、MyBatis 封装了底层 JDBC API 的调用细节,并能自动将结果集转换成 Java Bean 对象, 大大简化了 Java 数据库编程的重复工作。

c、因为 MyBatis 需要程序员自己去编写 sql 语句,程序员可以结合数据库自身的特点灵活控制 sql 语句,因此能够实现比 Hibernate 等全自动 orm 框架更高的查询效率,能够完成复杂查询。

什么是 MyBatis 的接口绑定,有什么好处?
接口映射就是在 MyBatis 中任意定义接口,然后把接口里面的方法和 SQL 语句绑定,我们直接调用接口方法就可以,这样比起原来了 SqlSession 提供的方法我们可以有更加灵活的选择和设置.

接口绑定有几种实现方式,分别是怎么实现的?
接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select@Update 等注解里面包含 Sql 语句来绑定,另外一种就是通过 xml 里面写 SQL 来绑定,在这种情况下,要指定 xml 映射文件里面的 namespace 必须为接口的全路径名.

当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定 pojo?
a、通过在查询的 sql 语句中定义字段名的别名。

b、通过来映射字段名和实体类属性名的一一对应的关系。

Mapper DAO层开发规范
a、接口的全路径要和映射文件的namespace保持一致

b、接口的方法名要和映射文件中的statementId保持一致

c、接口方法的参数类型,返回类型要和映射文件中的parameterType,resultType保持一致     d、接口和映射文件的名字最好保持一致 例如:UserMapper.java/UserMapper.xml

e、接口和映射文件最好放到同一个目录
 

你可能感兴趣的:(类,spring,java,后端)