Spring学习笔记(一) IoC基础

Spring Framework

Spring4.x的框架图如下所示,Spring5系列官网没有给出框架图,默认和4框架基本一致。不过截止2023年2月已经出了Spring6了。

image-20230227134345423

核心概念

IoC思想

Inversion of control,控制反转,主要是为了解决代码耦合度高的问题:使用对象时不直接new对象,而是由外部(即spring框架)提供对象。这样有代码改动时就不需要再重新编译运行部署。IoC只是一种思想,spring对IoC思想进行了具体实现,提供了一个IoC容器。

IoC容器负责对象的创建、初始化等,被创建或管理的对象在IoC容器中称为Bean。

IoC入门案例

步骤:

1.创建maven项目

2.添加Spring依赖的jar包

 <!--pom.xml-->
 <!--spring-context提供了扩展的应用程序上下文,用于在Spring应用中管理Bean的生命周期、处理事件和配置元数据等-->
 <dependencies>    
     <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-context</artifactId>
         <version>5.2.10.RELEASE</version>
     </dependency>
 </dependencies>

3.添加案例中需要的类

 public interface BookDao {
     public void save();
 }
 public class BookDaoImpl implements BookDao {
     public void save() {
         System.out.println("book dao save ...");
    }
 }
 public interface BookService {
     public void save();
 }
 public class BookServiceImpl implements BookService {
     private BookDao bookDao = new BookDaoImpl();
     public void save() {
         System.out.println("book service save ...");
         bookDao.save();
    }
 }

4.添加Spring配置文件:

File->New->XML Configuration File->Spring Config (这一步需要先在pom.xml中添加Spring依赖,否则没有Spring Config选项)

5.配置文件中完成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
    id属性标示给bean起名字
    class属性表示给bean定义类型
  -->
  <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
     <bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"/>
 ​
 </beans>

6.获取IoC容器

使用Spring提供的接口完成IoC容器的创建

 public class App {
     public static void main(String[] args) {
         //获取IOC容器
         //Spring提供了两种方法获取IoC容器,一种是ClassPathXmlApplicationContext,另一种是FileSystemXmlApplicationContext
  ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
 }

tips:获取IoC容器的两种方式区别在于:

ClassPathXmlApplicationContext:采用的是类路径,不需要前缀,默认就是指项目的classpath路径;FileSystemXmlApplicationContext:采用的是文件系统的路径,默认指项目的根路径。此时参数要写xml的绝对路径。

image-20230227195930677

7.从容器中获取对象并进行方法调用

 //getBean通过id或name获取容器中的Bean对象
 BookDao bookDao = (BookDao)ctx.getBean("bookDao");
 bookDao.save();

DI

Dependency Injection,依赖注入,DI就是IoC思想的具体实现,在IoC容器中建立bean与bean之间的依赖关系。

例如:在原始的java项目中,一个对象A里如果要用到另一个对象B,则需要在该对象A中new出另一个对象B。而DI避免了new造成的高耦合,不需要使用new的方式,而是设置接口后直接在xml文件中通过依赖注入绑定两个对象(即bean)的关系。代码表述如下:

原始方式:

 //原始方式
 public class BookServiceImpl implements BookService {
  //通过new的方式引用对象,若BookDaoImpl()修改了,则这里需要联动修改,耦合性较高
     private BookDao bookDao = new BookDaoImpl();
     @Override
     public void save() {
         System.out.println("book service save...");
         bookDao.save();
    }
 }

DI注入方式:

 //DI注入
 public class BookServiceImpl implements BookService {
  //5.spring删除了业务层中使用new的方式创建的dao对象,不直接创建对象,而是提供set接口,并在xml文件中进行依赖注入
     private BookDao bookDao;
     @Override
     public void save() {
         System.out.println("book service save...");
         bookDao.save();
    }
 ​
     //6.提供对应的set方法,区别于5
     public void setBookDao(BookDao bookDao) {
         this.bookDao = bookDao;
    }
 }

applicationContext.xml文件

 <bean id="bookDao" class="com.yuan.dao.impl.BookDaoImpl"/>
 <bean id="bookService" class="com.yuan.service.impl.BookServiceImpl">
     <!--7.配置service和dao的关系,即依赖注入模块-->
     <property name="bookDao" ref="bookDao"/>
 </bean>

注意:applicationContext.xml文件中的property其实就是通过bookService里的set方法为bookDao属性赋值的,所以必须要提供set接口。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注