Spring中@Autowired常见用法

Spring中@Autowired常见用法

(原创文章,转载请标明出处:https://blog.csdn.net/likeYou1207/article/details/107140161)
本文主要介绍Spring中自动注入@Autowired的几种常见用法,有作用于属性、构造方法、普通方法、数组、集合、Map
运行截图代码全部使用以下代码,调用context.getBean(ConfigA.class)截图

    // 人类接口
    public interface Person {
        String effect();
    }
    
    // 男生类
    @Component("nanhai") // 注意此处注解是有值得,在第五点会有特殊效果
    public class Man implements Person{
        private Integer age;
        private String name;

        @Override
        public String effect() {
            return "可以为女生开瓶盖!";
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
    
    // 女生类
    @Component
    public class Girls implements Person{
        private Integer age;
        private String name;

        @Override
        public String effect() {
            return "可以找男生开瓶盖!";
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
	// 应用类,使用@Autowried的地方
	@Controller
    public class ConfigA {

    }
    // 启动类
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.jiang.demo.ioc.**");
        ConfigA bean = context.getBean(ConfigA.class);
    }

一、作用于属性之上

这种方式属于最常见方式,相信使用过spring的都知道

@Controller
public class ConfigA {
	@Autowired
	private Man man;
	
	@Autowired
	private Girls girls;
}

运行截图:

在这里插入图片描述

二、作用于构造方法

从Spring Framework 4.3开始,@Autowired如果目标Bean仅定义一个的构造函数,则不再需要在此构造函数上添加注释,低于版本都需要在构造方法上添加@Autowired注释。如果有多个构造函数可用,并且没有主/默认构造函数,则必须至少注释一个构造函数,@Autowired以指示容器使用哪个构造函数

@Controller
public class ConfigA {

	private Man man;
	
	private Girls girls;
	
    // 此处使用的spring版本是5.2.x
	public ConfigA(Man man, Girls girls) {
		this.man = man;
		this.girls = girls;
	}
}

运行截图:

在这里插入图片描述

三、作用于普通方法

常见的有作用于传统的setter方法之上,但同样可以作用于普通方法

@Controller
public class ConfigA {

	private Man man;

	private Girls girls;

	@Autowired
	public void setMan(Man man) {
		this.man = man;
	}

	// 此处为任意方法名称
	@Autowired
	public void casual(Girls girls) {
		this.girls = girls;
	}
}

运行截图:

在这里插入图片描述

四、作用于集合或者数组属性

此方式可以作用于结合和数组之上,使用了一个接口Person

@Controller
public class ConfigA {

	@Autowired
	private Person[] people;

	@Autowired
	private Set<Person> personSet;

	@Autowired
	private List<Person> personList;
}

运行截图:
在这里插入图片描述

五、作用于Map

作用于Map方式Key默认是实现类名称的小驼峰,但Key可以自定义,例如@Component("nanhai"),可以看男生类得代码,类注解有自定义名称nanhai,常见应用场景如策略模式,比如说:有一个需求,需要根据特定的标识执行特定的代码,例如标识为nanhai的作用,可以通过personMap.get("nanhai").effect()

@Controller
public class ConfigA {

	@Autowired
	private Map<String, Person> personMap;
}

运行截图:

在这里插入图片描述

六、注解@Autowired属性required

默认值为true,表示注入时Bean是否必须存在,否则报错;在Spring 5.1之前可以使用@Required标识,但在5.1之后被弃用了,可以采用@Autowired(required = false)方式使用,表示如果有就注入,没有就跳过。

应用场景:比如在一个公共模块中使用了@Autowired属性,此模块被其它项目所依赖,在其它项目中也许并没有需要注入的Bean,也不需要此Bean,就可以使用Autowired(required = false)来注入,否则在其它项目中就会启动报错,找不到Bean。

@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;

}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值