Spring核心技术(十)——JSR-330标准注解
来源:互联网 发布:北京服装定制 知乎 编辑:程序博客网 时间:2024/06/11 23:47
从Spring 3.0开始,Spring开始支持JSR-330标准的注解(依赖注入)。这些注解和Spring注解扫描的方式是一直的,开发者只需要在classpath中配置相关的jar包即可。
如果开发者使用Maven来管理项目的话,
javax.inject
artifact在Maven仓库中是可用的(http://repo1.maven.org/maven2/javax/inject/javax.inject/1/)。开发者只需要在pom中引用这个依赖即可。
<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version></dependency>
通过@Inject
和@Named
进行依赖注入
JSR-330中,@javax.inject.Inject
和Spring中的@Autowired
的职责相同:
import javax.inject.Inject;public class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } public void listMovies() { this.movieFinder.findMovies(...); ... }}
和@Autowired
一致的是,开发者可以使用@Inject
在实例变量,方法以及构造参数级别来使用依赖注入。而且,开发者可以将注入声明为Provider
,通过Provider.get()
来请求那些短作用域或者延迟初始化的Bean。比如如下的例子:
import javax.inject.Inject;import javax.inject.Provider;public class SimpleMovieLister { private Provider<MovieFinder> movieFinder; public void listMovies() { this.movieFinder.get().findMovies(...); ... }}
如果开发者希望来通过名字来限定注入的Bean,可以使用@Named
注解:
import javax.inject.Inject;import javax.inject.Named;public class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(@Named("main") MovieFinder movieFinder) { this.movieFinder = movieFinder; } // ...}
@Named
:等同于@Component
注解
JSR-330中,@javax.inject.Named
和Spring中的@Component
的职责类似:
import javax.inject.Inject;import javax.inject.Named;@Named("movieListener")public class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // ...}
@Component
的使用中经常是不需要指定名字的,@Named
注解也是如此:
import javax.inject.Inject;import javax.inject.Named;@Namedpublic class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // ...}
在使用@Named
注解的时候,也同样可以使用组件扫描:
@Configuration@ComponentScan(basePackages = "org.example")public class AppConfig { ...}
和Spring的
@Component
组件不同的是,JSR-330的Named
注解不可以组合来使用,如果希望自定义组件注解的话,还请使用Spring的组件注解。
JSR-330标准注解的限制
当使用JSR-330标准的注解时,了解其和Spring注解的不同点也是十分必要的,参考如下表:
@Inject
注解没有required
属性,但是可以通过Java 8的Optional
取代 @Component @Named JSR_330标准并没有提供复合的模型,只有一种方式来识别组件 @Scope(“singleton”) @Singleton JSR-330默认的作用域类似Spring的prototype
,然而,为何和Spring的默认保持一致,JSR-330标准中的Bean在Spring中默认也是单例的。如果要使用非单例的作用域,开发者应该使用Spring的@Scope
注解。java.inject
也提供一个@Scope
注解,然而,这个注解仅仅可以用来创建自定义的作用域时才能使用。 @Qualifier @Qualifier/@Named javax.inject.Qualifier
仅仅是一个元注解,用来构建自定义限定符的。而String的限定符(比如Spring中的@Qualifier
)可以通过javax.inject.Named
来实现 @Value - 不等价 @Required - 不等价 @Lazy - 不等价 ObjectFactory Provider javax.inject.Provider
是SpringObjectFactory
的另一个选择,通过get()
方法来代理,Provider
可以和Spring的@Autowired
组合使用 1 0
- Spring核心技术(十)——JSR-330标准注解
- Spring整理系列(10)——@Autowired自动装配、结合@Qualifier过滤及与JSR-250@Resource注解、JSR-330@Inject注解的区别、@Named使用
- Spring JSR-250注解
- Spring JSR-250注解
- Spring JSR-250注解
- Spring JSR-250注解
- Spring核心技术(八)——Spring自动装载的注解
- Spring支持JSR-250注解
- JSR 330 And Spring
- Spring核心技术(十五)——BeanFactory
- Java 依赖注入标准(JSR-330)简介
- Java 依赖注入标准(JSR-330)简介例子
- Java 依赖注入标准(JSR-330)简介
- Spring核心技术(七)——Spring容器的扩展
- Spring验证(JSR-303)
- Java 依赖注入标准 JSR-330 简介
- JAVA标准系列(final JSR)
- Spring mvc 基于JSR-303的注解校验
- Eclipse导入导出Preference配置文件
- Toj 3990. I guess the gift is a bag! II
- JAVA XML解析
- uboot 与系统内核中MTD分区的关系:
- java字节流与字符流之文件复制
- Spring核心技术(十)——JSR-330标准注解
- Linux下tar.xz tar.bz2 tar.gz 等文件的解压
- 面试题20:顺时针打印矩阵
- listview添加headerview需要注意的,listview自定义的item注意的焦点
- MacPorts安装卡住不动,解决方法
- uva 12716 GCD XOR
- 删除字符串中出现次数最少的字符
- C# 禁止windows程序重复运行的两种基本方法
- Eclipse从SVN检出项目Java类图标空心的解决办法