美文网首页程序员
Spring知识整理

Spring知识整理

作者: 远方的梦Java | 来源:发表于2018-06-24 22:01 被阅读20次

    Spring简介

    Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,用来管理和维护bean,其中的特点是IOC(控制反转) DI(依赖注入) AOP(面向切面) 容易和其他框架整合

    spring的执行流程

    创建一个spring对象的容器

    利用构造函数创建spring容器内的对象(单例,lazy-init不能为true,如果为true 将会在第一次访问的时候创建)

    执行一个对象的init方法

    利用context.getBean()得到对象的时候,如果这个对象是多例的或者lazy-init为true的时候,会创建这个对象

    调用业务逻辑方法

    spring容器关闭的时候会执行对象的destroy方法(init和destroy方法都需要在配置文件中配置)

    Spring通过配置文件生成类

    在src文件夹下创建名字为applicationContext.xml文件

    applicationContext.xml

    配置文件基本参数:

    id : 唯一标识,Spring通过id来寻找对应的类

    class : 类的具体位置

    简单的生成一个类(配置文件如下)

    静态工厂方法 (静态工厂类和实例工厂类中的区别就是生成对象的方法否是static方法)

    factory-method : 生成类的静态方法名

    静态工厂类

    实例工厂方法

    factory-bean : 工厂bean

    factory-method : 工厂方法

    实例工厂类

    别名

    顾名思义: 一个对象的另一个名字,可以用他来创建对象

     name : 对应bean的id, alias : 别名

    创建对象的时间

    默认情况下为启动Spring容器时会创建对象(一个bean会创建一个类)

    可以通过修改 来改变创建时间, 如果为true的话,会在 getBean()时创建对象

    单例和多例

    默认情况下,一个bean对应一个类, 这个类是单例的

    因为这个类时单例的,所以在这个类中声明属性的话,这个属性是全局的(危险)

    改变的Scope参数可以设置产生的类为多例的

    类的创建时间为getBean()时创建对象

    init和destroy

    配置文件:

    init和destroy为HelloWrold类中的方法

    init方法会在构造方法执行完以后执行, destroy方法会在Spring容器关闭之前执行

    关闭spring容器的方法

    DI(依赖注入)

    即给类中的属性赋值

    IOC(容器)和DI(依赖注入)的意义 : 是代码端完全的面向接口变成,不会在出现需要new出实现接口的某个类

    不是用的话需要在java类中new出一个接口的实现类,然后在给message方法传递,如果使用Spring,就少了new实现类这个情况,变成了完全的面向接口

    xml-set方式

    在person中设置了常用的属性,然后设置其set方法, 在xml文件中注入所需要的值

    person

    student

    applicationContext.xml

    xml-构造方法

    在类中设置构造方法,通过构造方法来注入值

     index : 代表第几个参数 value : 参数值

    person

    applicationContext.xml

    xml-继承

    1.通过在子类中设置parent="id"属性来设置继承的父类,这样在父类注入的值可以从子类获取到

    2.直接在子类使用父类的set方法注入值

    applicationContext.xml

    自定义注解

    自定义注解: 1. 创建Annotation类 2.添加元注解,标识信息是 3.添加属性

    自定义注解

    使用注解

    解析注解

    注解配置参数

    注解配置参数只能用于引用类型

    配置文件添加

    在所需要的配置参数上添加@Resource(name="student") / @Autowired / @Qualifier("student") 选项

    如果参数没有,会先和属性所在的属性名称与

    有name="" 参数,会按照name参数跟bean的id进行匹配

    @Resource(name="student")

    @Autowired 按照类型进行匹配

    @Qualifier("student") 按照id进行匹配

    过程:当spring容器解析到spring容器会在spring容器管理的bean的范围内查找这些类的属性上面是否加了@Resource注解

    xml

    注解配置类

    配置文件添加:,会扫描base-package下面所有的类,是否有@Component,在扫描完以后会继续按照@Resource 注解进行赋值

    Dao层配置 : @Repository("customerDao")

    传递属性 @Resource(name="sessionFactory")

    service层配置 : @Service("linkManService")

    action层 : @Controller("baseDictAction") @Scope("prototype")

    上面三层的注解都是@Component("")的子类, 属于更加细节的划分, 括号内的是bean的id

    xml

    AOP

    将常用的,不变的非核心业务的东西生成AOP,减少代码重复,解耦.

    动态代理

    jdkProxy

    通过jdk的内置的方法来设置代理类

    代理类实现接口InvocationHandler 传递进去目标类和代理类,在执行被代理方法之前或者之后执行代理类中的方法

    缺点:

    定义一个接口,然后将需要代理的功能都实现这个接口,最后传递进去一个List, 再控制方法的执行顺序

    初始功能单一,如果需要添加其他的方法,则会非常繁琐

    如果方法太多的话,判断哪些方法需要被代理非常麻烦

    代理类

    test

    解决功能单一方法的初始思想

    接口

    代理类

    test

    cglib动态代理的方法

    cglib实现的接口类是被代理类的子类

    需要导入对应的jar包

    代理类的内部实现了jdk代理相同, 不同的地方是实现的接口和生成代理类的方式不同

    代理类

    test

    AOP概念

    连接点 : 在方法的执行前后和抛出异常可以作为连接点,即将增强和目标方法连接的地方.

    切入点 : 在某个方法被调用的时候,这个方法上的连接点变为切入点

    增强 : 目标方法除了核心业务以外的所需要的方法, 比如在save()方法中,save()为核心方法,开启事务为非核心方法,可以抽离出来, 在AOP中开启事务就叫做增强

    切面 : 除了目标方法所在的类以外其他的类

    代理 : 将目标方法和增强结合在一起

    织入 : 生成代理类的过程

    代理

    如果类实现接口,使用jkdproxy代理,如果没有实现接口,则会使用cglib来实现代理

     强制使用cglib方式来生成代理类

    xml配置

    切入点表达式各个部分,后面加?的表示可以不写

    增强的类型

    joinPoint.proceed();//调用目标方法 如果不写,则目标方法不会执行,即只会执行前置增强和环绕增强的前置方法

    前置增强 : 在目标方法执行之前

    后置增强 : 在目标方法执行之后 抛出异常不执行, 可以设置returning="val"来获取返回值 , 配置文件和类中的参数名需要相同

    最终增强 : 不管是否有异常都会执行

    异常增强 : 在抛出异常时执行 设置throwing="ex" 来获取异常 配置文件和类中的参数名需要相同

    环绕增强 : 在目标方法前后都可以执行, 还可以控制目标方法是否执行

    xml

    增强

    如果同时设置了环绕增强,前置增强,后置增强 , 则执行顺序如下图

    无异常

    有异常

    注解配置

     在配置文件中添加, 还需要在xml文件头部添加地址

    注释

    test

    AOP权限管理

    利用注解和AOP来实现权限管理, 如果有方法上面注解所对应的权限,则可以使用方法, 如果没有,则不需调用方法

    注解类

    解析类

    切面

    配置文件

    test

    多个切面执行顺序和配置

    配置

    执行顺序

    前置增强按照配置顺序依次执行,后置增强按照配置顺序的倒序依次执行 即在目标方法执行前的增强按照配置顺序,执行后的增强按照配置顺序的倒序

    执行图

    Spring整合hibernate

    eclipse中xml提示包名的插件 --- Rinzo

    eclipse可以设置自动提示 window-preferences-java-editor-content Assist-auto activation

    导入两者所需要的jar包

    配置数据源和配置hibernate有两种方式可以选择, 分别为解析各自的配置文件和将配置信息写入到spring文件中

    配置文件

    personDaoImpl

    personServiceImpl

    Spring的事务

    Spring使用的是内置的事务,所以一般不需要自己定义事务

    抽象类: 是将相同的东西实现了,不同的东西设置为抽象方法,让需要使用这些不同东西的类来实现各自具体的抽象方法

    比如一个仪式的过程是领导讲话,个人讲话,奏国歌,那么我们可以将重复的东西,即领导讲话和奏国歌在抽象类中实现,个人讲话设置为抽象方法, 然后个人的类继承这个抽象类,实现各自的抽象方法即可.

    Spring的事务就是使用了抽象类的方式,将各种事务中所相同的方法抽取出来,然后将不同的方法设置为抽象方法(即事务的核心业务),让需要使用事务的调用者自己实现核心业务.

    配置方法

    Spring中事务的简单执行步骤即抽象类中实现了共有的操作,具体的事务操作交给具体的事务管理器

    web

    spring容器放在了ServletContext中,所以他的生命周期就是项目的生命周期

    spring设计将spring容器放到了当前线程中

    如果某个对象不在spring容器内(DI不能使用),可以使用WebApplicationContextUtils.getWebApplicationContext(ServletContext sc); 获取到spring容器(根据key从ServletConetxt中获取)

    spring启动时dao层 1.service层的所有的对象就都创建完成了 2.service层的代理对象也创建完成了 3.action层的对象没有创建(多例)

    struts2的class需要和spring中的id相同

    spring回调

    即Spring容器给你规定了规则,你在这个规则下编写代码,最后还需要将代码放回到容器中,等待Spring调用,而你自己不能调用

    用在和hibernate结合,当你需要自己编写访问数据库的方法的时候就会使用

    hibernateTemplate.execute(new HibernateCallback() { @Override public T doInHibernate(Session arg0) throws HibernateException, SQLException { // TODO Auto-generated method stub return null; } })

    相关文章

      网友评论

        本文标题:Spring知识整理

        本文链接:https://www.haomeiwen.com/subject/exnsyftx.html