文档章节

javax.inject中@Inject、@Named、@Qualifier和@Provider用法

yolinfeng
 yolinfeng
发布于 2015/06/06 22:54
字数 973
阅读 20
收藏 0

@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}
}
用户接口:(对个数进行统计)

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的理解:

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

@Singleton

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

本文转载自:http://blog.csdn.net/binxigogo/article/details/7851924

yolinfeng
粉丝 12
博文 196
码字总数 11946
作品 0
珠海
架构师
私信 提问
Using JSR 330 Standard Annotations

7.11 Using JSR 330 Standard Annotations 从spring3.0开始,spring提供对JSR-330标准注解的支持.这些注解同spring注解的扫描方式相同.你只需将在你的类路径里添加相关的jar包. 如果你使用Mav...

流光韶逝
2016/09/26
4
0
javax.inject中@Inject、@Named、@Qualifier和@Provider用法

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

The-Start
2013/10/23
0
3
控制反转与依赖注入通俗描述

控制反转(IOC): 由框架或其他某些东西来控制需要调用的事件处理器或其他东西,而不是由业务逻辑决定。 举例:spring中的bean,我们在spring项目中配置了datasource后,不需要关注如何调用它...

李矮矮
2016/09/26
13
0
Spring and Springboot annotations for DI

Basic annotaions to describe a bean: | Annotation | Meaning |+------------+-----------------------------------------------------+| @Component | generic stereotype for any Spring......

ancient_wind
2016/04/14
85
1
Spring下的@Inject、@Autowired、@Resource注解区别(转)

1、@Inject javax.inject JSR330 (Dependency Injection for Java) 这是JSR330中的规范,通过AutowiredAnnotationBeanPostProcessor类实现的依赖注入。 @Inject使用 如下是@Inject的使用,不......

easonjim
2017/10/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

FPGA 设备 USB Platform Cable USB

lsusbFuture Technology Devices International, Ltd FT232H Single HS USB-UART/FIFO IC

MtrS
今天
4
0
lua web快速开发指南(6) - Cache、DB介绍

"数据库"与"缓存"的基本概念 数据库与缓存是服务端开发人员的必学知识点. 数据库 "数据库"是一种信息记录、存取的虚拟标记地点的集合统称. 比如现实生活中, 我们经常会用到文件柜、书桌等等数...

水果糖的小铺子
今天
6
0
Oracle分页查询语句的写法

Oracle分页查询语句的写法 Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,Oracle分页查询语句基本上可以按本文给出的格式来进行套用。   Oracle分...

康师傅
昨天
5
0
java并发图谱

1527
昨天
2
0
Mybatis之拦截器Interceptor

使用mybatis时用PageHelper进行分页,用到了PageInterceptor,借此了解下mybatis的interceptor。Mybatis的版本是3.4.6,MybatisHelper的版本是5.1.3。 1、PageInterceptor 先上一段代码,如下...

克虏伯
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部