zoukankan      html  css  js  c++  java
  • spring的基本配置和使用

    这里不讲spring整合别的框架 先单纯使用spring

    Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架

    IoC:Inversion of Control 控制反转,也就是将实例化对象的控制权交由spring容器 ,实现了解耦

    接口和实现类之间需要通过spring容器来建立联系 如果需要增加新的功能 原有的实现类不能满足要求,根据开闭原则 不修改原有的类 可以拓展新的类

    如果不使用spring容器,那么所有接口的引用指向实现类的对象实例的代码,要手动全部更改成指向新的实现类的对象实例 这会非常麻烦 也 违反了开闭原则

    也就是 原本是  UserDao dao=new UserDaoImpl();  要改成   UserDao  dao=new UserDaoImpl2();

    如果使用了spring容器管理 只要修改spring容器中 这个接口对应的实现类就可以了 不需要更改全部的代码  大大降低了 耦合度 提高了拓展性

    DI:Dependency Injection 依赖注入 

    既然对象的实例化全部交由spring容器管理 我们不能直接new了,那么怎么得到我们想要得对象实例呢

    这就是通过spring的依赖注入, spring可以通过xml或者注解实现依赖注入,在Ioc的基础上 交给spring管理的类 ,spring会创建这个类的实例对象 并且是默认是单例的

    也就是你多个类中依赖注入的对象 都是同一个对象  可以手动设置为多例 每次注入都创建一个新的对象

    AOP:面向切面编程

    在实际业务中 经常会有一些每个业务都需要执行的相同代码,比如权限判断,或者想对所有方法进行增强 加入事务管理 或者 日志记录

    我们可以将这些重复的相同代码 或者要新增的功能 定义一个切面类 然后配置要进行拦截哪些类的哪些方法,也就是在执行目标方法之前会先执行切面类中的方法 

    然后执行目标方法,或者执行完目标方法之后再执行切面类中的方法 都可以设置

    其实AOP就是动态代理模式的实现 如果要拦截的类 继承了接口 会使用JDK动态代理否则使用Cglib代理 来创建目标类的代理对象

    然后根据我们在切面中配置的方法 在执行目标方法之前或之后调用我们配置的方法  从而实现了不修改原有的类 进行了拓展和增强

    ---------------------------------------------------------------------------

    基本概念讲完了 接下来开始配置  

    首先在src根目录下 建一个名字随意 默认applicationContext.xml的配置文件 我一般改成spring.xml

    这就是一个空的配置文件 

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
         
    
    </beans>

    首先使用XML方式实现控制反转和依赖注入

    <bean name="名字唯一"  class="类的完整路径" >

    <property name="类中属性名" ref="引用别的bean标签的name或者id属性的值"  value="如果这个属性是普通属性 如string或者Integer 直接赋值就行" />

    <!-- 给类中属性注入值  也就是依赖注入 -->

    </bean>

    这样子就完成了一个类交给spring容器管理 , <property>标签 注入属性不是必须的

    如果使用了这个注入 类中的属性 必须提供set方法 才能注入

    这是bean标签的其他属性:

    scope="singleton或者prototype"       singleton默认的单例模式,prototype多例 每次都会创建一个新的实例

    lazy-init="true"        spring容器默认初始化会实例化所有管理的类对象

    init-method="类中自定义方法名"     初始化时调用的方法

    destroy-method="类中自定义方法名"   对象销毁时调用的方法 在容器关闭时会销毁 如果有多个实例对象 将不会销毁

    接下来用注解方式  实现控制反转,将类交给spring容器管理和依赖注入 

    首先在配置文件中加上 

    <context:component-scan base-package="包名,包名"/> 

    这将扫描指定包下的所有类和子包的类  如果有注解的 也将被spring管理

    然后在类上 加上这几个注解的其中一个

    @Repository("名字 相当于bean标签的name"):使用持久化类,dao类
    @Service("名字 相当于bean标签的name"):业务层类,service类
    @Controller("名字 相当于bean标签的name"):控制层,springMvc中的控制器
    @Component("名字 相当于bean标签的name"):组件,其他类

    这四个注解功能一样 只不过有语义区别 

    依赖注入 只需要在对应的属性上 加上@Autowired 会根据属性名在spring容器中找对应名字的类 然后注入对象

    如果根据名字没有找到 会根据类型找相匹配的类 然后注入对象

    如果想指定注入的类,的对象  可以加一个@Qualifier("名字") 会优先注入这个名字的类的对象

    这样也实现了将一个类交给spring管理

    其他注解

    @Scope:设置作用域
    @PostConstruct:在实例化后执行的方法
    @PreDestroy:在对象销毁之前执行的方法

    -------------------------------

    上面实现了Ioc  接下来实现AOP

    AOP概念:
    切面:将公共的,但是与业务无关的代码抽象出一个单独的类,则该类为切面。
    通知:拦截到切入点时,需要执行的代码,切面中的每一个方法,则称为通知.

    连接点:所谓连接点是指那些被拦截到的点,也就是要拦截的类中的方法 

    切入点:拦截的一系列连接点的集合。

    通知:
    前置通知:在执行切入点之前执行的方法
    后置通知:在执行完切入点之后执行的方法
    最终通知:在后置通知之前执行,执行完毕后才执行后置通知
    例外通知:切入点方法发生异常时执行
    环绕通知:相当于前置和后置的结合

    首先讲注解的实现方式

    首先要在配置文件中 加上 <aop:aspectj-autoproxy/>  启用 apo注解支持

    定义一个类 作为切面类 加上注解 @Component 交给spring管理 再加上@Aspect 定义为切面类

    @Before("切入点方法名()"):声明一个前置通知
    @AfterReturning("切入点方法名()"):声明一个后置通知
    @After("切入点方法名()"):声明一个最终通知
    @AfterThrowing("切入点方法名()"):声明一个异常通知
    @Around("切入点方法名()"):环绕通知 会影响后置通知的返回值和异常通知
    @Order:声明切面的执行顺序,值越小,优先级越高 这个加在类上
    @Pointcut:声明一个切入点
    一般定义在一个空的方法上 配置指定的筛选规则 然后其他通知方法就可以引用这个切入点
    例子:@Pointcut("execution(方法修饰符 方法返回值 方法所属类 匹配方法名 ( 方法中的形参表 ) 方法申明抛出的异常 )")
    每个部分都支持使用*号表示匹配全部,方法所属类是写完整类路径名

    通知和切入点都加在对应的方法上就行 这样在调用原本的对象的方法时会进行拦截 执行切面中配置好的通知的代码

    然后xml方式实现aop

    <aop:config>

    <aop:pointcut expression="切入点表达式,and args(参数名)这样是表示输入参数 " id="唯一即可 通知标签才能引用" />

    <aop:aspect ref="引用已经交给spring管理的切面类的id">

    <aop:通知类型  method="切面类中方法名" pointcut-ref="引用已经定义好的切入点" returning="obj,如果这个通知有返回值就写这个" />

    </aop:aspect>

    </aop:config>

    这就是spring的基本使用和配置  还算是比较简单的

     

  • 相关阅读:
    使用karma和jasmine进行angularjs单元测试
    NHibernate之(23):探索NHibernate二级缓存(上)
    NHibernate之(22):探索NHibernate一级缓存
    NHibernate之(21):探索对象状态
    NHibernate之(20):再探SchemaExport工具使用
    NHibernate之(19):初探SchemaExport工具使用
    NHibernate之(18):初探代码生成工具使用
    NHibernate之(17):探索NHibernate中使用存储过程(下)
    NHibernate之(16):探索NHibernate中使用存储过程(中)
    NHibernate之(15):探索NHibernate中使用存储过程(上)
  • 原文地址:https://www.cnblogs.com/java888/p/10778576.html
Copyright © 2011-2022 走看看