[weld] weld中的依赖注入

wuhaixing 2010-03-19
      在java中,业务逻辑实现是通过多个类的实例协作共同完成的。当A需要访问B类的实例时,最原始的办法是new一个class B,然后调用其中定义的方法。A依赖于B,而且这种依赖关系在编译时就已经确定了,称为硬依赖紧耦合。
      为了实现灵活性,对这种依赖关系进行解耦,可以采用抽象工厂模式,也可以采用依赖注入方式。基本思路都是在A和B之间介入第三方,由第三方代替A进行B的new 工作,然后将B的实例交给A使用。
      目前spring 是java社区中进行依赖注入最流行的框架,它通过xml定义bean,bean有名称(identifier)及类名。在运行时,由spring根据xml配置文件管理bean之间的依赖关系。
      而weld实现的依赖注入,是typesafe 的,而且会设定bean的生命周期。借助于Annotation,而不是xml中的字符串声明,可以在编译时就发现依赖关系中的错误。要理解weld中的依赖注入,需要了解几个基本概念:
  • Injection 位置
  • Qualifier annotations
  • Alternatives
  • Client proxies
  • InjectionPoint 对象


来看一下spring中的bean定义及依赖注入
	<bean id="userService" class="org.devproof.portal.core.module.user.service.UserServiceImpl">
		<property name="userDao" ref="userDao"/>
		<property name="configurationService" ref="configurationService"/>
		<property name="emailService" ref="emailService"/>
		<property name="roleService" ref="roleService"/>
	</bean>
     

依赖注入
@SpringBean(name = "userService")
private UserService userService;


而在weld中,是不需要进行显式的bean定义的,只要UserService是CDI中的bean,就可以直接注入。
private @Inject UserService userService;
lonvea 2010-04-04
weld中有效依赖注入
1)Inject声明此Field活着Method为运行时即注入的域。
2)使用修饰类型注释注入域的功能类型,如@LoggedIn
3)使用API类型标定实例

大致一个有效而且安全的注入公式例子:

@Inject
@LoggedIn
private UIC uic;
Global site tag (gtag.js) - Google Analytics