关于Spring框架中的set注入,@Autowired,和包扫描之间内在的关系

本文深入探讨了Spring框架中依赖注入的两种方式:XML配置文件注入和@Autowired注解注入。通过实例详细讲解了如何使用<bean>标签定义Bean及通过<property>标签进行属性注入的过程,并介绍了如何利用@Autowired实现自动装配。

1.set注入,上次讲到了是对一个类中通过set方法对其之中的普通类型,引用类型和复杂类型进行注入并赋值,增强类与类之间的关系。举例:

package pojo;

public class Cat {

}

public class Dog {

}

public class User {
  private Dog dog;
  private Cat cat;

public Dog getDog() {

    return dog;
}

public void setDog(Dog dog) {
    this.dog = dog;
}

public Cat getCat() {
    return cat;
}

public void setCat(Cat cat) {
    this.cat = cat;
}

@Override
public String toString() {
    return "User [dog=" + dog + ", cat=" + cat + "]";
}
  
}
  <bean id="user" class="pojo.User">

  <property name="dog" ref="dog"></property>

<property name="cat" ref="cat"></property>

</bean>

   <bean id="dog" class="pojo.Dog"></bean>
   
   <bean id="cat" class="pojo.Cat"></bean>

在这其中可见通过<property>标签进行应用类型的注入,需要通过<bean>标签的id引入,和ref="id"标签的相配,才能找到所有引用类型的地址,bean标签相当于通过Spring容器去进行实体类的创建。 

而对于@Autowired自动装配,也需要<bean>标签的id引入才行,因为,所有的类型需要被容器扫描到才能创建出相应的地址。


import org.springframework.beans.factory.annotation.Autowired;

public class User {
  @Autowired
  private Dog dog;
  @Autowired
  private Cat cat;

@Override
public String toString() {
    return "User [dog=" + dog + ", cat=" + cat + "]";
}  
}

在这其中,@Autowired只是创建出id,类似于<bean>文件一样,但是还需要在配置文件中配置相对应的类型,因为需要进行扫描。<bean id="dog" class="pojo.Dog"></bean>      <bean id="cat" class="pojo.Cat"></bean> 此处的id值与@Autowired中所创造的id值是相匹配的private Dog dog(id);  private Cat cat(id);因为进行扫描的时候,会通过id值的相同进行自动装配与注入

如果不想在配置文件中写<bean id="dog" class="pojo.Dog"></bean>  <bean id="cat" class="pojo.Cat"></bean>这两句话,就需要在Dog类与Cat类中进行@Component注解的配置,进行包扫描,使得Spring容器启动,到对象创建都可以使得配置文件扫描到这两个类。

Spring 中,`@Autowired` 是基于注解的依赖注入的核心注解,可让容器知道为当前类注入哪些依赖,其按照类型匹配进行依赖注入,作用范围较广,能修饰属性、构造方法、普通方法参数 [^2]。以下是几种不同场景下使用 `@Autowired` 进行依赖注入的举例: #### 1. 属性注入 ```java package com.imooc.beanannotation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; // 使用 @Service 注解将该类注册为 Spring 服务组件 @Service public class InjectionServiceImpl implements InjectionService { // 使用 @Autowired 注解进行属性注入 @Autowired private InjectionDAO injectionDAO; public void save(String arg) { System.out.println("接受数据" + arg); arg = arg + ":" + this.hashCode(); injectionDAO.save(arg); } } ``` 在上述代码中,`InjectionServiceImpl` 类使用 `@Service` 注解将自身注册为 Spring 服务组件,通过 `@Autowired` 注解对 `injectionDAO` 属性进行注入,这样 `InjectionServiceImpl` 类就可以使用 `InjectionDAO` 实例的方法 [^4]。 #### 2. 构造器注入 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { private final UserRepository userRepository; // 使用 @Autowired 注解进行构造器注入 @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public void saveUser(User user) { userRepository.save(user); } } ``` 这里 `UserService` 类使用构造器注入的方式,通过 `@Autowired` 注解将 `UserRepository` 实例注入到构造器中,从而在类中可以使用 `UserRepository` 的功能。 #### 3. Setter 方法注入 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class ProductService { private ProductRepository productRepository; // 使用 @Autowired 注解进行 Setter 方法注入 @Autowired public void setProductRepository(ProductRepository productRepository) { this.productRepository = productRepository; } public void saveProduct(Product product) { productRepository.save(product); } } ``` `ProductService` 类使用 `@Autowired` 注解在 `setProductRepository` 方法上,实现了 `ProductRepository` 实例的注入。 #### 4. 方法参数注入 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class OrderService { public void processOrder(Order order, @Autowired PaymentService paymentService) { paymentService.processPayment(order.getAmount()); // 处理订单的其他逻辑 } } ``` 在 `OrderService` 的 `processOrder` 方法中,通过 `@Autowired` 注解注入 `PaymentService` 实例,在方法内部可以使用该实例进行支付处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luolvzhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值