Spring Dependency

我们知道Spring的最重要的核心是Ioc,有时候也被称为DI(Dependency Injection,依赖注入),那么关于Dependency,你了解多少呢?


img_0ed51855f593c35740644d8a3fdbad05.png
注入

之前我们有提到IOC和DI的关系与概念,我是把它们区分开了,所以才有了这篇文章。Ioc更像是一个概念,而DI是一个过程,对象定义它们的依赖,一般是依赖其它的对象,容器在创建对象的时候,检查对象的依赖并且注入它们。

Spring中主要有两种注入方式:

  • 构造器注入
  • setter注入,我觉得field注入也是setter注入的一种

构造器注入

当容器在通过反射实例化某个对象的时候,通过构造器的参数把依赖传给实例化的对象。

@Component
public class Car {
    private final Circle circle;

    //通过构造器,以便容器能把依赖注入到Car中
    @Autowired
    public Car(Circle circle) {
        this.circle = circle;
    }
}

Setter注入

setter注入一般是容器在调用构造对象之后,调用对象的setter方法。

写法1:写在set方法上显得很奇怪。

@Component
public class Car {
    

    private  Circle circle;

    // 通过set方法注入依赖
    @Autowired
    public void setCircle(Circle circle) {
        this.circle = circle;
    }

    public Car() {
    }

}

写法2:

@Component
public class Car {

    // 写在field上面,显得清爽很多,这种写法可以不用加上set方法,但还是建议加上,加上不会让代码变得多难看,但是setter注入的优势可以略提现处理。
    @Autowired
    private  Circle circle;

    
    public void setCircle(Circle circle) {
        this.circle = circle;
    }

    public Car() {
    }

}

构造器注入与Setter注入的对比

构造器注入:

  • 依赖不可变,一般依赖会写成final类型的
  • 依赖不会为空,否则无法实例化,使用set注入一般要检查NPE。
  • 保证客户端在初始化之后,是完全初始化的状态。

setter注入:

  • 依赖可变,因为依赖是在对象实例化之后set的。更加灵活
  • 代码写的更少
  • 可以用于可选的依赖关系。

注入的类型

直接 类型

Primitives(short,int,float,double,long,boolen,byte,char),String,等类型
Spring的Conversation Service负责把字符串类型转换为具体需要的类型。

    <bean id="hello" class="me.aihe.HelloWordImpl2">
       <property name="str" value="hello" />
        <property name="bol" value="true" />
        <property name="intValue" value="10" />
    </bean>
集合类型

[图片上传失败...(image-700f20-1526803446490)]

    <bean id="moreComplexObject"
          class="me.aihe.ComplexObject"> 
        <!-- Properties -->  
        <property name="adminEmails">
            <props>
                <prop key="administrator">administrator@example.org</prop>
                <prop key="support">support@example.org</prop>
                <prop key="development">development@example.org</prop>
            </props>
        </property> 
        <!-- (java.util.List)  -->
        <property name="someList">
            <list>
                <value>a list element followed by a reference</value>
                <value>List conten2</value>
            </list>
        </property> 
        <!-- (java.util.Map)  -->
        <property name="someMap">
            <map>
                <entry key="an entry" value="just some string"/>
            </map>
        </property> 
        <!--(java.util.Set) -->
        <property name="someSet">
            <set>
                <value>just some string</value>
                <value>set2</value>
            </set>
        </property>
    </bean>
注入其它的bean

使用ref

<property name="complex" ref="moreComplexObject" />

小结

这篇文章又提了下DI,然后列了几种常见的注入类型,给了一些简单的配置在注入不同类型的值时。

### Spring Framework 使用指南 #### 1. Spring框架简介 Spring 是一个轻量级的 Java 开发框架,旨在简化企业应用开发过程。它通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP),提供了一种灵活的方式来管理应用程序中的复杂性[^1]。 #### 2. 核心模块介绍 Spring 框架由多个核心模块组成,这些模块共同构成了完整的开发环境: - **Core Container**: 提供了控制反转(IoC)、依赖注入等功能的核心容器。 - **Data Access/Integration**: 支持 JDBC、ORM、JMS 和事务管理等数据访问技术。 - **Web**: 包括 Web 应用程序支持的功能,如 Servlet 容器集成、MVC 实现以及 WebSocket 支持。 - **Security**: 集成了身份验证和授权机制,保护应用程序的安全性[^2]。 #### 3. 创建第一个 Spring 应用 要创建基于 Spring 的项目,可以按照以下方式配置基本结构: ##### Maven 依赖引入 在 `pom.xml` 文件中添加必要的 Spring Boot Starter 依赖项: ```xml <dependencies> <!-- Core Spring dependency --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.10</version> </dependency> <!-- Optional: For web applications --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> ``` ##### 编写 Service 组件 定义服务层逻辑时,可以通过标注 `@Service` 注解来声明组件类。例如: ```java import org.springframework.stereotype.Service; @Service public class XxxService { public String performTask() { return "Task executed successfully!"; } } ``` 上述代码展示了如何定义一个简单的服务组件,并将其注册到 Spring 容器中[^3]。 #### 4. 测试与运行 为了测试 Spring 应用程序的行为,推荐使用 JUnit 结合 Spring Test 工具包完成单元测试工作流。下面是一个典型的测试案例实现方法: ```java import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @ContextConfiguration(classes = ApplicationConfig.class) public class XxxServiceTest { @Autowired private XxxService xxxService; @Test public void testPerformTask() { assertNotNull(xxxService.performTask()); } } ``` 这里利用了继承自 `SpringJUnit4ClassRunner` 的定制化测试执行者 `SpringRunner` 来加载上下文并初始化 Bean 实例。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值