Spring知识回顾

次花椒的喵酱 / 2024-03-08 / 原文

首先对于我们来说Spring是什么,Spring可以让我们对刚开始写项目时,有一个明确的框架结构,用比较专业的话来讲,就是使用IOC和AOP,即Inversion of control控制反转和Aspect Oriented Programming面向切面编程,总结:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架。

学习IOC的组成结构:

  1. Dao 接口
  2. DaoImpl 接口实现类
  3. service 业务接口
  4. ServiceImpl 业务实现类

使用IOC的好处在,对象的创建本来由程序自己控制,后面变成了交给用户来自己控制

他是一种编程思想,由主动的编程变成被动的接收

private UserDao userDao;
//利用set进行动态实现值的注入
public void setUserDao(UserDao userDao){
    this.userDao = userDao;
}

接下来看一个实例:

//服务类
public
interface MessageService { void sendMessage(String message); } //服务接口类 public class EmailService implements MessageService { @Override public void sendMessage(String message) { System.out.println("Email sent: " + message); } }

原本的传统编程代码

public class MyApplication {
    public static void main(String[] args) {
        MessageService service = new EmailService();
        service.sendMessage("Hello, world!");
    }
}

现在使用Spring的IOC容器来管理对象的创建和依赖关系

首先声明EmailService的bean

<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 id="messageService" class="com.example.EmailService" />

</beans>

然后,我们就可以使用Spring的IOC容器来获取EmailService对象,并调用其方法

public class MyApplication {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        MessageService service = (MessageService) context.getBean("messageService");
        service.sendMessage("Hello, world!");
    }
}

MyApplication 类不再负责直接创建 EmailService 对象,而是通过 Spring 的 IOC 容器通过bean来获取对象。通过这种方式,对象的创建和依赖关系被外部容器管理,实现了IOC控制反转。如果以后要更改使用的消息服务,只需要修改 Spring 配置XML文件,而不需要修改 MyApplication 类的代码,实现解耦合

但是我们一般直接使用@Configuration@Bean 注解来替代 XML 配置文件。

@Configuration 注解用于标识一个 Java 类为 Spring 的配置类,而 @Bean 注解用于声明一个方法为一个 Spring 管理的 bean。

接下来看看使用注解的例子:

@Configuration
public class AppConfig {

    @Bean
    public UserService userService() {
        return new UserService(userDao());
    }

    @Bean
    public UserDao userDao() {
        return new UserDao();
    }
}
  1. @Configuration 注解告诉 Spring 这个类是一个配置类,Spring 将会在启动时读取这个类,并根据其中的配置来创建和管理 bean。

  2. @Bean 注解告诉 Spring 这个方法将返回一个 bean,并且这个 bean 将会被 Spring 管理。在 AppConfig 类中,我们声明了两个方法并用 @Bean 注解标记它们,分别是 userService()userDao()

    • userService() 方法返回一个 UserService 对象,并且这个对象需要一个 UserDao 对象作为构造函数的参数。Spring 将会自动调用 userDao() 方法来获取 UserDao 对象,并传递给 UserService 的构造函数,从而创建 UserService 的实例。

    • userDao() 方法返回一个 UserDao 对象。因为我们在 userService() 方法中引用了 userDao() 方法,Spring 将会先创建 UserDao 的 bean,然后再创建 UserService 的 bean,确保 UserService 能够获取到正确的 UserDao 实例。

优点:

  1. 松耦合和可维护性:使用 @Configuration@Bean 注解可以将应用程序的配置信息集中在一个或多个配置类中,而不是分散在多个 XML 文件中。这样做可以使得应用程序的组件之间的依赖关系更加清晰,代码结构更加模块化,易于理解和维护。

  2. 依赖注入:Spring 框架提供了强大的依赖注入机制,可以自动将依赖的对象注入到需要的地方。在上面的例子中,UserService 类需要一个 UserDao 对象来执行数据库操作,通过 @Bean 注解声明 UserDao 的 bean,Spring 将会自动创建 UserDao 的实例,并将它注入到 UserService 中。这种依赖注入的方式可以减少代码的耦合度,使得组件之间的关系更加灵活。