Spring
一、概述
1.什么是spring?
是一个轻量级的IOC和AOP容器的开源框架。
框架:完成一定功能的半成品
轻量级:一般就是非侵入性的、所依赖的东西非常少、占用资源非常少
2.Spring的核心
IOC:控制反转,把创建对象过程交给Spring进行管理。
AOP:面向切面编程,不修改源码进行功能增强。
3.Spring的模块
Web:spring对web的支持(SpringMVC)
AOP:切面
Aspects:配合AOP完成切面
Insteumentation:拦截器里的一个东西
Core Container:核心;(bean,上下文,核心功能,表达式语言)
Test:单元测试
二、IOC
1.IOC概念
控制反转;
把对象的创建和对象之间的调用,交给Spring管理
使用目的:为了降低耦合度;
控制反转IoC(Inversion of Control),是一种设计思想,
DI(依赖注入)是实现IOC的一种方法
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。
在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入DI。
- 控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的
- 反转 : 程序本身不创建对象 , 而变成被动的接收对象
2.DI概念
依赖注入
简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。
3.实现IOC
原理:
xml解析;工厂模式;反射
过程:
可以使用XML配置,也可以使用注解
被注解标注的地方会先进行反射,
3.1.XML配置
3.1.1.通过 bean 的 set()方法赋值
bean.xml代码
使用property完成属性注入
<bean id="user" class="com.xinzhi.spring.User" >
<property name="age" value="13"> </property>
// name:类里面的属性名称;value:向属性注入的值;
</bean>
test类代码
ApplicationContext a = new ClassPathXmlApplicationContext(“bean.xml”)
//可以看作spring容器的实例
User b = (User)a . getBean( "user",User.class);
//在spring容器 a 中寻找类的实例
3.1.2.通过 bean 的构造器赋值
使用constructor-arg完成属性注入
name:类里面的属性名称;value:向属性注入的值;
<constructor-arg value= “值” name = “age"/>
3.1.3.p名称空间
为了简化 XML 文件的配置。引入了一个新的 p 命名空间,可以通过元素属性的方式配置 Bean的属性。
使用 p 命名空间后,基于 XML 的配置方式将进一步简化。
<bean id="studentSuper" class="com.xinzhi.Student"
p:studentId="2002" p:age="18" />
3.2.注解
baen.xml代码
// 1.在spring配置文件中引入context文件头
xmlns:context="http://www.springframework.org/schema/context"
// 2.开启属性注解支持!
<context:annotation-config/>
// 3.指定注解扫描包
<context:component-scan base-package="com.xinzhi.pojo"/></context:component-scan>
要注入的类
// 1.在指定包下编写类,增加注解
@Component("user")
// 相当于配置文件中 <bean id="user" class="当前注解的类"/>
public class User{
}
总结:
1.注解标识组件
1) 普通组件:@Component
2) 持久化层(dao)组件:@Repository
3) 业务逻辑层组件:@Service
4) 表述层控制器组件:@Controller
2.注解注入属性
1) @Autowired 根据属性类型进行自动装配
2) @Qualifier 根据名称进行注入
3) @Resource 既可以通过属性类型也可以通过名称
3.3.XML与注解比较
- XML可以适用任何场景 ,结构清晰,维护方便
- 注解不是自己提供的类使用不了,开发简单方便
三、AOP
面向切面编程
作用:不修改源码,在主干功能里添加新功能;不修改源码的基础上对方法增强 (某个方法执行前做什么,执行后做什么)
1.AOP术语
切面(Aspect) :是动作;把‘通知’应用到‘切入点’的过程
连接点(Joinpoint) :连接‘切面’和‘运行方法’;
通知(Advice) :什么时候要执行‘切面’
切入点(Pointcut) :实际被真正增强的方法,称为切入点。
目标对象(Target Object):被切入的对象
AOP代理(AOP proxy):Spring AOP有两种代理方式,JDK代理和CGLIB代理
2.不同类型的通知
在增强类里,在作为通知方法上面添加通知类型注解,使用切入点表达式
① @Before:前置通知,在方法执行之前执行
② @After:后置通知,在方法执行之后执行
③ @AfterRunning:返回通知,在方法返回结果 之后执行
④ @AfterThrowing:异常通知,在方法抛出异常之后执行
⑤ @Around:环绕通知,围绕着方法执行
3.实现AOP
3.1.xml实现
bean.xml代码
// 1.引入AOP相关依赖
xmlns:aop="http://www.springframework.org/schema/aop"
// 2.开启注解扫描
<context:component-scan base-package=“包路径名”>
</context:component-scan>
// 3.组件化两个类,增强类和被增强类,创建方法
<bean id="" class= "增强类" ></ bean>
<bean id="" class= "被增强类" ></ bean>
// 4.配置切入点
<aop:config >
// 切入点
<aop:pointcut id="A" expression ="切入点表达式" />
// 切面
<aop:aspect ref="增强类bean">
<aop:通知类型 method = " " pointcut-ref="A" />
</aop:aspect >
</aop:config >
切入点表达式
作用:知道对哪个类的哪个方法进行增强
execution( [ 权限修饰符] [返回类型] [类全路径] [方法名称] ( [ 参数列表] ) )
3.2.注解方式实现
- bean.xml代码
// 1.开启注解扫描
<context:component-scan base-package=“包路径名”></ context:component-scan>
// 2.开启生成代理对象
<aop:aspectj-autoproxy ></aop:aspectj-autoproxy >
-
创建类、增强类,类里面定义方法
-
使用注解组件化 类和增强类 @Component
-
在增强类的上面添加注解 @Aspect
-
设置切点,调用切点
// 设置切点
@Pointcut(value=“切入点表达式”) // 切入点
public void 方法(){ } // 方法签名:用来接收切点
// 调用切点
@Bedore(value=“方法()”) // 调用
**注:**若多个类对同一个方法增强,设置增强类的优先级
在增强类上添加@Order(int A) A越小优先级越高
四、事务
事务就是一组数据要么都执行,要么都不执行
1.特点(ACID)
A 原子性:一个事务是不可再分割的整体,要么都执行要么都不执行
C 一致性:一个事务可以使数据从一个一致状态切换到另外一个一致的状态
I 隔离性:一个事务不受其他事务的干扰,多个事务互相隔离的
D 持久性:一个事务一旦提交了,它对数据库的改变是永久的。