Spring5框架 详解

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源码部分


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值