Spring自动装配之方法、构造器位置的自动注入

目录

1. 注解定义

2. 注解使用

3. 注入位置推荐


1. 注解定义

@Autowired的定义信息如下:

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {

	/**
	 * Declares whether the annotated dependency is required.
	 * <p>Defaults to {@code true}.
	 */
	boolean required() default true;

}

可以看出,@Autowired注解可以定义在构造器上,方法上,方法参数上,字段上,还有自定义注解上;

2. 注解使用

  •  2.1 定义在造器上
@Autowired //定义在构造器方法上
public UserService(UserDao userDao) {
	this.userDao = userDao;
}

或者

// 定义在构造器参数上
public UserService(@Autowired UserDao userDao) {
	this.userDao = userDao;
}

特别注意,当一个类只有一个有参构造器,且该构造器不一定需要是public修饰的, 组件注入的时候不需要指定在构造器方法上或者构造器参数上指定@Autowired,只需要声明构造器即可;

  • 2.2 定义在方法和参数上

 定义在Set方法上

@Autowired //定义在set方法上
public void setUserDao(UserDao userDao) {
	this.userDao = userDao;
}

定义在配置Bean的方法上

package com.yibai.spring.annotation.main.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;

import com.yibai.spring.annotation.service.UserDao;
import com.yibai.spring.annotation.service.UserService;

//@ComponentScan("com.yibai.spring.annotation.service")
@Service
public class MainConfigForAutowired {

	// Spring自动从IOC容器中找出UserDao作为方法参数传入,这里@Autowired可有可无
	@Bean
	public UserService userService(@Autowired UserDao userDao) {
		UserService userService = new UserService();
		userService.setUserDao(userDao);
		return userService;
	}

	@Bean
	public UserDao userDao() {
		return new UserDao();
	}
}
  • 2.3 定义在字段上
package com.yibai.spring.annotation.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import lombok.Getter;

@Getter
@Service
public class UserService {

	@Qualifier(value = "userDao")
	@Autowired(required = true)
	private UserDao userDao;

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

}

3. 注入位置推荐

一般推荐注入位置放在构造器上,因为不管字段还是方法的方式注入,都是先创建组件,再注入依赖的组件,如果在构造方法上就需要使用依赖的组件,那么只有在构造器上注入才是可以实现的,因为执行顺序的问题;

package com.yibai.spring.annotation.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import lombok.Getter;

@Getter
@Service
public class UserService {

	@Qualifier(value = "userDao")
	@Autowired(required = true)
	private UserDao userDao;

	public UserService() {
		//@Autowired定义在字段或者set方式上,在构造器上无法获取到依赖的组件
		System.out.println(userDao); // null
	}

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring自动装配(Autowiring)是一种方便的依赖注入机制,它可以自动将bean之间的依赖关系进行解析和注入,而不需要显式地配置bean之间的关联。 在Spring中,有以下几种方式可以实现自动装配: 1. 根据类型自动装配Spring会根据bean的类型来自动匹配并注入依赖。使用`@Autowired`注解或者`<autowired>`标签进行标记。 ```java @Autowired private SomeDependency someDependency; ``` 2. 根据名称自动装配Spring会根据bean的名称来自动匹配并注入依赖。使用`@Autowired`注解结合`@Qualifier`注解或者`<qualifier>`标签进行标记。 ```java @Autowired @Qualifier("myDependency") private SomeDependency someDependency; ``` 3. 构造器自动装配Spring会根据构造器的参数类型和参数名称来自动匹配并注入依赖。使用`@Autowired`注解在构造器上标记。 ```java @Autowired public MyService(SomeDependency someDependency) { this.someDependency = someDependency; } ``` 4. 使用`@Resource`注解:`@Resource`注解是Java原生的注解,Spring也支持它进行自动装配。它可以根据bean的名称或者类型进行自动匹配。 ```java @Resource private SomeDependency someDependency; ``` 自动装配需要在Spring配置文件中启用。可以使用`<context:annotation-config>`标签或`@ComponentScan`注解来开启自动装配功能。 需要注意的是,自动装配是一个便利的功能,但在某些情况下可能会导致不可预料的问题,例如多个候选bean或循环依赖。因此,在使用自动装配时,建议仔细设计和管理bean之间的依赖关系,并在必要的时候明确指定装配方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值