Spring学习(四)—— @Autowired注解

@Required

  • @Required注解适用于bean属性的setter方法。
  • 这个注解仅仅表示受影响的bean属性必须在配置时被填充,通过在bean定义或通过自动装配一个明确的属性值。

@Autowired

  • 可以将@Autowired注解setter方法
  • 也可用于构造器和成员变量

@Autowired相比@Required适用范围更广

  • 默认情况下,如果找不到合适的bean将会导致autowiring失败抛出异常,可以通过
    @Autowired(required=false) 方式避免

  • 每个类只能有一个构造器被标为 required=true

  • @Autowired的必要属性,建议使用@Required注解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Service
public class InjectionServiceImpl implements InjectionService {
//1、成员变量
//@Autowired
private InjectionDAO injectionDAO;
//2、构造器注入
@Autowired
public InjectionServiceImpl(InjectionDAO injectionDAO){
this.injectionDAO = injectionDAO;
}
//3、setter方法注入
//@Autowired
public void setInjectionDAO(InjectionDAO injectionDAO) {
this.injectionDAO = injectionDAO;
}
@Override
public void save(String arg) {
//模拟业务操作
System.out.println("Service接受参数:"+arg);
arg = arg + ":" + this.hashCode();
injectionDAO.save(arg);
}
}
  • 可以使用@Autowired注解众所周知的解析依赖性接口,如BeanFactory,ApplicationContext,Environment,ResourceLoader等
  • 可以通过添加@Autowired注解给需要该类型的数组的字段或方法,已提供ApplicationContext中的所有特定类型的bean

  • 可以用于装配key为String的Map

  • 如果希望数组有序,可以让bean实现org.springframework.core.Ordered接口或使用@Order注解

spring-config.xml

1
<context:component-scan base-package="com.test"></context:component-scan>

BeanInterface.java

1
2
3
4
5
package com.test;
public interface BeanInterface {
}

BeanImplOne.java

1
2
3
4
5
6
7
8
9
package com.test;
import org.springframework.stereotype.Component;
@Order(2)
@Component
public class BeanImplOne implements BeanInterface {
}

BeanImplTwo.java

1
2
3
4
5
6
7
8
9
package com.test;
import org.springframework.stereotype.Component;
@Order(1)
@Component
public class BeanImplTwo implements BeanInterface {
}

BeanInvoker.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
public class BeanInvoker {
@Autowired
private List<BeanInterface> list;
@Autowired
private Map<String,BeanInterface> map;
public void say(){
if (null != list && 0!=list.size()){
System.out.println("This is list...");
for (BeanInterface beanInterface: list){
System.out.println(beanInterface.getClass().getName());
}
}else{
System.out.println("List<BeanInterface> list is null!!!");
}
System.out.println();
if(null != map && 0 != map.size()){
System.out.println("This is map...");
for (Map.Entry<String,BeanInterface> entry:map.entrySet()){
System.out.println(entry.getKey()+" "+entry.getValue().getClass().getName());
}
}else{
System.out.println("Map<String,BeanInterface> map is null!!!");
}
}
}

MainApp.java

1
2
3
4
5
6
7
public class MainApp {
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
BeanInvoker invoker = (BeanInvoker)context.getBean("beanInvoker");
invoker.say();
}
}

输出:

1
2
3
4
5
6
7
This is list...
com.test.BeanImplTwo
com.test.BeanImplOne
This is map...
beanImplOne com.test.BeanImplOne
beanImplTwo com.test.BeanImplTwo
  • @Autowired注解是由Spring BeanPostProcessor处理,所有不能在自己的BeanPostProcessor或BeanFactoryPostProcessor类型应用这些注解,这些类型必须通过XML或Spring的@Bean注解加载

@Qualifier

  • 按类型自动装配可能多个bean实例的情况,可以使用Spring的@Qualifier注解缩小范围,也可以用于指定单独的构造器参数或方法参数。
  • 可用于注解集合类型变量
1
2
3
4
5
6
7
8
9
10
@Autowired
@Qualifier("beanImplOne")
private BeanInterface beanInterface;
if (null!=beanInterface){
System.out.println("This is beanInterface...");
System.out.println(beanInterface.getClass().getName());
}else {
System.out.println("beanInterface is null!!!");
}

输出:

1
2
This is beanInterface...
com.test.BeanImplOne
您的支持将鼓励我继续创作~