Spring中的控制反转(IoC)和面向切面编程(AOP)详解

一、Spring是什么

Spring是一个开源框架,是为了解决企业应用开发的复杂性而创建的。这个框架的主要优势之一就是其分层架构,允许用户选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。

1、Spring核心功能

Spring的核心是 控制反转(IoC)面向切面编程(AOP)

  • 控制反转是一种通过描述(在XML或注解中)并通过第三方(Spring)去产生或获取特定对象的方式。
  • 面向切面编程允许程序员定义横切关注点,并将它们插入到应用程序代码中。

此外,Spring还提供了丰富的功能,包括数据访问对象(DAO)支持、事务管理、JNDI查找、EJB集成、邮件服务、远程方法调用(RMI)、定时任务等。这些功能使得Spring成为了一个功能强大的框架,能够简化企业应用开发的流程,提高开发效率。

2、Spring框架

在Spring框架中,“框架”是一个核心概念,它指的是一种基于基础技术之上,从众多业务中抽取出的通用解决方案。

框架是一个半成品软件,使用框架规定的语法开发可以提高开发效率,使开发者能够用简单的代码完成复杂的基础业务。框架内部使用大量的设计模式、算法、底层代码操作技术,如反射、内省、xml解析、注解解析等。

框架的主要作用之一就是简化开发,使开发者可以将精力更多地投入到纯业务开发上,而不需要过多关注技术实现和一些辅助业务。此外,框架通常具备扩展性,允许开发者根据需要进行定制和扩展。

在Spring框架中,框架的作用体现在多个方面,如提供了功能强大的控制反转(IoC)和面向切面编程(AOP)功能,解决了开发者在JavaEE开发中遇到的许多常见问题。通过Spring框架,开发者可以更加高效地创建和管理对象,减少自行创建对象的繁琐工作,并通过Spring窗口获取对象,甚至获取到的对象的某些属性已经被注入了指定的值。

二、控制反转(IoC)

在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念。它改变了传统上由程序代码直接操控对象调用的方式,将对象的调用权交给容器(Spring IoC容器),通过容器来实现对象组件的装配和管理。目的就是减少对代码的改动, 实现不同的功能,实现解耦合。

IoC意味着将原本由代码直接操控的对象的调用权交给第三方(在Spring框架中就是IoC容器)来控制,用以解耦和降低代码之间的耦合度。通过使用IoC,不再需要手动创建对象并管理它们之间的依赖关系,而是由IoC容器来负责创建、配置和管理这些对象。

Spring IoC容器负责创建对象,管理对象之间的依赖关系,并在对象的生命周期内提供各种服务。这使得程序猿可以将更多的精力放在业务逻辑的实现上,而不需要过多关注对象创建和管理等底层细节。

1、IoC的优点

  • 解耦:IoC降低了代码之间的耦合度,使得各个组件之间的依赖关系更加清晰和灵活。
  • 易于测试:由于依赖关系由容器管理,可以更容易地替换依赖的组件,方便进行单元测试或集成测试。
  • 可扩展性:IoC容器支持动态地添加、删除或替换组件,使得应用程序更加灵活和可扩展。

在Spring中,IoC的实现方式通常是通过配置文件(如XML文件)或注解来定义Bean(Spring中的对象)及其依赖关系,然后由Spring IoC容器负责创建和注入这些Bean。

这样,只需要关注业务逻辑的实现,而不需要关心对象的创建和管理等底层细节。即把对象的创建,赋值,管理工作都交给代码之外的容器实现,就是对象的创建是由其它外部资源完成。

  • 反转: 把开发人员管理,创建对象的权限转移给代码之外的容器实现。由容器代替开发人员管理对象,创建对象,给属性赋值。
  • 正转:由开发人员在代码中,使用new构造方法创建对象, 开发人员主动管理对象。

2、Java中创建对象的方式

  • 构造方法
  • new Student()
  • 反射
  • 序列化
  • 克隆
  • IoC容器创建对象
  • 动态代理

2.1、Spring创建对象的步骤

  • 创建maven项目。
  • 加入maven的依赖:Spring的依赖,版本5.2.5版本,junit依赖。
  • 创建类(接口和它的实现类),和没有使用框架一样,就是普通的类。
  • 创建Spring需要使用的配置文件。
  • 声明类的信息,这些类由Spring创建和管理,通过Spring的语法完成属性的赋值。
  • 使用容器中的对象,通过 ApplicationContext 接口和它的实现类 ClassPathXmlApplicationContext 的方法getBean()
  • 测试Spring创建的对象。

注意:

  • Spring默认创建对象的时间:在创建Spring的容器时,会默认创建所有对象。
  • Spring创建对象,默认的是无参数构造方法。
  • Spring创建对象语句 SomeService someService = new SomeServiceImpl();
  • Spring把创建好的对象放入到map中,Spring框架有一个map的负责存放对象,springMap.put(id的值,对象);
  • 例如:springMap.put("someService", new SomeService());

2.2、IoC创建对象的实例(servlet)

  • 创建类继承HttpServelt,并在 web.xml 注册servlet,注册示例:
<servlet-name> myservlet </servlet-name>
<servelt-class>com.qdwa.controller.MyServlet1</servlet-class>
  • 没有创建 Servlet对象,没有 MyServlet myservlet = new MyServlet();
  • Servlet是Tomcat服务器它能你创建的,Tomcat也称为容器
  • Tomcat作为容器:里面存放的有Servlet对象, Listener , Filter对象

3、Spring框架中的依赖注入(DI)

在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种实现控制反转(IoC)的具体技术。其原理是将对象所依赖的组件(即它所需要的对象)由外部容器(如Spring IoC容器)负责创建和注入,而不是由对象本身负责查找或创建。意思就是创建对象,给属性赋值,注入就是赋值的意思。

依赖注入通过在对象的构造函数、属性或方法中注入所依赖的对象,而不是在对象内部创建或获取依赖对象。这样,对象的依赖关系由外部容器来管理,对象只需要关注自身的核心功能,而不需要关心如何获取依赖对象。

依赖注入的主要目的是实现控制反转,即将对象的创建、组装和依赖关系的管理交给外部容器来负责。 这种方式有助于解耦组件之间的依赖关系,提高代码的灵活性、可维护性和可测试性。

在Spring中,依赖注入通常是通过配置文件(如XML文件)或注解来实现的。程序猿可以在配置文件中 定义Bean及其依赖关系 ,或者通过 注解 在Java代码中指定依赖关系。然后,Spring IoC容器会根据这些配置或注解自动创建和管理对象及其依赖关系,将它们注入到需要的地方。

通过使用依赖注入,代码会更加清晰、可读性更高,并且更易于单元测试和扩展。因为对象之间的依赖关系是通过外部容器来管理的,所以可以更容易地替换或修改依赖组件,以适应不同的需求或场景。

DI的实现语法有两种:

  • 在Spring的配置文件中,使用标签和属性完成,叫做基于XML的DI实现。
  • 在Spring中的注解,完成属性赋值,叫做基于注解的DI实现

3.1、设置方法注入(set方法)

在Spring框架中,set设置方法注入(Setter Injection)是另一种依赖注入的方式。set方法注入是通过调用Bean的setter方法来注入依赖对象。这种方式允许Bean在创建之后、调用setter方法之前进行其他初始化操作,同时依赖对象也可以是可选的。

3.1.1、示例

首先,我们定义两个简单的类:MessageServiceMessagePrinterMessagePrinter 类依赖于 MessageService 类,并通过setter方法注入。

// MessageService.java  
public class MessageService {
   
     
    private String message;  
  
    public void setMessage(String message) {
   
     
        this.message = message;  
    }  
  
    public String getMessage() {
   
     
        return message;  
    }  
}  
  
// MessagePrinter.java  
public class MessagePrinter {
   
     
    private MessageService messageService;  
  
    // 使用setter方法注入MessageService  
    public void setMessageService(MessageService messageService) {
   
     
        this.messageService = messageService;  
    }  
  
    public void printMessage() {
   
     
        System.out.println("Printing message: " + messageService.getMessage());  
    }  
}

接下来,需要在Spring的配置文件中定义这两个Bean,并配置set方法注入。

<!-- applicationContext.xml -->  
<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">  
  
    <!-- 定义MessageService Bean -->  
    <bean id="messageService" class="com.example.MessageService">  
        <property name="message" value="Hello, Spring!"/>  
    </bean>  
  
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值