web-dev-qa-db-ja.com

外部jarから作成されたSpring Beanを@Autowireするにはどうすればよいですか?

私が作成したモジュール/ jarがあり、utillibraryとして使用しています。そこにサービスを作成しました:

@Service
public class PermissionsService { ... }

...これは、パッケージ内のcom.inin.architect.permissionsにあり、メインアプリケーションでは、このjarを参照/ロードしています(つまり、Maven POMで依存関係として設定しています)。アプリのxmlファイル)など:

<dependency>
        <groupId>com.inin.architect</groupId>
        <artifactId>permissions</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

そして、アプリケーション内で私はそのようなサービスを使用したい:

@Autowired
PermissionsService permissions

アプリケーションの春のセットアップで、私はこれを持っています:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.inin.generator", "com.inin.architect.permissions" })
public class WebConfig extends WebMvcConfigurerAdapter implements ServletContextAware { }

ただし、Tomcatでアプリケーションを実行すると、PermissionsService: "org.springframework.beans.factory.NoSuchBeanDefinitionException:タイプの修飾Beanがありません..."のBeanがないと文句を言います。

それで、どうすればライブラリからBeanをアプリケーションに持ち込めますか?確かに方法があります。これを機能させるには、ライブラリを本格的なMVCアプリケーションとして設定する必要がありますか?つまり、libにも@Configurationと@ComponentScanを設定する必要がありますか?

31
BrianP

少なくとも、注入するクラスを含むパッケージをスキャンする必要があります。たとえば、Spring 4アノテーションの場合:

@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}

XML構成についても同じ原則です。

51

これについてのメモですが、依存関係をスプリングから切り離すことができます。あなたの@Configurationクラス作成

@Bean public PermissionsService  permissionsService(){
   return new PermissionsService()
}

これにより、注入することもできます。スプリングアノテーションを削除する必要はありません。スプリング以外で潜在的に使用可能にするオプションです。

17
Maleck13

わかりました-私はまったく同じ問題を抱えていました-外部jarからmongo dbリポジトリインターフェイスを自動配線したかったです。

  • 私はその瓶からすべてのBeanを自動配線することができます

    @SpringBootApplication(scanBasePackages = {"com.myrootpackage"})

  • ただし、インターフェイスの自動配線は、「blablablaが見つかりませんでした...」で常に失敗しました

しかし、インターフェースは、インポートできるBeanと同じパッケージに含まれていました。 mongo dbインターフェイスの検索では、@ SpringBootApplicationのscanBasePackagesが考慮されていないことが判明しました!

明示的に設定する必要があります

@EnableMongoRepositories(basePackages = {"com.myrootpackage"})

または、メインクラスを「上」に移動して、デフォルトの検索がmongoインターフェイスでも機能するようにすることができます。だから私は問題を理解し、解決策を見つけました。しかし、同じルックアップパスを2回設定する必要があるため、まだ少し不満です。正直に言ってバカだ。

1
Holgi P

com.inin.architect.permissionsのapplication-context.xmlは、メインアプリケーション内で次の方法でインポートできます。

<import resource="classpath:/permissionApplicationContext.xml" />

これにより、定義したcom.inin.architect.permissionsからBeanを自動配線できます。

1
s91g