Spring核心技术(十)——JSR-330标准注解
2016-07-11 12:32
537 查看
从Spring 3.0开始,Spring开始支持JSR-330标准的注解(依赖注入)。这些注解和Spring注解扫描的方式是一直的,开发者只需要在classpath中配置相关的jar包即可。
如果开发者使用Maven来管理项目的话,
通过
JSR-330中,
和
如果开发者希望来通过名字来限定注入的Bean,可以使用
JSR-330中,
在使用
和Spring的
如果开发者使用Maven来管理项目的话,
javax.injectartifact在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; @Named public 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注解的不同点也是十分必要的,参考如下表:Spring | javax.inject.* | javax.inject 限制 |
---|---|---|
@Autowired | @Inject | @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是Spring ObjectFactory的另一个选择,通过 get()方法来代理, Provider可以和Spring的 @Autowired组合使用 |
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring和ThreadLocal
- Spring Boot 开发微服务
- Spring AOP动态代理-切面
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- mssql注入躲避IDS的方法
- 模拟Spring的简单实现
- Spring整合WebSocket应用示例(上)
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- 监听器获取Spring配置文件的方法
- Java利用Sping框架编写RPC远程过程调用服务的教程
- springmvc 发送ajax出现中文乱码的解决方法汇总
- Spring MVC中Ajax实现二级联动的简单实例
- SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
- 详解Java的MyBatis框架和Spring框架的整合运用