复制对程序中的对象进行集中管理 方便维护和解耦
Spring:是一个分层的JavaSE/EE应用的全栈轻量级开源框架。
主要作用:完成对象创建 集中管理创建好的对象
Spring主要用于Service层
Spring全家桶:
SpringMVC: web
Spring: service
Spring JDBC: dao
IOC:控制反转
原来:对象的创建在调用方【应用程序】中完成
现在:对象的创建时交由Spring完成,对象创建好存入到IOC容器
体现:将对象的创建权有调用方变成了Spring 就进行了一个反转。
DI注入:
set注入:
1.在类中声明属性 提供set方法
2.在bean标签中使用property标签为属性注入数据
name:属性名称
value:简单类型数据
ref:注入IOC容器中管理的数据
构造器注入:
1.在类中声明属性 提供带参构造方法
2.在bean标签中使用constructor-arg标签为构造方法参数注入数据
name:参数名称
value:简单类型数据
ref:注入IOC容器中管理的数据
注入方式:
set注入:
构造器注入:
注入不同的数据类型:
简单类型数据【基本数据类型+String】:value
IOC容器管理的数据:使用ref
1.IOC使用
IOC概念:控制反转,之前要使用一个对象需要再调用方法直接new,
现在,由Spring工厂来去创建,相当于将对象的创建权由应用程序交给了Spring
使用步骤:
1.创建Maven工厂 导入spring-context依赖
2.创建接口和实现类
3.在applicationContext.xml中使用bean标签配置要创建的对象
4.测试
3.1:创建工厂对象
3.2:找工厂要对象
3.3:调用方法
2.DI使用
DI概念:依赖注入,由于使用了IOC之后,对象的创建及管理都属于IOC容器,应用程序想使用某个对象需要依赖IOC容器给到
使用步骤:
注入方式:
1.setter注入
1.在类中定义属性 提供set方法
2.在bean标签中使用property标签为属性赋值
<bean>
<property name="属性名称" value="简单类型数据" />
<property name="属性名称" ref="IOC容器中管理的对象"/>
</bean>
2.构造器注入
1.在类中定义属性 提供带参构造方法
2.在bean标签中使用constructor-arg标签为构造方法参数赋值
<bean>
<constructor-arg name="参数名称" value="简单类型数据"/>
<constructor-arg name="参数名称" ref="IOC容器中管理的对象"/>
</bean>
使用properties配置文件中的数据为对象的属性注入数据:
1.准备一个properties配置文件
2.在applicationContext.xml中引入properties配置文件
<context:property-placeholder location="classpath:db.properties"/>
注意:要引入完整的context命令空间
3.使用${properties.key}获取数据 完成注入
1.概念性问题 不需要 了解
2.UserServiceImpl01 us = context.getBean(UserServiceImpl02.class);
这个等式不成立!
UserService us = context.getBean(UserServiceImpl02.class); 成立
3.实际开发中主流方式使用注解90%
SSM:大概率会使用XML方式配置
4.构造器注入 根据构造方法的参数【个数和名称和类型】去调用指定的构造方法
javabean实体类:建议给一个空参的和一个全参的构造方法。
5.自动装配:在需要从IOC容器中获取对象注入到某个bean中就可以使用 【随时】
6.注解方式和XML配置方式实现IOC|DI原理必须一样的
XML方式:直接在XML配置文件中声明
注解方式:在java类中通过注解标识声明
Spring整合MyBatis
目标:希望能够通过Spring获取dao接口的代理对象并加入到IOC容器中管理, 直接注入到service层进行使用即可
代码编写:
dao:
public interface UserDao{
@Select("select * from user")
List<User> findAll();
}
service:
public class UserService{
public List<User> findAll(){
//1.获取SqlSessionFactory对象
//2.获取SqlSession对象
//3.获取dao接口代理对象
//4.调用方法
}
}
现在:Spring整合MyBatis之后
public class UserService{
@Autowired
private UserDao userDao;
public List<User> findAll(){
//4.调用方法
userDao.findAll();
}
}
第一步:SqlSessionFactoryBuilder -加载配置文件【mybatis-config.xml】-> SqlSessionFactory --> SqlSession
如何在Spring中得到SqlSession对象?
让Spring管理创建SqlSessionFactory对象 从而就可以获取到SqlSession对象了
第二步:使用SqlSession对象根据dao接口获取代理对象
如何通过SqlSession对象根据dao接口得到代理对象?
让Spring扫描dao接口所在的包,从而得到dao接口代理对象放入到IOC容器中管理
第三步:调用方法
AOP:面向切面编程
作用:在不改变方法源代码的基础上为方法增加新的功能,对方法进行增强。
底层实现:动态代理 增强
目标对象 --增强功能 -->增强后的代理对象
UserServiceImpl:
public void add(){
system.out.print("打印日志");
"..."
}
public void update(){
system.out.print("打印日志");
"..."
}
public void delete(){
system.out.print("打印日志");
"..."
}
public void select(){
system.out.print("打印日志");
"..."
}
...
数据库事务 :事务管理应该在dao层 因为Service层表示进行业务功能处理,往往一个业务功能处理包含多个数据库操作
想将多个数据库操作作为一个整体执行,就需要添加事务,刚好Spring主要用在Service层,
所以,在Spring中就为我们提供了事务的管理策略。
Spring 事务管理:声明式事务
转账业务:
service:
public void transfer(){
//1.获取connection对象 开启事务
conn.setAutoCommit(false);
try{
//调用dao 钱减少
kouqian();
//调用dao 钱增加
jiaqian();
//2.1:执行成功
conn.commit();
}catch(){
//2.2:执行出现异常
conn.rollback();
}
}
dao:
public int kouqian(){
...
}
public int jiaqian(){...}
public void m1(){
m2();
}
public void m2(){
...
}