使用注解实现bean自动装配

要使用注解须知:

  1. 导入约束
  2. 配置注解支持

在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/>

1.@Autowired:直接在实体类属性前用即可:

然后就可以通过注解实现自动装配了,只需要在被自动装配的实体类属性前加注解@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标签来制定哪一个属性装配哪一个对象。

2.@Resource:

和@Autowired使用方法类似,可以通过@Resource(name=“beanid”)实现类似@Qualifier标签的功能

@Autowired默认是通过byType方法实现的,而且必须要求这个对象存在。
@Resource默认通过byname方式实现,如果找不到就byType

你可能感兴趣的:(spring)