将@Service自动装入第三方库时出现问题

时间:2011-09-20 21:39:59

标签: java spring spring-mvc autowired

目前,我Autowiring myService进入我应用中的各种对象,效果很好。

@Autowired
private MyService myService;

使用此配置:

<context:component-scan base-package="com.myapp.mypackage" />

但是,我添加了第三方库,并希望Autowire myService加入该软件包中的某些对象,但它无效。

我对组件扫描进行了此更改,但当我尝试在第三方软件包中访问它时,我NullPointerException获得了myService

<context:component-scan 
base-package="com.myapp.mypackage, com.thirdparty.thirdpartypackage" />

我认为这会有效吗?

3 个答案:

答案 0 :(得分:4)

对于第三方库,通常的方法是使用xml:

<bean class="com.thirdparty.Foo">
    <property name="somePropertyWithASetter" ref="myService" />
</bean>

您不能依赖注释,因为第三方库很可能不会使用@Autowired

答案 1 :(得分:0)

如果第三方套餐是春季管理的,请忽略其余的答案

我认为在进行依赖注入之前你应该问自己的问题是,对象弹簧是否被管理,要么这样做你要么在spring上下文xml中定义它们,要么用(@component,@ service spring stereo type)注释对象< / p>

让我们看一下手头的案例

  1. 您是否可以访问此第三方源代码?
  2. 第三方是否使用依赖注入?
  3. 如果上述问题的答案是否定的,那么这样做并不容易。
  4. 让我们看一下(MyService)的示例,如果此服务对象具有状态(因为spring对象是单例),如果此服务具有未注入的协作对象

    公共类MyService    {

      //depending on how MyServiceOne is managed makes it hard to retrofit 
      //MyService as a spring bean
      private MyServiceOne serviceone;
    
      //this also would have an adverse affect if you try use this as a spring managed
      //since all spring beans are singleton
      private String someState;
    
    
    }
    

答案 2 :(得分:0)

您是否尝试过使用适配器模式?我相信您可以在适配器上使用@Autowired