学习大纲
-
IOC基础容器
-
AOP切面编程
-
Spring整合web环境
-
Spring MVC
JavaWeb到Spring概述
-
传统javaweb开发缺点
-
//账户信息修改业务方法 public void updateUserInfo(User user){ try { DaoUtils.openTransaction();//开启事务 UserDao userDao = new UserDaoImpl();//获得UserDao执行插入user数据到数据库操作 userDao.updateUserInfo(user); UserLog userLog = new UserLogImpl();//修改成功后,向用户行为日志表插入一条数据,内容:修改时间等信息 userLog.recodeUserUpdate(user); DaoUtils.commit();//提交事务 }catch (Exception e) { DaoUtils.rollback();//回滚事务 ExceptionLog exceptionLog = new ExceptionLogImpl();//向异常事务表中插入数据 exceptionLog.recodeException(this,e); } }
-
UserDao userDao = new UserDaoImpl(); UserLog userLog = new UserLogImpl(); ExceptionLog exceptionLog = new ExceptionLogImpl();
以上代码中都需要系统运作时由系统new三个对象,使得耦合性比较高
(例如,当UserDaoImpl实现切换实现接口UserDaoImpl时则需要修改源码)
解决思路:程序代码中无需手动new对象,而是通过第三方根据要求为程序提供所需的Bean对象
-
DaoUtils.openTransaction(); UserLog userLog = new UserLogImpl(); userLog.recodeUserUpdate(user); DaoUtils.commit(); DaoUtils.rollback(); ExceptionLog exceptionLog = new ExceptionLogImpl(); exceptionLog.recodeException(this,e);
通用事务功能与通用日志功能严重耦合在业务代码中
解决思路:程序代码中无需手动new对象,而是通过第三方根据要求为程序提供所需的Bean对象的
代理对象
-
-
-
IoC、DI、AOP思想
-
IoC(控制反转思想)
-
原先:需要什么对象就在代码中手动new
-
控制反转:将new对象的权力反转给第三方
-
-
DI(依赖注入思想)
例子:Bean1的内部需要设置Bean2才可以达到目标效果
-
原先:程序代码分别从第三方获取Bean1、Bean2,再写一段代码将Bean2设置到Bean1
-
依赖注入:第三方在创建Bean1的过程中就创建Bean2并自动设置给Bean1
-
-
AOP(面向切面思想)
面向对象编程:纵向设计
面向切面编程:横向抽取
- 主要实现方式:Proxy(代理)
-
-
Spring Framework 基础介绍
-
技术栈:
-
第一层(最底层,以下所有技术都以上一层为地基):
- Test : 单元测试与集成测试
-
第二层:
-
Core Container:核心容器
-
Beans
-
Core
-
Context
-
SpEL
-
-
-
第三层:
-
AOP:面向切面编程
-
Aspects:AOP思想实现
-
Instrumentation
-
Messaging
-
-
第四层
-
Data Access/Data Integration:数据访问/数据集成
-
JDBC
-
ORM
-
OXM
-
JMS
-
Transactions
-
-
Web
-
WebSocket
-
Servlet
-
Web
-
Portlet
-
-
-
-
-
基于xml的Spring应用
-
基于注解的Spring应用
BeanFactory解析
开发步骤:
flowchart TB
A(程序代码)-->B(第三方)
B-->C(配置清单)
C-->D(Bean类)
C-->E(Bean类)
-
导入Spring的jar包/Maven坐标
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.25</version> </dependency>
-
定义接口以及其实现类(Beans)
-
创建xml配置文件,并配置Bean类信息
创建XML Configuration File->Spring Config
<bean id="userService" class="com.xiaowan.Impl.UserServiceImpl"/>
测试代码:创建BeanFactory,加载配置文件,获取UserService对象
//创建工厂对象 DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); //创建读取器(读取xml文件) XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory); //读取配置文件给工厂 reader.loadBeanDefinitions("beans.xml"); //根据id获取Bean对象 UserService userService = (UserService) beanFactory.getBean("userService");
成功实现控制反转
以下实现依赖注入
传统情况下:
UserServiceImpl需要调用UserDao启动,则:
配置Bean类信息:
<bean id="userService" class="com.xiaowan.service.Impl.UserServiceImpl"></bean>
<bean id="userDao" class="com.xiaowan.dao.impl.UserDaoImpl"/>
手动实例化两个Bean然后将userDao配置给userService
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("beans.xml");
UserService userService = (UserService) beanFactory.getBean("userService");
UserDao userDao = (UserDao) beanFactory.getBean("userDao");
实现依赖注入:
配置清单
<bean id="userService" class="com.xiaowan.service.Impl.UserServiceImpl">
<property name="userDao" ref="userDao">
</property>
</bean>
<bean id="userDao" class="com.xiaowan.dao.impl.UserDaoImpl"/>
property中
name:com.xiaowan.service.Impl.UserServiceImpl的userDao对象
ref:清单中的类
在userServiceImpl中编写方法
public class UserServiceImpl implements UserService {
private UserDao userDao;
//BeanFactory去调用本方法,从容器中获取userDao设置到此处
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
System.out.println("BeanFactory调用方法:"+userDao);
}
}
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("beans.xml");
UserService userService = (UserService) beanFactory.getBean("userService");
成功实现userService的实例
BeanFactory开发中很少直接使用的,BeanFactory更多的是作为核心底层
ApplicationContext
Spring容器,内部封装了BeanFactory
使用:
创建配置清单 ApplictionContext.xml
测试使用:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ApplictionContext.xml");
UserService userService =(UserService) applicationContext.getBean("userService");
BeanFactory和 ApplicationContext的关系
-
BeanFactory(Bean工厂):
-
Spring的早期接口
-
API偏向于底层
-
封装着Bean创建的主要逻辑和功能
-
Bean的初始化时机:首次调用getBean时创建Bean
-
-
ApplicationContext(Spring容器):
-
Spring的后期高级接口
-
对BeanFactory的API进一步封装
-
继承BeanFactory并且维护BeanFactory的引用,BeanFactory与ApplicationContext关系:继承与融合
-
Bean的初始化时机:配置文件加载,容器创建成功之时实例化Bean并初始化
-
仅仅在spring-context基础环境下的继承关系
实现类 | 功能描述 |
---|---|
ClassPathXmlApplicationContext | 加载类路径下xml配置的ApplicationContext |
FileSystemXmlApplicationContext | 加载磁盘路径下的xml配置的ApplicationContext |
AnnotationConfigApplicationContext | 加载注解配置类的ApplicationContext |