Spring基础知识学习总结

Spring基础

1.spring是轻量级的开源JavaEE框架
2.spring可以解决企业应用开发的复杂性
3.两大核心:
(1)IOC:控制反转,把创建对象的过程交给Spring来管理
(2)Aop:面向切面,不修改源代码进行功能增强

1 IOC容器

1.1 基础概念

(1)控制反转,把对象的创建和对象之间的调用过程交给Spring进行管理
(2)可以降低复杂系统的耦合度
(3)底层使用xml解析、工厂模式、反射

1.2 IOC基本原理

(1)创建一个类,UserDao();
(2)配置xml文件
<bean id="dao" class="com.xxx.UserDao"></bean>
(3)创建工厂类
class UserFactory {
	public static UserDao getDao() {
		String classValue = "com.xxx.UserDao";
		Class clazz = Class.forName(classValue);
		return (UserDao)clazz.newInstance();
	}
}

于是就可以通过getDao()方法获得UserDao类了。
Spring的两种IOC实现方式:
(1)BeanFactory:IOC容器基本实现,加载配置文件时不会创建对象,在获取对象时才创建对象。
(2)ApplicationContext:BeanFactory的子接口,加载配置文件的时候就会创建对象

1.3 IOC操作Bean

1.3.1.基于XML方式创建对象
<bean id="dao" class="com.xxx.UserDao"></bean>

bean标签中最常用的属性:id属性:唯一标识,class属性:类全路径
创建对象时默认通过无参构造来创建。

1.3.2.基于XML方式注入属性,基于set方法注入
<bean id="dao" class="com.xxx.UserDao">
	<property name="aname" value="xxx"></property>
	<property name="bname" value="xxx"></property>
</bean>
1.3.3.基于有参构造来注入
<bean id="dao" class="com.xxx.UserDao">
	<property  name="aname" value="xxx"></property>
	<property  name="bname" value="xxx"></property>
</bean>
1.3.4.注入内部bean
<bean id="dao" class="com.xxx.UserDao">
	<property  name="aname" value="xxx"></property>
	<property  name="bname" value="xxx"></property>
	<property name="dept">
		<bean id="dept" class="com.xxx.Dept">
			<property name="cname" value="xxx"></property>
		</bean>
	<property name="bname" value="xxx"></property>
</bean>
1.3.5.注入外部bean
<bean id="dao" class="com.xxx.UserDao">
	<property  name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
</bean>
1.3.6.自动装配

(1)根据属性名称自动注入

<bean id="dao" class="com.xxx.UserDao" autowire="byName"></bean>
<bean id="dept" class="xxx"></bean>

(2)根据属性类型自动注入

<bean id="dao" class="com.xxx.UserDao" autowire="byType"></bean>
<bean id="dept" class="xxx"></bean>
1.3.7.注解操作bean

(1)什么是注解
- 注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值…)
- 使用注解,注解作用在类上面,方法上面,属性上面
- 使用注解目的:简化 xml 配置
(2)Spring针对Bean管理中创建对象提供注解
- @Component
- @Service
- @Controller
- @Repository
#上面四个注解功能是一样的,都可以用来创建 bean 实例
(3)基于注解方式实现属性注入
@Autowired:根据属性类型进行自动装配
@Qualifire:根据名称进行注入

//定义 dao 类型属性
//不需要添加 set 方法
//添加注入属性注解
@Autowired //根据类型进行注入
@Qualifier(value = "userDaoImpl1") //根据名称进行注入
private UserDao userDao;

@Resource:可以根据类型注入,可以根据名称注入

//@Resource //根据类型进行注入
@Resource(name = "userDaoImpl1") //根据名称进行注入
private UserDao userDao;

@Value:注入普通类型属性

@Value(value = "abc")
private String name;
1.3.8.完全注解开发

创建配置类,替代xml配置文件

@Configuration //作为配置类,替代 xml 配置文件
@ComponentScan(basePackages = {"com.atguigu"})
public class SpringConfig {
}

bean的生命周期
(1)通过构造器创建 bean 实例(无参数构造)
(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
(3)把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
(4)调用 bean 的初始化的方法(需要进行配置初始化的方法)
(5)把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization
(6)bean 可以使用了(对象获取到了)
(7)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)

2.AOP

2.1 基础概念

(1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能

2.2 AOP基本原理

(1)有接口时,使用JDK动态代理
(2)没有接口时,使用CGLIB动态代理

2.3 AOP相关术语

(1)连接点
(2)切入点
(3)通知(增强)

  • 前置通知
  • 后置通知
  • 环绕通知
  • 异常通知
  • 最终通知

(4)切面

2.4 AOP操作

1.切入点表达式
例1:对 com.atguigu.dao.BookDao 类里面的 add 进行增强execution(* com.atguigu.dao.BookDao.add(…))
例2:对 com.atguigu.dao.BookDao 类里面的所有的方法进行增强execution(* com.atguigu.dao.BookDao.* (…))
例3:对 com.atguigu.dao 包里面所有类,类里面所有方法进行增强execution(* com.atguigu.dao.. (…))
1.创建被增强的类

@Component
public class User {
 public void add() {
 System.out.println("add.......");
 }
}

2.创建增强类,在增强类上加@Aspect

//增强的类
@Component
@Aspect //生成代理对象
public class UserProxy {
 //前置通知
 //@Before 注解表示作为前置通知
 @Before(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
 public void before() {
 System.out.println("before.........");
 }
 //后置通知(返回通知)
 @AfterReturning(value = "execution(* 
com.atguigu.spring5.aopanno.User.add(..))")
 public void afterReturning() {
 System.out.println("afterReturning.........");
 }
 //最终通知
 @After(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
 public void after() {
 System.out.println("after.........");
 }
 //异常通知
 @AfterThrowing(value = "execution(* 
com.atguigu.spring5.aopanno.User.add(..))")
 public void afterThrowing() {
 System.out.println("afterThrowing.........");
 }
 //环绕通知
 @Around(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
 public void around(ProceedingJoinPoint proceedingJoinPoint) throws 
Throwable {
 System.out.println("环绕之前.........");
 //被增强的方法执行
 proceedingJoinPoint.proceed();
 System.out.println("环绕之后.........");
 }
}

3.有多个增强类多同一个方法进行增强,设置增强类优先级
在增强类上面添加注解 @Order(数字类型值),数字类型值越小优先级越高

@Component
@Aspect
@Order(1)
public class PersonProxy

3.事务管理

3.1 基础概念

1、事务添加到 JavaEE 三层结构里面 Service 层(业务逻辑层)
2、在 Spring 进行事务管理操作
(1)有两种方式:编程式事务管理和声明式事务管理(使用)
3、声明式事务管理
(1)基于注解方式(使用)
(2)基于 xml 配置文件方式
4、在 Spring 进行声明式事务管理,底层使用 AOP 原理
5、Spring 事务管理 API
(1)提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
在这里插入图片描述

3.2 事务的使用

在 service 类上面(或者 service 类里面方法上面)添加事务注解
(1)@Transactional,这个注解添加到类上面,也可以添加方法上面
(2)如果把这个注解添加类上面,这个类里面所有的方法都添加事务
(3)如果把这个注解添加方法上面,为这个方法添加事务

@Service
@Transactional
public class UserService {
}

3.3 事务相关参数

3.3.1 事务传播行为

参数为propagation,用于控制多事务方法直接进行调用,这个过程中事务是如何进行管理的
示例:

@Service
@Transactional(propagation = Propagation.REQUIRED)
public class UserService {
}

在这里插入图片描述

3.3.2 事务隔离级别

(1)事务有特性成为隔离性,多事务操作之间不会产生影响。不考虑隔离性产生很多问题
(2)有三个读问题:脏读、不可重复读、虚(幻)读

  • 脏读:一个未提交事务读取到另一个未提交事务的数据
  • 不可重复读:一个未提交事务读取到另一提交事务修改数据
  • 虚读:一个未提交事务读取到另一提交事务添加数据

可通过设置事务隔离级别,解决读问题

@Service
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)
public class UserService {
}

在这里插入图片描述

3.3.3 超时时间

(1)事务需要在一定时间内进行提交,如果不提交进行回滚
(2)默认值是 -1 ,设置时间以秒单位进行计算

3.3.4 是否只读

(1)读:查询操作,写:添加修改删除操作
(2)readOnly 默认值 false,表示可以查询,可以添加修改删除操作
(3)设置 readOnly 值是 true,设置成 true 之后,只能查询

3.3.5 回滚

rollbackFor 设置出现哪些异常进行事务回滚

3.3.6 不回滚

noRollbackFor 设置出现哪些异常不进行事务回滚

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值