Spring简介
spring是一个开源框架,是一个分层的JavaEE一站式框架。所谓一站式框架是指Spring有JavaEE开发的每一层解决方案。
Web层: SpringMVC
Service层: Spring的Bean管理,声明式事物
Dao层: Spring的JDBC模板,ORM模板
优点:
IOC:方便解耦合
AOP:对程序进行扩展
轻量级框架
方便与其它框架整合
控制反转(IOC)
控制反转(Inversion of Control)是指对象的创建权反转交给Spring管理。
(实现原理:工厂模式+反射机制+配置文件)
IOC和DI
DI指依赖注入,其前提是必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入进来。
Spring 的工厂类
BeanFactory: 老版本的工厂类,在调用getBean()方法时,才会生成类的实例。
ApplicationContext: 在加载配置文件的时候,就会将 Spring 管理的类都实例化。有两个实现类:
ClassPathXmlApplicationContext: 加载类路径下的配置文件
FileSystemXmlApplicationContext: 加载磁盘下的配置文件
bean标签配置
id: 唯一约束,不能出现特殊字符
name: 理论上可以重复,但是开发中最好不要。可以出现特殊字符
生命周期:
init-method: bean被初始化的时候执行的方法
destroy-method: bean被销毁的时候执行的方法
作用范围:
scope:bean的作用范围,有如下几种,常用的是前两种
singleton: 默认使用单例模式创建
prototype: 多例
request: 在web项目中,spring 创建类后,将其存入到 request 范围中
session: 在web项目中,spring 创建类后,将其存入到 session 范围中
globalsession: 在web项目中,必须用在 porlet 环境
属性注入设置:
set 方法属性注入:
P名称空间的属性注入:首先需要引入p名称空间:
集合类型属性注入:
注解详解
1.@Component:组件注解,用于修饰一个类,将这个类交给 Spring 管理。
有三个衍生的注解,功能类似,也用来修饰类。
@Controller:修饰 web 层类
@Service:修饰 service 层类
@Repository:修饰 dao 层类
2.属性注入
普通属性使用 @Value 来设置属性的值
对象属性使用 @Autowired ,这个注解是按照类型来进行属性注入的。如果希望按照 bean 的名称或id进行属性注入,需要用 @Autowired 和 @Qualifier 一起使用
实际开发中,使用 @Resource(name=" ") 来进行按照对象的名称完成属性注入
3.其他注解
@PostConstruct 相当于 init-method,用于初始化函数的注解
@PreDestroy 相当于 destroy-method,用于销毁函数的注解
@Scope 作用范围的注解,常用的是默认单例,还有多例 @Scope("prototype")
IOC 的 XML 和注解开发比较
适用场景:XML 适用于任何场景;注解只适合自己写的类,不是自己提供的类无法添加注解。
可以使用 XML 管理 bean,使用注解来进行属性注入
Spring的代理模式:
静态代理(AspectJ )
动态代理(AOP)
AOP开发
AOP 是 Aspect Oriented Programming 的缩写,意为面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,是OOP的延续。
AOP 能够对程序进行增强,在不修改源码的情况下,可以进行权限校验,日志记录,性能监控,事务控制等。(即在不改变原有代码的情况下,在任何类的任何方法的任何位置添加任何功能)
底层实现
JDK 动态代理只能对实现了接口的类产生代理。Cglib 动态代理可以对没有实现接口的类产生代理对象,生成的是子类对象。
判断是使用JDK动态代理还是使用Cglib动态代理的方法: 看JDK 动态代理是否实现了 InvocationHandler类 ,不是就是使用Cglib 动态代理。
Spring 的 AOP 开发(AspectJ 的 XML 方式)
AspectJ 是一个 AOP 的框架,Spring 引入 AspectJ,基于 AspectJ 进行 AOP 的开发。
相关术语
Joinpoint: 连接点,可以被拦截到的点。也就是可以被增强的方法都是连接点。
Pointcut: 切入点,真正被拦截到的点,也就是真正被增强的方法
Advice: 通知,方法层面的增强。对某个方法进行增强的方法,比如对 save 方法进行权限校验,权限校验的方法称为通知。
Introduction: 引介,类层面的增强。
Target: 目标,被增强的对象(类)。
Weaving: 织入,将 advice 应用到 target 的过程。
Proxy: 代理对象,被增强的对象。
Aspect: 切面,多个通知和多个切入点的组合。
通知类型
前置通知:在目标方法执行前操作,可以获得切入点信息
后置通知:在目标方法执行后操作,可以获得方法返回值
环绕通知:在目标方法执行前和后操作,可以阻止目标方法执行
异常抛出通知:程序出现异常时操作
最终通知:相当于finally块,无论代码是否有异常,都会执行
引介通知:不常用
注解通知类型
@Before:前置通知
@AfterReturning: 后置通知
@AfterReturning(value="execution(* demo1.OrderDao.save(..))",returning="result")
public void after(Object result){
System.out.println("after "+result);
}
@Around:环绕通知
@Around(value="execution(* demo1.OrderDao.save(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("before");
Object obj=joinPoint.proceed();
System.out.println("after");
return obj;
}
@AfterThrowing: 抛出异常
@AfterThrowing(value="execution(* demo1.OrderDao.save(..))",throwing="e")
public void afterThrowing(Throwable e){
System.out.println("exception:"+e.getMessage();
}
@After: 最终通知
@After(value="execution(* demo1.OrderDao.save(..))")
public void after(){
System.out.println("finally");
}
@PointCut:切入点注解
@PointCut(value="execution(* demo1.OrderDao.save(..))")
private void pointcut1(){}
此时,在上述通知的注解中,value可以替换为该函数名,例如:
@After(value="MyAspect.pointcut1()")
public void after(){
System.out.println("finally");
}
Spring 的 JDBC 模板
Spring 对持久层也提供了解决方案,也就是 ORM 模块和 JDBC 的模板。针对 JDBC ,提供了 org.springframework.jdbc.core.JdbcTemplate 作为模板类。
Spring的事务管理 (事务)
事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
具有四个特性:
原子性:事务不可分
一致性:事务执行前后数据完整性保持一致
隔离性:一个事务的执行不应该受到其他事务干扰
持久性:一旦事务结束,数据就持久化到数据库
如果不考虑隔离性会引发安全性问题:
读问题:
脏读:一个事务读到另一个事务未提交的数据
不可重复读:一个事务读到另一个事务已经提交的 update 数据,导致一个事务中多次查询结果不一致
幻读:一个事务读到另一个事务已经提交的 insert 数据,导致一个事务中多次查询结果不一致
写问题: 丢失更新
解决读问题:设置事务隔离级别
Read uncommitted: 未提交读,无法解决任何读问题
Read committed: 已提交读,解决脏读问题
Repeatable read: 重复读,解决脏读和不可重复读问题
Serializable:序列化,解决所有读问题
Spring中都用到了哪些设计模式
1. 工厂模式:BeanFactory和Applicationcontext使用了工厂模式
2. 单例模式:spring中的bean默认使用了单例模式
3. 代理模式:静态代理模式(AspectJ) 动态代理模式:spring AOP(JDK、CGLib)
4. 模板方法:JDBCTemplate 、hibernateTemplate
5. 适配器模式: spring AOP的增强或通知(Advice)
Spring中常用的注解
@Controller:用于spring mvc中的控制层
@Service:用于服务类
@RequestMapping:用于控制层处理程序方法中配置URL映射
@ResponseBody:用于响应发送的XML或JSON数据(对象)
@Autowired:用于自动装配依赖项
spring提供了哪些配置
基于XML配置、基于注解配置、基于JAVA API配置
可以通过几种方式完成依赖注入
构造函数注入、setter注入、接口注入