Spring框架概述
Spring是轻量级的开源的JavaEE框架
Spring可以解决企业应用开发的复杂性
Spring有两个核心部分:IOC 和 AOP
①IOC:控制反转,把创建对象过程交给Spring进行管理
②AOP:面向切面,不修改源代码进行功能增强
Spring特点
①方便解耦,简化开发
②AOP编程支持
③方便程序测试
④方便和其他框架进行整合
⑤方便进行事务操作
⑥降低API开发难度
Spring各个版本下载地址
https://repo.spring.io/ui/native/release/org/springframework/spring
IOC容器 IOC概念和底层原理
什么是IOC?
①控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理
②使用IOC目的:为了耦合度降低
IOC底层原理
xml解析、工厂模式、反射
IOC接口(BeanFactory)
IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
Spring提供IOC容器实现两种方式(两个接口)
①BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员进行使用
*加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
②ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用
*加载配置文件时候就会把配置文件对象进行创建
ApplicationContext接口有实现类
FileSystemXmlApplicationContext :XML绝对路径
ClassPathXmlApplicationContext :XML类路径
IOC操作Bean管理(基于XML)
什么是Bean管理?
Bean管理指的是创建对象和注入属性两个操作
Spring创建对象
Spring注入属性
Bean管理操作有两种方式(XML配置文件方式和注解方式)
基于XML配置文件方式实现对象创建
在Spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
在bean标签有很多属性,常用属性
*id:唯一标识
*class:类全路径(包类路径/全限定类名)
创建对象时候,默认也是执行无参构造函数
基于XML配置文件方式实现注入属性
DI:依赖注入,就是注入属性(DI是IOC的一种具体实现)
第一种注入方式:使用set方法进行注入
创建类,定义属性和对应的set方法
第二种注入方式:使用有参数的构造注入
IOC操作Bean管理(FactoryBean)
Spring有两种类型bean,一种普通bean,另外一种工厂bean(FactoryBean)
普通bean:在配置文件中定义bean类型就是返回类型
工厂bean:在配置文件中定义bean类型可以和返回类型不一样
第一步:创建类,让这个类作为工厂bean,实现接口FactoryBean
第二步:实现接口里面的方法,在实现的方法中定义返回的bean类型
IOC操作Bean管理(bean作用域)
在Spring里面,设置创建bean实例是单实例还是多实例
在Spring里面,默认情况下,bean是单实例对象
如何设置单实例还是多实例
在Spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例
scope属性值
第一个值 默认值,singleton,表示单实例对象
第二个值 prototype,表示是多实例对象
singleton 和 prototype 区别
第一:singleton 单实例, prototype 多实例
第二:设置scope值是singleton时候,加载spring配置文件时候就会创建单实例对象;设置scope值是prototype时候,不是在加载spring配置文件时候创建对象,在调用getBean方法时候创建多实例对象
IOC操作bean管理(bean生命周期)
生命周期
从对象创建到对象销毁的过程
bean生命周期
①通过构造器创建bean实例(无参数构造)
②为bean的属性设置值和对其他bean引用(调用set方法)
③调用bean的初始化的方法(需要进行配置初始化的方法)
④bean可以使用了(对象获取到了)
⑤当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
bean的后置处理器,bean生命周期有七步
①通过构造器创建bean实例(无参数构造)
②为bean的属性设置值和对其他bean引用(调用set方法)
③把bean实例传递bean后置处理器的方法(postProcessBeforeInitialization)
④调用bean的初始化的方法(需要进行配置初始化的方法)
⑤把bean实例传递bean后置处理器的方法(postProcessAfterInitialization)
⑥bean可以使用了(对象获取到了)
⑦当容器关闭时候,调用bean的销毁的方法(需要进行配置销毁的方法)
IOC操作bean管理(xml自动装配)
什么是自动装配
根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入
<bean id="emp" class="com.spring5.autowire.Emp" autowire="byType">
</bean>
<bean id="dept" class="com.spring5.Dept"></bean>
IOC操作bean管理(外部属性文件)
直接配置数据库信息
配置德鲁伊连接池
引入德鲁伊连接池依赖jar包
引入外部属性文件配置数据库连接池
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/userDb"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
基于注解方式实现属性注入
@AutoWired:根据属性类型进行自动装配
@Qualifier:根据属性名称进行注入
@Resource:可以根据类型注入,也可以根据名称注入
@Value:注入普通类型属性
完全注解开发
创建配置类,替代xml配置文件
@Configuration //作为配置类,替代xml配置文件
@ComponentScan(basePackages = {"com.cup"})
public class SpringConfig {
}
@Test
public void testSpring() {
//加载配置类
ApplicationContext context
= new AnnotationConfigApplicationContext(SpringConfig.class);
}
AOP(概念)
什么是AOP
①面向切面(方面)编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
②通俗描述:不通过修改源代码方式,在主干功能里面添加新功能
③使用登录例子说明AOP
AOP(底层原理)
AOP底层使用动态代理
有两种情况动态代理
第一种:有接口情况,使用JDK动态代理
创建接口实现类代理对象,增强类的方法
第二种:没接口情况,使用CGLIB动态代理
创建子类的代理对象,增强类的方法
AOP(JDK动态代理)
使用JDK动态代理,使用Proxy类里面的方法创建代理对象
调用newProxyInstance方法
方法有三个参数
第一个参数:类加载器
第二个参数:增强方法所在的类,这个类实现的接口,支持多个接口
第三个参数:实现这个接口InvocationHandler,创建代理对象,写增强的方法
编写JDK动态代理代码
①创建接口,定义方法
public interface UserDao {
int add(int a, int b);
String update(String id);
}
②创建接口实现类,实现方法
public class UserDaoImpl implements UserDao {
@Override
public int add(int a, int b) {
System.out.println("add方法执行了...");
return a+b;
}
@Override
public String update(String id) {
System.out.println("update方法执行了...");
return id;
}
}
③使用Proxy类创建接口代理对象
public class JDKProxy {
public static void main(String[] args) {
Class[] interfaces = {UserDao.class};
UserDaoImpl userDao = new UserDaoImpl();
UserDao dao = (UserDao)Proxy.newProxyInstance(
JDKProxy.class.getClassLoader(),
interfaces,
new UserDaoProxy(userDao)
);
int result = dao.add(1, 2);
System.out.println(result);
}
}
class UserDaoProxy implements InvocationHandler {
//1、把创建的是谁的代理对象,把谁传递过来
//有参数构造传递
private Object obj;
public UserDaoProxy(Object obj) {
this.obj = obj;
}
//增强的逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法之前
System.out.println("方法之前执行..."+method.getName+":传递参数..."+Arrays.toString(args));
//被增强的方法执行
Object res = method.invoke(obj, args);
//方法之后
System.out.println("方法之后执行..."+obj);
return res;
}
}
AOP(术语)
①连接点
类里面哪些方法可以被增强,这些方法称为连接点
②切入点
实际真正增强的方法,称为切入点
③通知(增强)
实际增强的逻辑部分称为通知(增强)
通知有多种类型
*前置通知
*后置通知
*环绕通知
*异常通知
*最终通知 (finally)
④切面
是动作
把通知应用到切入点过程
AOP操作(准备)
Spring框架一般基于AspectJ实现AOP操作
什么是AspectJ
AspectJ不是Spring组成部分,独立AOP框架,一般把AspectJ和Spring框架一起使用,进行AOP操作
基于AspectJ实现AOP操作
基于xml配置文件
基于注解方式实现
切入点表达式
切入点表达式作用:知道对哪个类里面的哪个方法进行增强
语法结构
execution([权限修饰符][返回类型][类全路径][方法名称][参数列表])
对com.cup.dao.BookDao类里面的add方法进行增强
excution( com.cup.dao.BookDao.add(…))
对com.cup.dao.BookDao类里面的所有方法进行增强
execution(* com.cup.dao.BookDao.(…))
对com.cup.dao包里面所有类,类里面所有方法进行增强
execution( com.cup.dao..(…))
进行通知的配置
在Spring配置文件中,开启注解扫描
使用注解创建User和UserProxy对象
在增强类上面添加@Aspect
在Spring配置文件中开启生成代理对象
事务概念
什么是事务
事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败
事务四个特性(ACID)
原子性
一致性
隔离性
持久性
待续...
Spring源码部分