Spring实战(一)Spring简介---呕心沥血只为让Java开发更简单。

  Spring诞生的初衷是为了替代更加重量级的企业级Java技术(EJB)。

  相对于EJB来说,Spring提供了更加轻量级和简单的编程模型,它增强了POJO(简单老式Java对象)的功能,使简单的JavaBean具备了之前只有EJB和其他企业级Java规范才具有的功能。

   

  0、POJO、EJB、JavaBean、Bean的概念解析。

  JavaBean,JavaBean 是一种Java写成的可重用组件。

  为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。属性名称符合这种模式,其他Java 类可以通过反射机制发现和操作这些JavaBean 的属性。

  POJO(Plain Ordinary Java Object),简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。

  EJB (Enterprise JavaBean),是J2EE(javaEE)的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。

  Bean。。。Spring中用bean或者JavaBean来表示应用组件,但并不意味着Spring组件必须要遵循JavaBean规范。一个Spring组件可以是任何形式的POJO。一个Spring组件可以是任何形式的POJO。

  还是没搞明白,算了,暂时就把bean看成Spring的一个组件or一个元素。

  

  1、Spring的使命是简化Java开发,它是从哪些方面做的?

  • 基于POJO的轻量级和最小侵入式编程;
  • 通过依赖注入(DI)和面向接口实现松耦合;
  • 基于切面和惯例进行声明式编程;
  • 通过切面和惯例减少样板式代码。

 

  2、什么是侵入式编程?Spring又是如何做的?

  很多框架通过强迫应用继承他们的类或实现他们的接口从而导致应用与框架绑死。

  Spring的理念是尽量避免因自身的API而弄乱你的应用代码,也不会强迫你实现Spring规范的接口or继承Spring规范的类。

  在基于Spring构建的应用中,最坏的场景是,一个类会使用Spring注解,但它依旧是POJO。Spring通过DI,赋予了POJO新的魔力。

 

  3、耦合的两面性

  一方面,紧密耦合的代码难以测试、难以复用、难以理解,且bug不易修复;

  另一方面,耦合是必须的。

  所以我们的代码必须追求松耦合。

 

  4、DI替代了那种方式的代码?

  简单说,就是在类A中不需要通过new B()的方式来获得类B的对象,而是在工厂类中通过反射创建。

  通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定,这样能够让相互协作的软件组件保持松散耦合。

  如果一个对象只通过接口(而不是具体的实现or初始化过  程)来表明依赖关系,这种依赖便能够在对象本身不知情的情况下,对不同的具体实现进行替换。  

 

  5、DI常用的注入方式有哪些?

  (1)有参构造器注入:

  (2)setter方法注入

   

  5、什么是Mock测试?

  Mock测试就是在测试过程中中,对于某些难以构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。

 

  6、Spring中,什么是“装配(wiring)”?

  创建应用组件之间的协作的行为,称为装配。

 

  7、Spring中有哪些装配bean的方式?

  • 在XML文件中进行显示装配;
  • 在Java代码中显示装配;(JavaConfig)
  • 隐式的bean发现机制和自动装配;

 

  8、Spring中,“应用上下文(Application Context)”是什么?  

  Spring通过应用上下文(Application Context)装载bean的定义,并把他们组装起来。

  Application Context全权负责对象的创建和组装

  Spring中自带了多种Application Context的实现,他们的主要区别在于如何加载配置!

  流程为:通过xml配置文件得到context对象,然后通过context对象的getBean(xxx.class)方法获取一个目标bean(类对象),然后就可以使用啦。

 

  9、面向切面编程(AOP)的概念。

  AOP允许你把遍布应用各处的功能分离出来形成可重用的组件。

  实际应用中,AOP使得核心业务和系统服务(如日志)分离开来,,使得业务组件具有更高的内聚性,专注自身,而避免系统服务的干扰。

  总之,AOP确保POJO的简单性,是一个非常强大的理念,可以将安全、事务和日志关注点与核心业务逻辑相分离。

 

  10、Spring使用模板消除样板式代码

  样板式代码,例如JDBC访问数据库等使用频繁又冗长的代码,Spring通过模板封装消除。

 

  11、工厂模式解耦

 

 12、IOC底层原理使用的技术(降低类之间的耦合度)

  • XML配置文件;
  • dom4j解析XML;
  • 工厂设计模式;
  • 反射

  步骤:

  1、编写xml配置文件,配置要创建的对象类(即创建bean)

  2、创建工厂类,使用dom4j解析配置文件+反射

    1)使用dom4j解析xml文件——根据所配置的bean的id值,得到class属性;

    2)使用反射,根据class属性值,获取这个类的Class对象

    3)根据得到的Class对象,获取类实例(newInstance方法)

 

  13、bean实例化的三种方法

  第一种:使用类的无参构造器创建(主要方法);

  第二种:使用静态工厂创建;

  第三种:使用实例工厂创建;

 

  14、IOC和DI的关系

  IOC:控制反转,把对象的创建交给Spring进行配置

  DI:依赖注入,向类中的属性注入值

  关系:依赖注入不能单独存在,需要在IOC基础上完成操作。

 

  15、在一个对象(类A)中注入另一个类B的对象属性(setter方法注入)

  (1)在类A中生成类B属性的setter方法;

  (2)创建类A的bean(id=a),创建类B的bean(id=b);

  (3)XML中配置setter方法注入(在类A的bean标签中进行)

 

  16、注入复杂类型属性

  数组、list集合:

  map集合、properties文件类型:

 

  17、Spring整合web项目原理

  1)加载Spring配置文件,根它创建对象

  我们可以在代码中通过new操作符来获得ApplicationContext对象,但是这样效率很低下。

ApplicationContext context=
       new ClassPathXmlApplicationContext("bean1.xml");

  2)实现思想:把加载配置文件和创建对象过程,放到服务器启动时完成。(把压力交给服务器)

  3)Spring底层实现的技术:

  (1)ServletContext对象

  (2)监听器——监听上述对象的创建

  4)实现过程:

  • 在服务器启动时,为每个项目创建一个ServletContext对象;
  • 在ServletContext对象创建时,使用监听器可以监听它的创建;
  • 这时加载Spring配置文件,把配置文件所配置的对象(bean)创建出来;
  • 把创建出来的对象放到ServletContext域对象中(setAttribute方法);
  • 获取对象时,到ServletContext域得到(getAttribute方法)

  

  18、Spring的注解开发

  首先要在应用上下文中,开启注解扫描。

  (1)通过注解创建bean

  • @Component(value="Bean ID")
  • @Controller——控制器层
  • @Service——业务层
  • @Repository——持久层

  四个注解的功能是一样的,三个衍生注解是为了让标注类本身的用途更加清晰。

  

  (2)选择bean的作用域

  @Scope(value=" ")——prototype、singleton、session、request

 

  (3)通过注解注入属性——注解写在类的属性上

  • @Autowired——自动装配
  • @Resource(name="Bean ID")——指定注入哪个bean。

 

  19、AOP概念

  面向切面编程,扩展功能不修改源代码实现。

  AOP采取横向抽取机制,取代传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)

  Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码。

  Aspectj是一个基于Java语言的AOP框架,它扩展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的织入。

 

  20、AOP原理 

  (1)传统的纵向抽取机制解决方案:

  (2)AOP横向抽取机制——底层使用动态代理方式(理解下“代理对象”的含义)

  针对有接口的情况,使用jdk动态代理:

  没有接口的情况,使用cglib动态代理:

 

转载于:https://www.cnblogs.com/bigbigbigo/p/8356417.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值