Spring入门篇 学习笔记
@Required
@Required 注解适用于 bean 属性的 setter 方法
这个注解仅仅表示,受影响的 bean 属性必须在配置时被填充,通过在 bean 定义或通过自动装配一个明确的属性值:
1 | public class SimpleMovieLister{ |
@Required 使用比较少,一般使用 @Autowired
@Autowired: setter, 构造器, 成员变量自动注入
可以将 @Autowired 理解为“传统”的 setter 方法:
1 | public class SimpleMovieLister{ |
可用于构造器或成员变量:
1 | @Autowired |
默认情况下,如果因找不到合适的 bean 将会导致 autowiring 失败抛出异常,可以通过下面的方式避免:
1 | public class SimpleMovieLister{ |
- 每个类只能有一个构造器被标记为 required=true
- @Autowired 的必要属性,建议使用 @Required 注解
示例
添加类:
1 | public interface InjectionDAO { |
添加测试类:
1 | @RunWith(BlockJUnit4ClassRunner.class) |
@Autowired: 数组, Map 自动注入
可以使用 @Autowired 注解那些众所周知的解析依赖性接口,比如:BeanFactory, ApplicationContext, Environment, ResourceLoader, ApplicationEventPublisher, MessageSource
1 | public class MovieRecommender{ |
可以通过添加注解给需要该类型的数组的字段或方法,以提供 ApplicationContext 中的所有特定类型的 bean
1 | private Set<MovieCatalog> movieCatalog; |
可以用于装配 key 为 String 的 Map
1 | private Map<String, MovieCatalog> movieCatalogs; |
如果希望数组有序,可以让 bean 实现 org.springframework.core.Ordered 接口或使用 @Order注解
@Autowired 是由 BeanPostProcessor 处理的,所以不能在自己的 BeanPostProcessor 或 BeanFactoryPostProcessor 类型应用这些注解,这些类型必须通过 XML 或者 @Bean 注解加载
示例
新建类:
1 | public interface BeanInterface { |
在 TestInjection 中添加测试方法:
1 | @Test |
@Qualifier
按类型自动装配可能多个 bean 实例的情况,可以使用 @Qualifier 注解缩小范围(或指定唯一),也可以用于指定单独的构造器参数或方法参数
可用于注解集合类型变量
1 | public class MovieRecommender{ |
在 XML 文件中实现 Qualifier:
1 | <?xml version="1.0" encoding="UTF-8"?> |
如果通过名字进行注解注入,主要使用的不是 @Autowired (即使在技术上能够通过 @Qualifier 指定 bean 的名字),替代方式是使用 JSR-250 @Resource 注解,它是通过其独特的名称定义来识别特定的目标(这是一个与所声明的类型无关的匹配过程)
因语义差异,集合或 Map 类型的 bean 无法通过 @Autowired 来注入时,因为没有类型匹配到这样的 bean,为这些 bean 使用 @Resource 注解,通过唯一名称引用集合或 Map 的 bean
@Autowired 适用于 fields, constructors, multi-argument methods 这些允许在参数级别使用 @Qualifier 注解缩小范围的情况
@Resource 适用于成员变量、只有一个参数的 setter 方法,所以在目标时构造器或一个多参数方法时,最好的方式时使用 @Qualifier
可以定义自己的 qualifier 注解:
1 | @Target({ElementType.FIELD, ElementType.PARAMETER}) |
示例
修改 BeanInvoker:
1 | @Component |