依赖注入|依赖注入 javax inject中 Inject Named Qualifier和 Provider用法

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

这个是 Java EE 6 规范 JSR 330 -- Dependency Injection for Java 中的东西,也就是 Java EE 的依赖注入。

根据 API document 上的说明,被 @Inject 标注的构造、成员字段和方法是可注入的。

其包可以在 jcp.org 上找到,并可以在这里下载:

https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_JCP-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=dependency_injection-1.0-final-oth-JSpec@CDS-CDS_JCP

【依赖注入|依赖注入 javax inject中 Inject Named Qualifier和 Provider用法】


Spring自带的@Autowired的缺省情况等价于JSR-330的@Inject注解;Spring自带的@Qualifier的缺省的根据Bean名字注入情况等价于JSR-330的@Named注解;Spring自带的@Qualifier的扩展@Qualifier限定描述符注解情况等价于JSR-330的@Qualifier注解。


用过Spring框架的我们都知道,每当生成依赖注入的时候,我们都必须生成相应类的set方法,而且要在set方法上面写上@Autowired,才能实现依赖注入,如下:
Java代码依赖注入|依赖注入 javax inject中 Inject Named Qualifier和 Provider用法
文章图片

  1. package com.kaishengit.web;
  2. import com.kaishengit.service.ProjectService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Controller;
  5. @Controller
  6. public class FolderController {
  7. private ProjectService projectService;
  8. //set
  9. @Autowired
  10. public void setProjectService(ProjectService projectService) {
  11. this.projectService = projectService;
  12. }
  13. }
每次都要生成相应的set方法感觉好麻烦,现在如果我们使用javax.inject.jar,只需要在相应类的属性上面加上@Inject,如下代码:
Java代码依赖注入|依赖注入 javax inject中 Inject Named Qualifier和 Provider用法
文章图片
  1. package com.kaishengit.web;
  2. import com.kaishengit.service.ProjectService;
  3. import org.springframework.stereotype.Controller;
  4. import javax.inject.Inject;
  5. @Controller
  6. public class FolderController {
  7. @Inject
  8. private ProjectService projectService;
  9. }
javax.inject.jar下载地址:https://code.google.com/p/dependency-shot/downloads/detail?name=javax.inject.jar&can=2&q=

@Inject
@Inject支持构造函数、方法和字段注解,也可能使用于静态实例成员。可注解成员可以是任意修饰符(private,package-private,protected,public)。注入顺序:构造函数、字段,然后是方法。父类的字段和方法注入优先于子类的字段和方法,同一类中的字段和方法是没有顺序的。
@Inject注解的构造函数可以是无参或多个参数的构造函数。@Inject每个类中最多注解一个构造函数。
在字段注解:
  • 用@Inject注解
  • 字段不能是final的
  • 拥有一个合法的名称
在方法上注解:
  • 用@Inject注解
  • 不能是抽象方法
  • 不能声明自身参数类型
  • 可以有返回结果
  • 拥有一个合法的名称
  • 可以有0个或多个参数
@Inject MethodModirers ResultType Identifier(FormalParameterList ) Throws MethodBody
[上述翻译:inject的doc文档,翻译不好敬请谅解]

构造函数注解:

[java]view plain copy
  1. @Inject
  2. public House(Person owner) {
  3. System.out.println("---这是房屋构造函数---");
  4. this.owner = owner;
  5. }
字段注解:

[java]view plain copy
  1. @Inject private Person owner;
方法注解:

[java]view plain copy
  1. @Inject
  2. public void setOwner(Person owner) {
  3. this.owner = owner;
  4. }
@Inject注解和Spring的@Autoware注解都是根据类型对其进行自动装配。
SpringUtil类:

[java]view plain copy
  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类:

[java]view plain copy
  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) {

    推荐阅读