Spring
Spring 概述
简介
- Spring 是一个开源免费的框架,容器
- Spring 是一个轻量级的框架,非侵入性的
- 控制反转IoC,面向切片
- 对事物的控制,对框架的支持
总结一句话:Spring就是一个轻量级的控制反转(IoC)和面向切面编程(AOP)的框架
组成
- Spring
- Spring boot
- Spring Cloud
IoC理论
控制反转是一种通过描述(XML或注释)并通过第三方生产或者获取特定对象的方式,在Spring中实现控制反转的是IoC容器,其实现方式是依赖注入(Dependency Injection DI)
第一个Spring程序
IoC创建对象方式
通过无参构造方法创建
通过有参构造方法创建
在配置文件加载的时候,其中管理的对象都已经初始化了
Spring配置说明
别名 alias
alias设置别名,为bean设置别名,可以设置多个别名
<alias name = "userT" alias="userNew"/>
Bean的配置
<!--bean就是一个java对象,由Spring创建与管理
id是bean的标识符,要唯一,如果没有设置id,那么name就是默认标识符
如果配置了id又配置了name,那么name是别名
name可以设置多个别名
-->
< bean id="hello" name="hello2 h2,h3;h4" class="com.hml.pojo.Hello">
<property name = "name" value="hml"/>
</bean>
import
团队的合作通过import来实现
<import resource="{path}/beans.xml"/>
依赖注入
概念
- 依赖注入:Dependency Injection DI
- 依赖:指的是Bean对象的创建依赖于容器,Bean对象的依赖资源
- 注入:指的是Bean对象所依赖的资源,由容器来设置以及装配
构造器注入
之前作用到的方法均是构造器注入
Set注入
要求被注入的属性,必须要有set方法,set方法的方法名由set+属性首字母大写,如果属性是boolean类型,那么没有set方法,是is
常量注入
<bean id="student" class="com.hml.pojo.Student">
<property name="name" value="hml"/>
</bean>
bean注入
<bean id="addr" class="com.hml.pojo.Student">
<property name="address" value="Beijing"/>
</bean>
<bean id="student" class="com.hml.pojo.Student">
<property name="name" value="hml"/>
<property name="address" ref="addr"/>
</bean>
数组注入
<bean id = "student" class="com.hml.pojo.Student">
<property name = "name" value="hml"/>
<property name = "address" ref ="addr"/>
<property name = "books">
<array>
<value>西游记</value>
<value>红楼梦</value>
<value>水浒传</value>
</array>
</property>
</bean>
List注入
<property name = "hobbys">
<list>
<value>listioning music</value>
<value>watching movie</value>
<value>climb</value>
</list>
</property>
Map注入
<property name = "card">
<map>
<entry key="中国邮政" value="111111111"/>
<entry key="邮政" value = "22222222222"/>
</map>
</property>
set注入
<property name="games">
<set>
<value>LOL</value>
<value>BOB</value>
<value>COC</value>
</set>
</property>
Null注入
<property name="wife"><null/></property>
Properties注入
<property name="info">
<props>
<prop key="学号">201928013229133</prop>
<prop key="sex">男</prop>
<prop key="name">hml</prop>
</props>
</property>
p命名和c命名注入
P命名空间注入 : 需要在头文件中加入约束文件
Bean的作用域
Singleton
在Spring IoC容器中仅存在一个Bean实例,Bean以单一方式存在
<bean id ="ServiceImpl" class = "com.hml.service.ServiceImpl scope = "singleton/>
prototype
当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype,可以这样配置:
<bean id="account" class="com.foo.DefaultAccount" scope="prototype"/>
or
<bean id="account" class="com.foo.DefaultAccount" singleton="false"/>
request
当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:
<bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>
session
当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
自动装配
自动装配说明
- 自动装配是使用spring满足bean依赖的一种方法
- spring会在应用上下文中为某一个bean寻找其依赖的bean
装配机制
- 在xml中显式配置
- 在java中显示配置
- 隐式的bean发现机制与自动装配
Spring的自动装配需要从两个角度来实现,或者说是两个操作:
- 组件扫描(component scanning):spring会自动发现应用上下文中所创建的bean;
- 自动装配(autowiring):spring自动满足bean之间的依赖,也就是我们说的IoC/DI;
组件扫描和自动装配组合发挥巨大威力,使得显示的配置降低到最少。
推荐不使用自动装配xml配置 , 而使用注解 .
装配方法
byName
byType
使用注解
使用注解开发
说明
在Spring4之后,想要使用注解模式,必须要引入aop的包。
在配置文件中,还需要引入一个context约束。
Bean的实现
我们之前都是使用bean的标签进行bean注入,但是实际开发中,我们一般都会使用注解
1.配置扫描那些包下的注解
<!--指定注解扫描包-->
<context:component-scan base-package="com.hml.pojo"/>
2.在指定的包下编写类
@Component("user")
public class User{
public String name = "hml";
}
属性注入
使用注解注入属性
1.可以不用提供set方法,直接在名上添加@value("值")
@Component("user")
public class User{
@Value("hml")
public String name;
}
2.如果提供了set
@Component("user")
public class User{
public String name;
@Value("hml")
public void setName(String name){
this.name = name;
}
}
衍生注解
@Component的三个衍生注解
- @Controller:web层
- @Service:service层
- @Repository:dao层
代理模式
为什么要学习代理模式,因为这是SpringAOP的底层。
我们在不改变原来的代码的情况下,实现了对原有功能的增强,这是AOP中最核心的思想
静态代理
- 抽象角色:一般使用接口或者抽象类来实现
- 真实角色:被代理的角色
- 代理角色:代理真实角色,代理真实角色之后,一般会做一些附属的操作
- 客户:使用代理角色来进行一些操作。
静态代理的好处:
- 可以使我们的真实角色更加纯粹,不再去关注一些公共的事情
- 公共的业务由代理来完成,实现了业务的分工
- 公共业务发生拓展时变得更加集中与方便
静态代理的坏处:
- 类多了,多了代理类,工作量变大了,开发效率有所降低。
动态代理
- 动态代理的角色是和静态代理的一样
- 动态代理的代理类是动态生成的,静态代理的代理类是我们提前写好的。
- 动态代理分为两类:一类是基于接口的动态代理,另外一种是基于类的动态代理
- 基于接口的动态代理----JDK动态代理
- 基于类的动态代理----cglib
- 现在用的比较多的是javasist来生成动态代理
- 使用JDK的原生代码来实现。
JDK的动态代理需要两个类:
核心:InvocationHandler和Proxy
深入理解
AOP
什么是AOP
AOP在Spring中的作用
使用Spring实现AOP
通过Spring API
自定义类来实现AOP
使用注解实现
整合Mybatis
事务回顾
回顾事务
- 要么都成功,要么都失败
- 事务在开发的过程中,十分的终于,涉及到数据的一致性问题
- 确保完整性与一致性
事务的ACID原则
A:原子性
C:一致性
I:隔离性 多个业务可能操作同一个资源,防止数据损坏
D:持久性 事务一旦提交,无论发生什么事情,数据都不能丢失