零、核心
参考视频:黑马程序员SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术
一、核心容器
1. 概念
IoC控制反转:将对象的创建和管理责任从调用者转移到外部框架或容器。简单来说,就是你不再需要自己创建对象,而是让一个“大管家”(
举个通俗的例子,想象一下你去一家餐厅吃饭:
- 传统方式(没有IoC):你走进餐厅,自己点菜,然后自己去厨房找厨师做,最后自己端菜上桌。这个过程中,你不仅需要点菜,还要负责整个烹饪和上菜的过程。
- IoC方式:你走进餐厅,服务员(IoC容器)会帮你点菜,然后厨师(由IoC容器管理的对象)会做菜,最后服务员会把做好的菜端到你面前。在这个过程中,你不需要关心菜是怎么做的,只需要享受美食。
通过IoC,你的代码变得更简洁,因为你不直接创建对象,而是依赖于外部容器来提供这些对象。这样做的好处是:
- 解耦:你的代码与对象的创建和管理解耦,使得代码更灵活,更容易维护和测试。
- 可扩展性:当需要更换或添加新的对象时,你不需要修改现有代码,只需要在IoC容器中进行配置即可。
- 集中管理:所有的对象创建和依赖关系都在一个地方管理,便于集中配置和监控。
DI依赖注入:是实现控制反转(IoC)的一种技术。它是一种设计模式,用于减少代码之间的耦合度,让对象之间的依赖关系更加灵活和可管理。
- 在容器中简历bean与bean之间的依赖关系的整个过程,称为依赖注入
1.0 基础源码
com.getshell -> APP.java
package com.getshell;
import com.getshell.service.BookService;
import com.getshell.service.impl.BookServiceImpl;
public class APP {
public static void main(String[] args) {
BookService bookService = new BookServiceImpl();
bookService.save();
}
}
com.getshell.dao -> BookDao.java
package com.getshell.dao;
public interface BookDao {
void save();
}
com.getshell.dao.impl -> BookDaoImpl.java
package com.getshell.dao.impl;
import com.getshell.dao.BookDao;
public class BookDaoImpl implements BookDao {
@Override
public void save() {
System.out.println("book dao save ...");
}
}
com.getshell.service -> BookSerivce.java
package com.getshell.service;
public interface BookService {
void save();
}
com.getshell.service.impl -> BookServiceImpl.java
package com.getshell.service.impl;
import com.getshell.dao.impl.BookDaoImpl;
import com.getshell.dao.BookDao;
import com.getshell.service.BookService;
public class BookServiceImpl implements BookService {
private BookDao bookDao = new BookDaoImpl();
public void save(){
System.out.println("book service save ...");
bookDao.save();
}
}
1.1 Ioc入门案例
在pom.xml
导入Spring-context依赖包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.2.0</version>
</dependency>
</dependencies>
在resources
中创建Spring配置文件applicationContext.xml
,在文件中配置bean
- bean标签标识配置bean
- id表示给bean起名字
- class属性表述给bean定义类型
<bean id="bookDao" class="com.getshell.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.getshell.service.impl.BookServiceImpl" />
创建APP2
的类,在里面使用bean进行重写
package com.getshell;
import com.getshell.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class APP2 {
public static void main(String[] args) {
//获取Ioc容器
ApplicationContext bookservice = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean
bookservice.getBean("bookService");
//将获取到的东西进行类型转换
BookService bookService = (BookService) bookservice.getBean("bookService");
bookService.save();
}
}
1.2 DI入门案例
重写Service层实现类:删除new关键字,提供对应容器使用赋值的set方法
package com.getshell.service.impl;
import com.getshell.dao.BookDao;
import com.getshell.service.BookService;
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void save(){
System.out.println("book service save ...");
bookDao.save();
}
// 提供对应的set方法
// spring容器往里面传入对象
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
继续修改Spring配置文件 ,配置bean属性中的参数,bookService依赖于bookDao,bookService中的对象属性bookDao
参照 id为bookDao的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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置bean -->
<!-- bean标签标识配置bean-->
<!-- id表示给bean起名字-->
<!-- class属性表述给bean定义类型-->
<bean id="bookDao" class="com.getshell.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.getshell.service.impl.BookServiceImpl" >
<!-- property标签标识配置当前bean的属性 name表示配置哪一个具体的属性 ref属性表示参照哪一个bean -->
<property name="bookDao" ref="bookDao"/>
</bean>
</beans>
1.3 bean基础配置
1.4 bean的实例化
- bean的本质上就是对象,创建bean使用构造方法完成
Spring创建对象时,用的是无参构造方法,私有的构造方法依旧能够调用
若此时将无参构造方法变为有参,则会报错,一般Spring报错从最后看
public class BookDaoImpl implements BookDao {
private BookDaoImpl() {
System.out.println("book dao constructor running ...");
}
@Override
public void save() {
System.out.println("book save ...");
}
}
public class AppForScope {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
}
}
1.5 bean生命周期
- bean生命周期:bean从创建到销毁的整体过程
- bean生命周期的控制:bean创建后到销毁前做一些事情
在bean中写入两个方法:初始化init()
和销毁方法deStory()
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public void save(){
System.out.println("book service save ...");
bookDao.save();
}
// 提供对应的set方法
// spring容器往里面传入对象
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
在配置文件中配置bean:配置初始化对应的方法init-method
和 销毁对应的方法 destroy-method
<bean id="bookDao" class="com.getshell.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
销毁Spring容器有多种方法:
一、使用close()
方法
ApplicationContext
接口中无close()
方法,而ClassPathXmlApplicationContext
提供了
所以需要改写代码将 ApplicationContext
改为 ClassPathXmlApplicationContext
public class APP2 {
public static void main(String[] args) {
//获取Ioc容器
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean
ctx.getBean("bookService");
//将获取到的东西进行类型转换
BookService bookService = (BookService) ctx.getBean("bookService");
bookService.save();
ctx.close();
}
}
- 最新
- 最热
只看作者