Spring框架学习

学习地点:B站 BV1Vf4y127N5

1.Spring的特点

  1. 方便解耦
  2. AOP编程开发
  3. 方便程序测试
  4. 方便和其他框架进行整合
  5. 方便进行事务操作
  6. 降低API开发难度

2.IOC容器

2.1 IOC容器

2.1.1 什么是IOC
IOC(Inversion of Control)控制反转,即控制权的转移,将我们创建对象的方式反转了,以前对象的创建是由我们开发人员自己创建维护的,而在Spring中,对象的创建以及依赖关系可以由Spring完成创建以及注入
反转控制就是反转了对象的创建方式,从我们创建对象反转成程序创建对象


注入就是说怎么往对象中注入值的意思。。(通常就是set方法注入或构造器注入)

DI(Dependency Injection)依赖注入

1.什么是依赖注入

以下是您如何在传统编程中创建对象依赖关系的方法:

public class Store {
private Item item;

public Store() {
    item = new ItemImpl1();    
}
}

在上面的例子中,我们需要在Store类本身内实例化Item接口的实现。

通过使用DI,我们可以重写示例,而不必指定我们想要的Item的实现:

public class Store {
private Item item;
public Store(Item item) {
    this.item = item;
}
}

2. Spring中的依赖注入
Spring中的依赖注入可以通过constructorssettersfields来完成。

2.1基于Constructor的依赖注入

在基于Constructor的依赖注入的情况下,容器将调用一个构造函数,该构造函数的参数代表我们想要设置的依赖项

@Configuration
	public class AppConfig {

    @Bean
    public Item item1() {
        return new ItemImpl1();
    }

    @Bean
    public Store store() {
        return new Store(item1());
    }
}

2.2 基于Setter的依赖注入

对于基于Setter的依赖注入,容器将在调用无参数构造函数或无参数静态工厂方法来实例化bean之后,调用我们类的setter方法。

@Bean
public Store store() {
    Store store = new Store();
    store.setItem(item1());
    return store;
}

2.3基于Field的依赖注入

在基于Field的依赖注入中,我们可以通过使用@Autowired注解标记它们来注入依赖关系:

public class Store {
    @Autowired
    private Item item; 
}

Tips1:
同一个bean可以组合基于constructor和基于setter的注入类型。
Spring文档建议使用基于constructor的注入来实现强制的依赖关系,以及基于setter的注入来实现可选的注入。

Tips2:
1.Field使用反射来注入依赖关系,这比基于constructor或基于setter的注入成本高
2.使用这种方法继续添加多个依赖关系非常简单。如果您使用的constructor注入具有多个参数,那么我们会认为该类做了不止一件事情可能会违反单一责任原则。(意思大致是添加多个依赖关系简单是简单,但是这样是不是违反了单一责任原则)


2.2.使用IOC思想的好处

IOC的底层是工厂设计模式+反射模式目的也是为了解耦合

1.降低组件之间的耦合度,实现软件各层之间的解耦
2.可以使用容器提供众多服务,如事务管理消息服务处理等等。当我们使用容器管理事务时,开发人员就不需要手工控制事务,也不需要处理复杂的事务传播
3.容器提供单例模式支持
4.容器提供AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
5.容器提供众多的辅助类,使这些类可以加快应用的开发。(jdbcTemplate)

在这里插入图片描述


2.3.IOC的接口

1、IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂

2、Spring 提供 IOC 容器实现两种方式:(两个接口)

BeanFactory接口
IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用
加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象

ApplicationContext接口
BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用加载
配置文件时候就会把在配置文件对象进行创建

在类路径下夹杂配置文件ClassPathXmlApplicationContext
从硬盘的绝对路径下加载配置文件FileSystemXmlApplication

2.4 IOC基于XML的注入(不过建议使用注解开发)

1.创建空对象(相当于User user = new User())

<bean id="user" class="com.hong.domain,User"></bean>

2.注入属性(xml)

set注入(值用value属性,引用类型用ref属性)

public class User {
 //属性
 private String uname;
 private String upassword;
 public void setUname(String uname) {
 this.uname = uname;
 }
 public void setUpassword(String upassword) {
 this.upassword = upassword ;
 }
 }
<bean id="user" class="com.hong.domain.User">
	<property name="uname" value="老孙"></property>
	<property name="upassword" value="123123"></property>
</bean>

有参构造器注入

public class Orders {
 //属性
 private String oname;
 private String address;
 //有参数构造
 public Orders(String oname,String address) {
 this.oname = oname;
 this.address = address;
 }
<bean id="orders" class="com.hong.domain.Orders">
 <constructor-arg name="oname" value="电脑"></constructor-arg>
 <constructor-arg name="address" value="China"></constructor-arg>
</bean>

复杂类型注入

1.数组类型注入(array标签)
在这里插入图片描述
2.list类型注入(list标签)

 <!--list 类型属性注入-->
 <property name="list">
 <list>
 <value>张三</value>
 <value>小三</value>
 </list>
 </property>

3.map类型注入(map标签)

在这里插入图片描述
4.set类型注入(set标签)
在这里插入图片描述
5.properties的注入(props标签)


2.5 bean的作用域(单实例or多实例)

1、在 Spring 里面,默认情况下,bean 是单实例对象
2、如何设置单实例还是多实例?

(1)在 spring 配置文件 bean 标签里面有属性(scope)用于设置单实例还是多实例
(2)scope 属性值
	第一个值 默认值,singleton,表示是单实例对象
	第二个值 prototype,表示是多实例对象
<bean id="book" class="com.hong.collectiontype.Book" scope="prototype">
		<property name="list" ref="bookList"></property>
</bean>

(3)singleton 和 prototype 区别
第一 singleton 单实例,prototype 多实例
第二 设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象,而在设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建 对象,在调用getBean 方法时候创建多实例对象


2.6 基于注解的Bean管理(推荐)

1.使用注解添加的配置(注解扫描)
①导入context名称空间
②开启注解扫描

<context:component-scan base-package="com.hong.domain"></context:component-scan>

Tips:组件扫描中有use-default-filter属性,默认为true,表示使用默认过滤器
可以设为false进行自定义过滤器。

2.对于创建对象提供的注解

@Component
@Service 一般用在Service层
@Controller 一般用在Web层
@Repository 一般用在Dao层
@Scope 指定对象的作用范围
@Scope()

3.基于注解实现属性注入

(1)@Autowired:根据属性类型进行自动装配
在这里插入图片描述
(2)@Qualifier:根据名称进行注入(Qualifer注解要和Autowired一起使用)
(3)@Resource:可以根据类型注入,可以根据名称注入
(4)@Value:注入普通类型属性


Q:@AutoWired和@Resource的区别?
@AutoWired默认以类型进行查找,@Resource默认以名称进行查找
@AutoWired(required=false)+ @Qualifer(“user”) == @Resource(name=“user”)

2.4完全使用注解开发
1.创建配置类,替代xml配置文件

@Configuration		//作为配置类
@ComponentScan(basePackages={"com.hong"})		//开启注解扫描
public class SpringConfig{}

2.编写测试类


3.AOP

3.1AOP介绍

1.什么是aop?(Aspect Oriented Programming 面向切面编程)
①利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分的耦合度降低,提高可重复性

②通俗的说:不通过修改源代码的方式,在主干功能界面内添加新功能

③spring框架一般是基于AspectJ实现AOP的


2.AOP中常见名词

①JoinPoint(连接点):目标对象中,所有可以增强的方法,也就是spring允许你是通知的地方

②Pointcut(切入点):目标对象中,已经被增强的方法。

③Advice(通知/增强):增强方法的代码、想要的功能

④Target(目标对象):被代理的对象,被通知的对象,被增强的类对象

⑤Weaving(织入): 将通知应用到连接点形成切入点的过程

⑥Proxy(代理):将通知织入到目标对象之后形成的代理对象

⑦aspect(切面):切入点+通知——切入点说明在哪干,通知说明干什么
(干什么就自己写~~)(这是个动作)

3.2AOP小例子

提前说明:

①切入点表达式(见于配置文件中):

语法结构:execution([权限修饰符][返回类型][类全路径][方法名]([参数列表]))

如下面例子:在这里插入图片描述
表示com.itcats.spring.aop包及其所有子包下所有的以ServiceImpl结尾的类生成代理对象。


@Aspect注解表示该类是个通知类
Tips:使用该注解时要在 spring 配置文件中开启生成代理对象

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

③ @Pointcut注解 用来抽取相同的切入点,类似于之前那个util标签


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


完全注解开发(创建配置类,可替代xml配置文件)

@Configuration
@ComponentScan(basePackages={"com.hong"})
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class ConfigAop{}

1、准备目标对象(源代码)

在这里插入图片描述
2、准备通知(想要增强源代码的方法)

在这里插入图片描述
3、配置applicationContext.xml
①导入aop(约束)命名空间
②配置目标对象
③配置通知对象
④配置将通知织入目标对象

在这里插入图片描述
总结:通知的几种类型
1.前置通知——目标方法运行之前调用 (@Before)
2.后置通知——目标方法运行之后调用(如果出现异常不调用)(@After)
3.环绕通知——目标方法之间和之后都会调用 (@Around)
4.异常拦截通知——如果出现异常就会调用 (@AfterThrowing)
5.后置通知——目标方法运行之后条用(必定调用)(@AfterReturning)


4.spring整合jdbc(JdbcTemplate)

4.1 JdbcTemplate介绍和配置

①什么是JdbcTemplate?
Spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作

②使用JdbcTemplate需要什么准备工作?
1)引入相关jar包
2)在Spring配置文件中配置数据库连接池(建议用${jdbc.jdbcUrl}读取prop配置文件的数据库信息,不建议如下图所示这种方式,)
在这里插入图片描述

3)配置JdbcTemplate对象,注入DataSource
在这里插入图片描述

batchUpdate() 批量改
batchAdd() 批量增
batchDelete() 批量删


5.spring中的事务

ACID不说了
三种并发问题不写了
四种隔离级别(1248)

5.1spring中事务的分类

spring中事务可以分为编程式事务控制和声明式事务控制(使用)

编程式事务控制:自己手动控制事务

Conn.setAutoCommit(false);

细粒度的事务控制:可以对指定的方法、指定的方法某几行添加事务控制
(比较灵活,但开发起来过于繁琐:因为每次都要开启、提交、回滚)

Tips:开启事务后一定要手动释放,否则长期占用内存


声明式事务控制

Spring提供了对事务的管理就叫做声明式事务管理(核心实现就是AOP)

如果想用Spring的声明式事务管理,只需要在配置文件中配置即可;
不想使用时就直接移除配置,实现了对事务控制最大程度的解耦

粗粒度的事务控制:只能给整个方法应用事务,不可以对方法的某几行应用事务(aop拦截的是方法!)

Spring声明式事务管理器类:
jdbc中:DataSourceTemplateManger

5.2 Spring事务管理的API

PlatfromTranscationManger——接口

DataSourceTranscationManger——针对于JDBC的实现类


5.3spring管理事务的属性

①配置事务管理器
在这里插入图片描述

②开启注解扫描

③配置事务注解
可以在@Transcational中配置事务相关参数
在这里插入图片描述


propagation是事务传播行为,spring中定义了七种类传播行为

在这里插入图片描述


ioslation:事务隔离级别**
在这里插入图片描述


timeout:超时时间

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


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


rollbackFor:回滚
(1)设置出现哪些异常进行事务回滚


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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值