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的基本使用和配置  还算是比较简单的

 

 

posted @ 2019-04-27 14:08  沙漠里的橘子皮  阅读(204)  评论(0编辑  收藏  举报