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中@Autowired常见用法_第1张图片

二、作用于构造方法

从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;
	}
}

运行截图:

Spring中@Autowired常见用法_第2张图片

三、作用于普通方法

常见的有作用于传统的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;
	}
}

运行截图:

Spring中@Autowired常见用法_第3张图片

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

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

@Controller
public class ConfigA {

	@Autowired
	private Person[] people;

	@Autowired
	private Set<Person> personSet;

	@Autowired
	private List<Person> personList;
}

运行截图:
Spring中@Autowired常见用法_第4张图片

五、作用于Map

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

@Controller
public class ConfigA {

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

运行截图:

Spring中@Autowired常见用法_第5张图片

六、注解@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.
	 * 

Defaults to {@code true}. */ boolean required() default true; }

你可能感兴趣的:(Spring)