博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring学习
阅读量:4948 次
发布时间:2019-06-11

本文共 6448 字,大约阅读时间需要 21 分钟。

Spring简介

Spring是一个开源框架,最早由Rod Johnson创建,并在《Expert One-on-OneJ2EE Design and Development》这本著作中进行了介绍。Spring是为了解决企业级应用开发的复杂性而创建的,使用Spring可以让简单的JavaBean实现之前只有EJB才能完成的事情。但Spring不仅仅局限于服务器开发,任何Java应用都能在简单性、可测试性和松耦合等方面从Spring中获益。

 

Spring核心

1.控制反转(IOC):以前传统的java开发模式中,当需要一个对象时我们,我们会自己使用new或者getInstance等直接或者间接调用构造方法创建一个对象,而在Spring开发模式中,Spring容器使用了工厂模式为我们创建了所需要的对象,我们使用时不需要自己去创建,直接调用Spring为我们提供的对象即可,这就是控制反转的思想。实例化一个java对象有三种方式:使用类构造器,使用静态工厂方法,使用实例工厂方法,当使用spring时我们就不需要关心通过何种方式实例化一个对象,spring通过控制反转机制自动为我们实例化一个对象。

2.依赖注入(DI)Spring使用Java Bean对象的Set方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程就是依赖注入的基本思想。

3.面向切面编程(AOP):在面向对象编程(OOP)思想中,我们将事物纵向抽象成一个个的对象。而在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。

 

spring优势

}1.依赖注入/控制反转(DI/IOC). 说白了就是根据配置文件动态组装复杂对象,实现了松耦合

}2.AOP(面向切面编程)

}3.提供简易的服务抽象

}4.集成管理各种框架

 

spring如何选用

 

版本

    ◦2.0(较广)

    ◦2.5(较广)

    ◦3.0(最新)

什么项目适合?

    ◦小项目亦可

    ◦中项目最适合

   ◦大型分布式项目(EJB)

 

项目中配置spring按照如下步骤实现即可:

1.去官方网站下载:

2.下载完成后,解压:

3.打开dist目录,将spring.jar添加到项目依赖库中,lib/jakata-commons/commons-logging.jar加到项目依赖库中。

 

配置bean

1.配置文件方式配置

]]>

2.通过注解扫描的方式

spring  2.5新增自动扫描bean的功能,大大简化了配置文件中的配置内容。将程序员从繁琐的配置中解放出来!xml文件需要增加声明:
配置
的根本目的,就是让spring容器知道这个bean是要加载的。我们也可以通过注解来实现让spring知道哪些bean需要加载。◦@Service:标记业务层bean ◦@Controller:标记控制层,比如:struts中的Action ◦@Repository:标记数据访问组件,即DAO类◦@Component:当组件不好归类时使用该标记

AOP面向切面编程

如果说面向对象编程是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系的话;那么 面向方面编程则是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需要修改这个行为即 可。

AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面。

AOP的内部实现都是通过动态代理来实现。动态代理有两种常见的方式:

1.JDK提供的代理生成方式(Proxy,  InvocationHandle)

2.cglib 类库(springhibernate使用它)

 

AOP基本概念:

连接点(Joinpoint

在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 Spring AOP中,一个连接点 总是 代表一个方法的执行。

切入点(Pointcut

匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。

通知(Advice

在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。

切面(Aspect

一个关注点的模块化,这个关注点可能会横切多个对象。包含了:连接点、切入点、通知。可以通过@Aspect定义为一个类

目标对象(Target Object

被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做被通知(advised) 对象。

织入(Weaving

把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。

 

通知的类型

前置通知(Before advice

在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。

返回后通知(After returning advice

在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。

抛出异常后通知(After throwing advice

在方法抛出异常退出时执行的通知。

后通知(After finallyadvice

当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。

环绕通知(Around Advice

包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。

 

spring中如何配置AOP

增加jar包,列表如下:

spring中使用AOP需要在配置文件中增加如下内容:

 

 

Annotation方式配置AOP

切面类声明

@Aspect

@Component   //这个必须,告诉本类交给spring初始化

}切入点声明

}切入点语法示例和细节:

*代替任意多个任意字符。    ..表示任意个参数。       !表示非

}各种通知类型的定义

package com.sxt.interceptor;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;import com.sxt.bean.User;/** * 日志拦截器 */@Aspect@Componentpublic class TestInterceptor {    @Pointcut("execution(public  *  com.sxt.test.*.test*(..))")  //声明一个名字为log的切入点    private void log(){    }        @Before("log()"+"&&args(user)")   //使用pointcut-->log .前置通知.处理传入的参数跟下面的形参保持一致即可。    private void before(User user){        System.out.println("方法执行前:"+user.getUname());        user.setUname("lisi");        System.out.println("方法执行前!");    }        @After("log()")   //最终后置通知。不管有无异常,最终都会执行!    private void after(){        System.out.println("方法执行后!");    }    @AfterReturning("log()")  //方法正常结束,后置通知    private void afterReturning(){        System.out.println("方法执行后!after returning!");    }    @AfterThrowing("log()")    //抛出异常会执行,异常通知    private void afterThrowing(){        System.out.println("方法执行后!after throwing!");    }            @Around("log()")   //环绕通知在一个方法执行之前和之后执行    private Object around(ProceedingJoinPoint pjp){        System.out.println("环绕通知,方法执行前!");        Object obj = null;        try {            obj = pjp.proceed();        } catch (Throwable e) {            e.printStackTrace();        }        System.out.println("环绕通知,方法执行后!");        return obj;    }}

XML方式配置AOP

事务以及项目应用

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/pypua/articles/6893950.html

你可能感兴趣的文章
mahout运行测试与kmeans算法解析
查看>>
互相给一巴掌器
查看>>
Android SDK环境变量配置
查看>>
VM10虚拟机安装图解
查看>>
9、总线
查看>>
Git 笔记 - section 1
查看>>
java通过jsp+javaBean+servlet实现下载功能
查看>>
STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发
查看>>
异步表单提交
查看>>
[洛谷U871]building
查看>>
次小生成树
查看>>
Redis在windows下安装过程
查看>>
ip转城市接口,ip转省份接口,ip转城市PHP方法
查看>>
android 注释常用标签
查看>>
Spring context:property-placeholder 一些坑
查看>>
如何使用 adb 命令实现自动化测试
查看>>
中国剩余定理
查看>>
JS中this的详解及例子
查看>>
用Entity Framework 来创建MySql数据库和表结构
查看>>
TensorFlow随机值:tf.random_normal函数
查看>>