@Inject

@Inject支持构造函数、方法和字段注解,也可能使用于静态实例成员。可注解成员可以是任意修饰符(private,package-private,protected,public)。注入顺序:构造函数、字段,然后是方法。父类的字段和方法注入优先于子类的字段和方法,同一类中的字段和方法是没有顺序的。

@Inject注解的构造函数可以是无参或多个参数的构造函数。@Inject每个类中最多注解一个构造函数。

在字段注解:

  • 用@Inject注解
  • 字段不能是final的
  • 拥有一个合法的名称

在方法上注解:

  • 用@Inject注解
  • 不能是抽象方法
  • 不能声明自身参数类型
  • 可以有返回结果
  • 拥有一个合法的名称
  • 可以有0个或多个参数

@Inject MethodModirers ResultType Identifier(FormalParameterList ) Throws MethodBody

[上述翻译:inject的doc文档,翻译不好敬请谅解]

构造函数注解:

  1. @Inject
  2. public House(Person owner) {
  3. System.out.println("---这是房屋构造函数---");
  4. this.owner = owner;
  5. }

字段注解:

  1. @Inject private Person owner;

方法注解:

  1. @Inject
  2. public void setOwner(Person owner) {
  3. this.owner = owner;
  4. }

@Inject注解和Spring的@Autoware注解都是根据类型对其进行自动装配。

SpringUtil类:

  1. public class SpringUtil {
  2. private static ApplicationContext context = null;
  3. public static ApplicationContext getApplicationContext() {
  4. if (context == null) {
  5. context = new ClassPathXmlApplicationContext("spring.xml");
  6. }
  7. return context;
  8. }
  9. public static ApplicationContext getApplicationContext(String path) {
  10. return new ClassPathXmlApplicationContext(path);
  11. }
  12. public static ApplicationContext getAnnotationConfigApplicationContext(String basePackages) {
  13. return new AnnotationConfigApplicationContext(basePackages);
  14. }
  15. }

Person类:

  1. import javax.inject.Named;
  2. @Named
  3. public class Person {
  4. private String name;
  5. public Person() {
  6. System.out.println("---这是人的构造函数---");
  7. }
  8. public String getName() {
  9. return name;
  10. }
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14. }

House类:

  1. @Named
  2. public class House {
  3. @Inject private Person owner;
  4. public House() {
  5. System.out.println("---这是房屋构造函数---");
  6. }
  7. public Person getOwner() {
  8. return owner;
  9. }
  10. public void setOwner(Person owner) {
  11. this.owner = owner;
  12. }
  13. }

测试类:

  1. public class Test {
  2. public static void main(String[] args) {
  3. ApplicationContext context = SpringUtil.getApplicationContext(
  4. "test/spring/inject/bean-inject.xml");
  5. House house = (House)context.getBean("house");
  6. Person p = house.getOwner();
  7. p.setName("张三");
  8. System.out.println(house.getOwner().getName());
  9. }
  10. }

输出结果:

---这是房屋构造函数---
---这是人的构造函数---
张三

上述例子在Spring3.1下测试成功,在Spring3.1下,每个构造函数只初始化一次及默认的单例形式,个人感觉如果脱离Spring环境应该每次用都会实例化新的对象,当然根据实现的jar包不同而不同,要不javax.inject下的@Singleton注解就没有什么用途了。

@Named

@Named和Spring的@Component功能相同。@Named可以有值,如果没有值生成的Bean名称默认和类名相同。

例如:

  1. @Named public class Person

该bean的名称就是person。

  1. @Named("p") public class Person

如果指定名称,那么就是指定的名称喽。

@Qualifier

任何人都可以定义一个新的修饰语,一个qualifier注解应该满足如下条件:

  • 定义的注解类有@Qualifier,@Retention(RUNTIME)和@Documented。
  • 可以有属性
  • 可以是公共API的一部分
  • 可以用@Target注解限定使用范围

下面是Qualifier的例子:

Genre注解类:

  1. @Documented
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Qualifier
  4. @Target(value = {ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
  5. public @interface Genre {
  6. User user() default User.STUDENT;
  7. public enum User {STUDENT, TEACHER}
  8. }

用户接口:(对个数进行统计)

@Qualifier与@Resource区别:

@Qualifier是spring的注解 而@Resource是javax的注解 功能虽然差不多 但是不是同一个框架 @Resource默认是根据名字注入 @Qualifier必须知道要注入的bean的id

  1. public interface IUserDAO {
  2. int count();
  3. }

StudentDAO:

  1. @Named
  2. @Genre(user = User.STUDENT)
  3. public class StudentDAO implements IUserDAO{
  4. @Override
  5. public int count() {
  6. System.out.println("----StudentDAO----");
  7. return 0;
  8. }
  9. }

TeacherDAO:

  1. @Named
  2. @Genre(user = User.TEACHER)
  3. public class TeacherDAO implements IUserDAO {
  4. @Override
  5. public int count() {
  6. System.out.println("--TeacherDAO--");
  7. return 0;
  8. }
  9. }

UserDAOProcessor:

  1. @Named
  2. public class UserDAOProcessor {
  3. /*对TeacherDAO类的注入,如果对StudentDAO类注入应该是:@Genre(user = User.STUDENT)或@Genre,因为@Genre默认的是STUDENT*/
  4. @Inject
  5. private @Genre(user = User.TEACHER) IUserDAO userDAO;
  6. public int count() {
  7. return userDAO.count();
  8. }
  9. public IUserDAO getUserDAO() {
  10. return userDAO;
  11. }
  12. public void setUserDAO(IUserDAO userDAO) {
  13. this.userDAO = userDAO;
  14. }
  15. }

测试类:

  1. public class Test {
  2. public static void main(String[] args) {
  3. ApplicationContext context = SpringUtil.getApplicationContext(
  4. "test/spring/inject/bean-inject.xml");
  5. UserDAOProcessor processor = (UserDAOProcessor)context.getBean("userDAOProcessor");
  6. System.out.println(processor.count());
  7. }
  8. }

输出结果:

--TeacherDAO--
0

个人对@Qualifier的理解:

  1. 和Spring的@Qualifier大致相同
  2. 单独用@Inject无法满足对接口的注入,无法找到哪个具体类,所以用@Qualifier来确定注入的具体类
  3. 用到@Qualifier的注解中可以有值、无值和用枚举类型

@Singleton

使用该注解标记该类只创建一次,不能被继承。一般在类上用该注解。

原文:http://blog.csdn.net/binxigogo/article/details/7851924

javax.inject中@Inject、@Named、@Qualifier和@Provider用法的更多相关文章

  1. Sql server2012连接Sql server 2008时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误。(provider:SSL Provider,error:0-接收到的消息异常,或格式不正确。)

    以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...

  2. anjular中Service、Factory、Provider的使用与js中创建对象的总结

    在学习anjular中Service的使用时,发现和js中的创建对象的方式有一定的联系,所以总结了anjular中Service.Factory.Provider的使用方式与js创建对象的方式 一.先 ...

  3. 如何在ASP.NET Core中自定义Azure Storage File Provider

    文章标题:如何在ASP.NET Core中自定义Azure Storage File Provider 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p ...

  4. Data Provider 中没有.net framework Data provider for Mysql 的解决方法

    近来做的一个项目中,数据库用的是 MySql, 而在项目使用 Entity Data Model 来做数据服务层,可是在项目中添加 Data Entty Model 时,一般我们都会选择从数据库中直接 ...

  5. HBase入门实例: Table中Family和Qualifier的关系与区别

    Table中Family和Qualifier的关系与区别 就像用MySQL一样,我们要做的是表设计,MySQL中的表,行,列的在HBase已经有所区别了,在HBase中主要是Table和Family和 ...

  6. [转载]C#中as和is关键字的用法

    这篇文章主要介绍了C#中as和is关键字的用法的相关资料,需要的朋友可以参考下. 原文链接:http://www.jb51.net/article/80944.htm#comments  在程序中,进 ...

  7. ASP.NET MVC中Area的另一种用法

    ASP.NET MVC中Area的另一种用法 [摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{ac ...

  8. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  9. C++中public、protected及private用法

    转自:http://www.jb51.net/article/54224.htm 初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容 ...

随机推荐

  1. 对RESTful Web API的理解与设计思路

    距离上一篇关于Web API的文章(如何实现RESTful Web API的身份验证)有好些时间了,在那篇文章中提到的方法是非常简单而有效的,我在实际的项目中就这么用了,代码经过一段时间的磨合,已经很 ...

  2. [Android] 安卓模拟器临时文件相关问题

    今天生产环境有台机器的硬盘满了,排查发现我的模块在/tmp/android-username目录下留了一堆形如“emulator-1tpH5l”的文件,占用了很大的空间. 这个模块会反复启停好几个安卓 ...

  3. Linux及安全——Linux基础实践

    Linux及安全——Linux基础实践 一.实践一:掌握软件源的维护方法,配置系统使用教育网内的软件源镜像.掌握通过软件源来查找,安装,卸载,更新软件的方法. 1.软件源的维护方法 Ubuntu的软件 ...

  4. 20145215《Java程序设计》第1周学习总结

    20145215<Java程序设计>第一周学习总结 教材学习内容总结 本周先学习了最基本的java环境的搭建. 首先从官网上下载了jdk(jdk与jre的区别在于如果只需要运行一个开发好的 ...

  5. 【WEB API项目实战干货系列】- API登录与身份验证(三)

    上一篇: [WEB API项目实战干货系列]- 接口文档与在线测试(二) 这篇我们主要来介绍我们如何在API项目中完成API的登录及身份认证. 所以这篇会分为两部分, 登录API, API身份验证. ...

  6. 总结一下工作中遇到的NPOI以及在ASP.NET MVC中的使用

    1.前言 相信大家在工作中经常要遇到一些导入导出Execl操作.学习贵在分享,分享使人快乐,园子里的前辈已经有很多好的文章,鄙人也是能力有限,在这里把这些好的文章总结,方便以后再工作中使用. NPOI ...

  7. [电子书] 《Android编程入门很简单》

    <Android编程入门很简单>是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把复杂问题简单化的书.本书避免出现云山雾罩.晦涩难懂的讲解,代之以轻松活泼.由浅入 ...

  8. OOP多态和继承要点

         早期绑定和多态 C#函数重载的签名规则是用参数的类型和数量判断,而不是函数的名字. 函数返回值不作为重载签名. 修饰符不作为签名的一部分,如static 同函数中,多个参数名称要唯一 ref ...

  9. IT男的”幸福”生活"续4

    翻来翻去,总是睡不觉.大脑口一堆问题.一个又冒出一个,没完没了.明天该怎样去进行下一步呢.. ….. 夜一下子深黑很多,窗外的公路,时而有货车通过,动不动按喇叭,而我住在二楼,真它的吵.也许她住在五楼 ...

  10. on 在ios下 父对象是body的时候会 不调用

    on 用委托的形式绑定事件 在ios下 父对象是body 获取 docment的时候会 不调用 解决方案  在这些元素上加 cursor: pointer;