要使用注解须知:
在applicationContext.xml配置注解支持:
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
然后在applicationContext.xml中开启注解支持:
<context:annotation-config/>
applicationContext.xml配置文件就变为:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
然后就可以通过注解实现自动装配了,只需要在被自动装配的实体类属性前加注解@Autowired即可
package pojo;
import lombok.Data;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
@Data
@NoArgsConstructor
public class People {
@Autowired
private Cat cat;
@Autowired
private Dog dog;
private String name;
}
package pojo;
public class Cat {
public void shout(){
System.out.println("喵");
}
}
package pojo;
public class Dog {
public void shout(){
System.out.println("汪");
}
}
<bean id="people" class="pojo.People" p:name="张三"/>
<bean id="cat" class="pojo.Cat"/>
<bean id="dog" class="pojo.Dog"/>
就可以读取到被自动装配好的对象了。
注意:因为Autowired是通过反射实现的,所以可以不用编写set方法,前提是这个自动装配的属性在IOC容器中存在,且符合名字byname:就是说实体类中的属性名要和applicationContext.xml中要装配的对象名一致。
下面是@Autowired注解源代码:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.beans.factory.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({
ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}
可以看到Autowired标签内有一个属性为required,默认为true,如果我们在写这个标签时,显示定义required=falese,
就说明这个对象可以为null,也就是说在People类中定义:
@Autowired(required = false)
private Cat cat;
那么cat这个对象就可以是一个null值
当要自动装配的环境比较复杂时(无法通过一个@Autowired实现自动装配时):
如果要自动装配的对象在applicationContext.xml中的名字和在被装配的实体类中的对象名不一样,就可以使用@Qualifier(“value=“beanid””)来指定某个属性装配某个对象:例如:
@Autowired
@Qualifier(value = "cat222")
private Cat cat;
<bean id="people" class="pojo.People" p:name="张三"/>
<bean id="cat222" class="pojo.Cat"/>
<bean id="dog" class="pojo.Dog"/>
当一个实体类中有多个相同类型的属性时,也可以通过@Qualifier标签来制定哪一个属性装配哪一个对象。
和@Autowired使用方法类似,可以通过@Resource(name=“beanid”)实现类似@Qualifier标签的功能
@Autowired默认是通过byType方法实现的,而且必须要求这个对象存在。
@Resource默认通过byname方式实现,如果找不到就byType