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