Spring Framework系统架构

IoC(Inversion of Control)控制反转
- 使用对象时,由主动 new 产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转
Spring 技术对 IoC 思想进行了实现
- Spring 提供了一个容器,称为 IoC 容器,用来充当 IoC 思想中的 “外部”
- IoC 容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在 IoC 容器中统称为 Bean
DI(Dependency Injection)依赖注入
- 在容器中建立 bean 与 bean 之间的依赖关系的整个过程,称为依赖注入
业务层实现
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void save() {
bookDao.save();
}
}
依赖 dao 对象运行
数据层实现
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
}
在IoC容器中,service依赖dao
目标:充分解耦
- 使用 IoC 容器管理 bean(IoC)
- 在 IoC 容器内将有依赖关系的 bean 进行关系绑定(DI)
最终效果
- 使用对象时不仅可以直接从 IoC 容器中获取,并且获取到的 bean 已经绑定了所有的依赖关系
maven坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
XML版IOC
在xml中单独定义bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"></bean>
</beans>
注意事项
- bean 定义时 id 属性在同一个上下文中不能重复
初始化 IoC 容器(Spring 核心容器 / Spring 容器),通过容器获取 bean
public class App {
public static void main(String[] args) {
//加载配置文件得到上下文对象,也就是容器对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取资源
BookService bookService = (BookService) ctx.getBean("bookService");
bookService.save();
}
}
提供依赖对象对应的 setter 方法
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void save() {
bookDao.save();
}
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}

bean的基础配置

bean的别名配置

作用范围配置

实例化 bean 的三种方式
构造方法(常用)
要求:提供可访问的构造方法
public class BookDaoImpl implements BookDao {
public BookDaoImpl() {
System.out.println("book constructor is running ...");
}
public void save() {
System.out.println("book dao save ...");
}
}
配置示例:
<bean
id="bookDao"
class="com.itheima.dao.impl.BookDaoImpl"
/>
- 注意:无参构造方法如果不存在,将抛出异常
BeanCreationException
静态工厂(了解)
静态工厂类:
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
return new OrderDaoImpl();
}
}
配置示例:
<bean
id="orderDao"
factory-method="getOrderDao"
class="com.itheima.factory.OrderDaoFactory"
/>
实例工厂(了解)
实例工厂类:
public class UserDaoFactory {
public UserDao getUserDao(){
return new UserDaoImpl();
}
}
配置说明:
<!-- 配置实例工厂的bean -->
<bean id="userDaoFactory" class="com.itheima.factory.UserDaoFactory"/>
<!-- 通过实例工厂创建目标bean -->
<bean
id="userDao"
factory-method="getUserDao" <!-- 工厂方法名(不固定,每次需配置) -->
factory-bean="userDaoFactory" <!-- 关联实例工厂的bean(配合使用) -->
/>
第二种方法
FactoryBean 实现类:
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
public Class<?> getObjectType() {
return UserDao.class;
}
}
配置示例:
<bean
id="userDao"
class="com.itheima.factory.UserDaoFactoryBean"
/>
962

被折叠的 条评论
为什么被折叠?



