javax.inject中@Inject、@Named、@Qualifier和@Provider用法
@Inject
@Inject支持构造函数、方法和字段注解,也可能使用于静态实例成员。可注解成员可以是任意修饰符(private,package-private,protected,public)。注入顺序:构造函数、字段,然后是方法。父类的字段和方法注入优先于子类的字段和方法,同一类中的字段和方法是没有顺序的。
@Inject注解的构造函数可以是无参或多个参数的构造函数。@Inject每个类中最多注解一个构造函数。
在字段注解:
- 用@Inject注解
- 字段不能是final的
- 拥有一个合法的名称
在方法上注解:
- 用@Inject注解
- 不能是抽象方法
- 不能声明自身参数类型
- 可以有返回结果
- 拥有一个合法的名称
- 可以有0个或多个参数
@Inject MethodModirers ResultType Identifier(FormalParameterList ) Throws MethodBody
[上述翻译:inject的doc文档,翻译不好敬请谅解]
构造函数注解:
- @Inject
- public House(Person owner) {
- System.out.println("---这是房屋构造函数---");
- this.owner = owner;
- }
字段注解:
- @Inject private Person owner;
方法注解:
- @Inject
- public void setOwner(Person owner) {
- this.owner = owner;
- }
@Inject注解和Spring的@Autoware注解都是根据类型对其进行自动装配。
SpringUtil类:
- public class SpringUtil {
- private static ApplicationContext context = null;
- public static ApplicationContext getApplicationContext() {
- if (context == null) {
- context = new ClassPathXmlApplicationContext("spring.xml");
- }
- return context;
- }
- public static ApplicationContext getApplicationContext(String path) {
- return new ClassPathXmlApplicationContext(path);
- }
- public static ApplicationContext getAnnotationConfigApplicationContext(String basePackages) {
- return new AnnotationConfigApplicationContext(basePackages);
- }
- }
Person类:
- import javax.inject.Named;
- @Named
- public class Person {
- private String name;
- public Person() {
- System.out.println("---这是人的构造函数---");
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
House类:
- @Named
- public class House {
- @Inject private Person owner;
- public House() {
- System.out.println("---这是房屋构造函数---");
- }
- public Person getOwner() {
- return owner;
- }
- public void setOwner(Person owner) {
- this.owner = owner;
- }
- }
测试类:
- public class Test {
- public static void main(String[] args) {
- ApplicationContext context = SpringUtil.getApplicationContext(
- "test/spring/inject/bean-inject.xml");
- House house = (House)context.getBean("house");
- Person p = house.getOwner();
- p.setName("张三");
- System.out.println(house.getOwner().getName());
- }
- }
输出结果:
---这是房屋构造函数---
---这是人的构造函数---
张三
上述例子在Spring3.1下测试成功,在Spring3.1下,每个构造函数只初始化一次及默认的单例形式,个人感觉如果脱离Spring环境应该每次用都会实例化新的对象,当然根据实现的jar包不同而不同,要不javax.inject下的@Singleton注解就没有什么用途了。
@Named
@Named和Spring的@Component功能相同。@Named可以有值,如果没有值生成的Bean名称默认和类名相同。
例如:
- @Named public class Person
该bean的名称就是person。
- @Named("p") public class Person
如果指定名称,那么就是指定的名称喽。
@Qualifier
任何人都可以定义一个新的修饰语,一个qualifier注解应该满足如下条件:
- 定义的注解类有@Qualifier,@Retention(RUNTIME)和@Documented。
- 可以有属性
- 可以是公共API的一部分
- 可以用@Target注解限定使用范围
下面是Qualifier的例子:
Genre注解类:
- @Documented
- @Retention(RetentionPolicy.RUNTIME)
- @Qualifier
- @Target(value = {ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
- public @interface Genre {
- User user() default User.STUDENT;
- public enum User {STUDENT, TEACHER}
- }
用户接口:(对个数进行统计)
@Qualifier与@Resource区别:
@Qualifier是spring的注解 而@Resource是javax的注解 功能虽然差不多 但是不是同一个框架 @Resource默认是根据名字注入 @Qualifier必须知道要注入的bean的id
- public interface IUserDAO {
- int count();
- }
StudentDAO:
- @Named
- @Genre(user = User.STUDENT)
- public class StudentDAO implements IUserDAO{
- @Override
- public int count() {
- System.out.println("----StudentDAO----");
- return 0;
- }
- }
TeacherDAO:
- @Named
- @Genre(user = User.TEACHER)
- public class TeacherDAO implements IUserDAO {
- @Override
- public int count() {
- System.out.println("--TeacherDAO--");
- return 0;
- }
- }
UserDAOProcessor:
- @Named
- public class UserDAOProcessor {
- /*对TeacherDAO类的注入,如果对StudentDAO类注入应该是:@Genre(user = User.STUDENT)或@Genre,因为@Genre默认的是STUDENT*/
- @Inject
- private @Genre(user = User.TEACHER) IUserDAO userDAO;
- public int count() {
- return userDAO.count();
- }
- public IUserDAO getUserDAO() {
- return userDAO;
- }
- public void setUserDAO(IUserDAO userDAO) {
- this.userDAO = userDAO;
- }
- }
测试类:
- public class Test {
- public static void main(String[] args) {
- ApplicationContext context = SpringUtil.getApplicationContext(
- "test/spring/inject/bean-inject.xml");
- UserDAOProcessor processor = (UserDAOProcessor)context.getBean("userDAOProcessor");
- System.out.println(processor.count());
- }
- }
输出结果:
--TeacherDAO--
0
个人对@Qualifier的理解:
- 和Spring的@Qualifier大致相同
- 单独用@Inject无法满足对接口的注入,无法找到哪个具体类,所以用@Qualifier来确定注入的具体类
- 用到@Qualifier的注解中可以有值、无值和用枚举类型
@Singleton
使用该注解标记该类只创建一次,不能被继承。一般在类上用该注解。
原文:http://blog.csdn.net/binxigogo/article/details/7851924
javax.inject中@Inject、@Named、@Qualifier和@Provider用法的更多相关文章
- Sql server2012连接Sql server 2008时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误。(provider:SSL Provider,error:0-接收到的消息异常,或格式不正确。)
以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...
- anjular中Service、Factory、Provider的使用与js中创建对象的总结
在学习anjular中Service的使用时,发现和js中的创建对象的方式有一定的联系,所以总结了anjular中Service.Factory.Provider的使用方式与js创建对象的方式 一.先 ...
- 如何在ASP.NET Core中自定义Azure Storage File Provider
文章标题:如何在ASP.NET Core中自定义Azure Storage File Provider 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p ...
- Data Provider 中没有.net framework Data provider for Mysql 的解决方法
近来做的一个项目中,数据库用的是 MySql, 而在项目使用 Entity Data Model 来做数据服务层,可是在项目中添加 Data Entty Model 时,一般我们都会选择从数据库中直接 ...
- HBase入门实例: Table中Family和Qualifier的关系与区别
Table中Family和Qualifier的关系与区别 就像用MySQL一样,我们要做的是表设计,MySQL中的表,行,列的在HBase已经有所区别了,在HBase中主要是Table和Family和 ...
- [转载]C#中as和is关键字的用法
这篇文章主要介绍了C#中as和is关键字的用法的相关资料,需要的朋友可以参考下. 原文链接:http://www.jb51.net/article/80944.htm#comments 在程序中,进 ...
- ASP.NET MVC中Area的另一种用法
ASP.NET MVC中Area的另一种用法 [摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{ac ...
- [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...
- C++中public、protected及private用法
转自:http://www.jb51.net/article/54224.htm 初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容 ...
随机推荐
- pandas 修改 DataFrame 列名
问题: 有一个DataFrame,列名为:['$a', '$b', '$c', '$d', '$e'] 现需要改为:['a', 'b', 'c', 'd', 'e'] 有何办法? import pan ...
- puer工具的使用
在项目开发的过程当中,总会有前端开发快完成,后端接口却迟迟提供不了的情况.此时为了不影响前端开发的进度,我们可以借助puer来模拟后端接口测试.简单的说,puer就是一个可以实时刷新的前端服务器.具体 ...
- Ubuntu Navicat for MySQL安装以及破解方案
今天发现Navicat for MySQL有LINUX版本了哈, 开心的说,首先上官网上下载LINUX版本: http://www.navicat.com/download 1. 下载 navicat ...
- linux实践——字符集
一.ASCII码 首先是看得懂ASCII码表: 二 八 十 十六 缩写/字符 0000 0000 0 0 00 NUL(null) 0000 0001 1 1 01 SOH(start of head ...
- 20135316王剑桥 linux第十二周课实验笔记
第十二章并发编程 1.如果逻辑控制流在时间上重叠,那么它们就是并发的.这种现象,称为并发(concurrency). 2.为了允许服务器同时为大量客户端服务,比较好的方法是:创建并发服务器,为每个客户 ...
- 实验箱FPGA部分测试报告及A8与FPGA链接测试报告
其实,我一开始还以为实验箱不会有什么问题只是让我们多学习东西才做这个测试的,结果发现还真的有不少问题. 1.实验准备部分 安装驱动时,win10系统无法正确安装usb-blaster Windows ...
- unity3d 纹理动画
不知道大家有没有玩过赛车游戏 赛车游戏的跑道有路标,如下图 玩过赛车游戏的都知道,大多数赛车游戏的路标是会动的,如上图,它会从右往左运动 不会发动态图,大家脑补一下吧 没有玩过赛车游戏的也不要紧,大家 ...
- 『转载』C# winform 中dataGridView的重绘(进度条,虚线,单元格合并等)
原文转载自:http://hi.baidu.com/suming/item/81e45b1ab9b4585f2a3e2243 最近比较浅的研究了一下dataGridView的重绘,发现里面还是有很多东 ...
- EF实体框架之CodeFirst五
上一博客学习了下基本的约定配置,留下几个遗漏的,这篇就是学习下遗漏一复杂类型. 一.什么是复杂类型? 书中说道:“复杂类型也可视作值类型(?)可以作为附加属性添加到其他类.复杂类型与实体类型的区别在于 ...
- AngularJs-指令和控制器交互
前言: 前段时间我们学习了angular的指令,他通过ECMA的方式创建元素,可以让我们共用这些元素,我们也知道可以通过 link的方法给这个指令添加一些动作事件,本节,我们将写入和让angular的 ...