您的当前位置:首页正文

控制反转(IOC)——Spring第一个核心思想

2024-11-30 来源:个人技术集锦

控制反转概述

        控制反转(IoC)是一种将对象的创建、组装和管理交给容器或框架来实现的编程思想。它可以减低对象之间的耦合度,提高代码的灵活性和模块化。控制反转的一种常见形式是依赖注入(DI),即对象的依赖(需要的资源)由外部实体提供,而不是由对象本身创建。控制反转也可以通过事件驱动编程或模板方法模式来实现。

控制反转实现方式

xml方式

语法

<bean id="对象名称" class="需要创建类的全限定类名"/> 

bean标签详解

id:给对象在容器中提供一个唯一标识。用于获取对象。

class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。

scope:指定对象的作用范围。

* singleton :默认值,单例的.

* prototype :多例的.

name:映射路径名称

factory-bean:工厂bean名称

factory-method:工厂方法

lazy-init:懒加载配置

* false :默认值,关闭懒加载.

* true :开启懒加载.

init-method:初始化方法

destroy-method:销毁方法

创建方式

第一种方式:使用默认无参构造函数
<!--在默认情况下: 
它会根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败。--> 
<bean id="accountService" class="com.xszx.service.impl.AccountServiceImpl"/> 
第二种方式:spring 管理静态工厂-使用静态工厂的方法创建对象
/** 
* 模拟一个静态工厂,创建业务层实现类 
*/ 
public class StaticFactory { 
public static IAccountService createAccountService(){ 
return new AccountServiceImpl(); 
} 
} 
<!-- 此种方式是: 
使用 StaticFactory 类中的静态方法 createAccountService 创建对象,并存入 spring 容器 
id 属性:指定 bean 的 id,用于从容器中获取 
class 属性:指定静态工厂的全限定类名 
factory-method 属性:指定生产对象的静态方法 
--> 
<bean id="accountService" 
class="com.xszx.factory.StaticFactory" 
factory-method="createAccountService"></bean> 
第三种方式:spring 管理实例工厂-使用实例工厂的方法创建对象
/** 
* 模拟一个实例工厂,创建业务层实现类 
* 此工厂创建对象,必须现有工厂实例对象,再调用方法 
*/ 
public class InstanceFactory { 
public IAccountService createAccountService(){ 
return new AccountServiceImpl(); 
} 
} 
<!-- 此种方式是: 
先把工厂的创建交给 spring 来管理。 
然后在使用工厂的 bean 来调用里面的方法 
factory-bean 属性:用于指定实例工厂 bean 的 id。 
factory-method 属性:用于指定实例工厂中创建对象的方法。 
--> 
<bean id="instancFactory" class="com.xszx.factory.InstanceFactory"></bean> 
<bean id="accountService" 
factory-bean="instancFactory" 
factory-method="createAccountService"></bean>

注解方式

beans.xml中追加配置

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd

<!--    开启注解驱动-->
    <context:annotation-config/>
<!--    开启组件扫描-->
    <context:component-scan base-package="com.xszx"></context:component-scan>

第一套注解(通用注解)

//等同于<bean id="userController" class="com.xszx.controller.UserController"></bean>
//如果需要指定名称,则使用@Component(value="aaa")
@Component
public class UserController{
    
}

第二套注解(个性化注解)

@Controller
public class UserController {}
@Service
public class UserServiceImpl implements UserService {}
@Repository
public class UserDaoImpl implements UserDao {}

依赖注入实现方式

        依赖注入(Dependency Injection,DI)是一种设计模式,它通过将对象之间的依赖关系的创建和维护转移到外部容器中来,以减少对象之间的紧耦合性并提高可重用性。在传统的程序设计中,对象通常通过直接创建和维护依赖关系来使用其他对象,这会导致对象之间的紧耦合性,使代码难以维护和扩展。然而,依赖注入模式将对象之间的依赖关系的创建和维护转移到外部容器中,使得对象之间的耦合性降低,并且可以方便地更改依赖项的实现类,而无需修改受影响的对象的代码。

        依赖注入通常有两种方式:设值注入和构造注入。设值注入是通过客户端类的公共属性或setter方法提供依赖性。构造注入则是通过在客户端类的构造函数中传递依赖项来实现。在Spring框架中,依赖注入是其核心特性之一,它通过Spring容器来管理对象的生命周期和依赖关系,从而实现解耦和灵活的配置。

        总的来说,依赖注入是一种有效的设计模式,它能够帮助开发者降低代码之间的耦合性,提高代码的可重用性和可维护性,是构建高质量软件的重要工具之一。

XML方式

手动注入

Set方法注入
<!--property:set方法注入
name:(需要寻找被注入方的set方法)set+name名称的首字母大写
ref:需要引用的bean标签id名称
value:简单的属性值-->
<bean id="userController" class="com.xszx.controller.UserController">
    <property name="userService" ref="userService"></property>
    <property name="age" value="12"></property>
</bean>
构造方法注入
<!--constructor-arg:构造方法注入
name:构造方法中的形参名称
ref:需要引用的bean标签id名称
value:简单的属性值
-->
<bean id="userController" class="com.xszx.controller.UserController">
    <constructor-arg name="age" value="12"></constructor-arg>
    <constructor-arg name="userService" ref="userService"></constructor-arg>
</bean>

自动注入

Set方法注入
byName注入

        通过指定名称对应被注入方的set方法名称,可以有多个类型,但是需要有一个唯一的名字与之对应

<bean id="userController" class="com.xszx.controller.UserController" autowire="byName"></bean>
byType注入

        通过注入的类型来自动匹配相关的bean,但是需要提供唯一的一个类型bean

<bean id="userController" class="com.xszx.controller.UserController" autowire="byType"></bean>
构造方法注入

        通过指定构造方法注入

<bean id="userController" class="com.xszx.controller.UserController" autowire="constructor"></bean>

注解方式

beans.xml中追加配置

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd

<!--    开启注解驱动-->
    <context:annotation-config/>
<!--    开启组件扫描-->
    <context:component-scan base-package="com.xszx"></context:component-scan>
第一套注解
//set方法上标注注解
//默认按照类型注入
//如果需要指定名称注入,追加@Qualifier(value = "bbb")
@Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
第二套注解
//默认是按照byName方式注入,如果没有匹配则通过byType注入
//如果需要指定名称注入,追加@Qualifier(value = "bbb")
//@Resource还有两个重要的属性:name和type,用来显式指定byName和byType方式注入
@Resource
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

 求赞求赞,关注一下我吧,各位大官人!!!给大家磕一个!!!

显示全文