Spring的基本配置和Spring与Mybatis的整合

Spring: 
             Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IOC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架

Spring的优点:

 1、方便解耦,简化开发 (高内聚低耦合)
    Spring就是一个大工厂(容器), Spring工厂是用于生成bean,可以将所有对象创建和依赖关系维护,交给Spring管理

 2、AOP编程的支持 
    Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能

 3、声明式事务的支持
    只需要通过配置就可以完成对事务的管理,而无需手动编程

 4、方便程序的测试
    Spring对Junit4支持,可以通过注解方便的测试Spring程序

 5、方便集成各种优秀框架 
    Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis等)的直接支持,方便整合其他框架

 6、降低JavaEE API的使用难度 
    Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低

  Spring的控制反转(IOC):

Inversion of Control 又称为 依赖注入 (DI)  Dependency Injection
把对象的创建和方法的调用的控制权(反转)交由给容器管理,由容器控制程序之间的依赖关系
IOC就是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是通过容器生成
同时,要是产生的是单例的bean,他还可以给管理bean的生命周期

IOC理解:

它并不是一种技术实现,而是一种设计思想。在任何一个有实际开发意义的程序项目中,我们会使用很多类来描述它们特有的功能,并且通过类与类之间的相互协作来完成特定的业务逻辑。这个时候,每个类都需要负责管理与自己有交互的类的引用和依赖,代码将会变的异常难以维护和极度的高耦合。而IOC的出现正是用来解决这个问题,我们通过IOC将这些相互依赖对象的创建、协调工作交给Spring容器去处理,每个对象只需要关注其自身的业务逻辑关系就可以了。在这样的角度上来看,获得依赖的对象的方式,进行了反转,变成了由spring容器控制对象如何获取外部资源(包括其他对象和文件资料等等)
 

IOC和DI的区别:

  1.   IOC:控制反转,把创建对象交给Spring进行配置
  2.   DI:   依赖注入,向类里面的属性中赋值

Spring的面向切面编程(AOP):

将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。 比如: 很多方法
可能会抛异常,你要记录这个异常到日志中去,可以写个拦截器类,在这个类中记录日志,在spring.xml中配置一个对这些要记录日志的
方法的aop拦截器 在这个方法执行后调用这个拦截器,记录日志。这样就不用每次抛异常都要手动记录日志。 spring的事务管理用到的就
是aop 这样也可以提高程序的内聚性

Spring的基本使用:

1)用maven创建一个项目,在 pom.xml 文件中加入 spring的依赖(jar包)

    2)在 resource 目录下,编写 spring.xml 配置文件,并定义要控制反转的类  <bean></bean>

注意: 

1)bean 的 id是严格区分大小写的 如果id不存在会报错: NoSuchBeanDefinitionException
2)如果容器中同一个类型的bean有多个,再根据类型获取的话就会错: NoUniqueBeanDefinitionException 
3)bean一般需要无参构造,spring会调用它来创建对象
如果没有无参构造,需要给构造方法的参数赋值<constructor-arg index="参数下标" value="值"/>
4)默认情况下,每个类型的bean在容器中只有一个对象(单例) <bean scope="singleton">
多例,每用一次,创建一个新的对象, 如果配置多例<bean scope="prototype">
初始化方法 和 销毁方法: <bean init-method="初始化方法名()" destory-method="销毁方法名()" > 


单例:单例对象既会调用初始化方法,也会调用销毁方法
多例:每使用一个多例对象都会调用初始化方法,但所有的多例对象都不会调用销毁方法

     3)在测试类中使用 spring容器 进行测试

依赖注入的三种方式:
        1) set注入:   property  配合 setXXX() 方法

             测试代码:

    /**
     * 1) set注入
     */
 
  public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
  }
             spring.xml 配置:

<bean id="userService" class="com.chen.service.UserService">
        <!-- 1) set注入-->
        <property name="userDao" ref="userDao"/>
</bean>


        2) 构造注入: constructor-arg 配合构造函数

               测试代码: 

   /**
      *  2) 构造注入
      */
 
    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
            spring.xml 配置:

<bean id="userService" class="com.chen.service.UserService">
    
       <!-- 2) 构造注入 -->
       <constructor-arg index="0" ref="userDao"/>
</bean>


       3) 注解注入: @AutoWired | @Resource 配合 <context:annotation-config/>(启动注解,否则spring无法解析注解)                                                利用这个注解完成属性的赋值,把它加在需要注入的属性上, 或set方法上,或构造方法上

          测试代码:   

 /**
     * 3) 注解注入 : 利用反射,找到该变量的类型,自动赋值
     */
     @Autowired | @Resource
     private UserDao userDao;
         spring.xml 配置:     

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd">
 
    <!-- 3) 启动注解 -->
    <context:annotation-config/>


 

猜你喜欢

转载自blog.csdn.net/qq_38186465/article/details/102827119
今日推荐