561

control ( )の反転が でどのように機能するかについて、少し混乱しています。IoCSpring

UserServiceImplインターフェイスを実装するというサービス クラスがあるとしUserServiceます。

これはどう@Autowiredですか?

では、このサービスControllersをどのように利用できますか?instantiateinstance

私はちょうど次のようにしますか?

UserService userService = new UserServiceImpl();
4

11 に答える 11

765

まず、最も重要なのは、すべてのSpring Beanが管理されていることです。これらは、「アプリケーションコンテキスト」と呼ばれるコンテナ内で「ライブ」です。

次に、各アプリケーションには、そのコンテキストへのエントリポイントがあります。Webアプリケーションにはサーブレットがあり、JSFはel-resolverなどを使用します。また、アプリケーションコンテキストがブートストラップされ、すべてのBeanが自動配線される場所があります。Webアプリケーションでは、これはスタートアップリスナーになることができます。

自動配線は、あるBeanのインスタンスを別のBeanのインスタンスの目的のフィールドに配置することによって行われます。両方のクラスはBeanである必要があります。つまり、アプリケーションコンテキストに存在するように定義する必要があります。

アプリケーションのコンテキストで「生きている」とは何ですか?これは、コンテキストがあなたではなくオブジェクトをインスタンス化することを意味します。つまりnew UserServiceImpl()、コンテナは各注入ポイントを検出し、そこにインスタンスを設定します。

コントローラには、次のものがあります。

@Controller // Defines that this class is a spring bean
@RequestMapping("/users")
public class SomeController {

    // Tells the application context to inject an instance of UserService here
    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public void login(@RequestParam("username") String username,
           @RequestParam("password") String password) {

        // The UserServiceImpl is already injected and you can use it
        userService.login(username, password);

    }
}

いくつかの注意:

  • で、、、などのアノテーションについてクラスがスキャンされるようにapplicationContext.xml有効にする必要があります。<context:component-scan>@Controller@Service
  • Spring-MVCアプリケーションのエントリポイントはDispatcherServletですが、これはユーザーからは隠されているため、アプリケーションコンテキストの直接的な対話とブートストラップはバックグラウンドで行われます。
  • UserServiceImplBeanとしても定義する必要があります-アノテーションを使用<bean id=".." class="..">または使用します。@Serviceの唯一の実装者UserServiceになるため、注入されます。
  • アノテーションとは別に@Autowired、SpringはXML構成可能な自動配線を使用できます。その場合、既存のBeanと一致する名前またはタイプを持つすべてのフィールドに、自動的にBeanが注入されます。実際、これが自動配線の最初のアイデアでした。つまり、構成なしでフィールドに依存関係を注入するというものでした。@Injectのような他の注釈@Resourceも使用できます。
于 2010-06-30T21:36:05.047 に答える
69

アノテーションルートとBeanXML定義ルートのどちらが必要かによって異なります。

あなたがあなたので定義された豆を持っていたとしましょうapplicationContext.xml

<beans ...>

    <bean id="userService" class="com.foo.UserServiceImpl"/>

    <bean id="fooController" class="com.foo.FooController"/>

</beans>

自動配線は、アプリケーションの起動時に発生します。したがって、fooController引数のためにUserServiceImplクラスを使用したいのでは、次のように注釈を付けます。

public class FooController {

    // You could also annotate the setUserService method instead of this
    @Autowired
    private UserService userService;

    // rest of class goes here
}

が表示されると@Autowired、Springはのプロパティに一致するクラスを探し、applicationContext自動的に挿入します。複数のUserServiceBeanがある場合は、どのBeanを使用するかを限定する必要があります。

次の場合:

UserService service = new UserServiceImpl();

自分で設定しない限り、ピックアップしません@Autowired

于 2010-06-30T21:37:26.027 に答える
10

@Autowired内部ではどのように機能しますか?

例:

class EnglishGreeting {
   private Greeting greeting;
   //setter and getter
}

class Greeting {
   private String message;
   //setter and getter
}

.xml ファイルを使用しない場合は、次のようになります@Autowired

<bean id="englishGreeting" class="com.bean.EnglishGreeting">
   <property name="greeting" ref="greeting"/>
</bean>

<bean id="greeting" class="com.bean.Greeting">
   <property name="message" value="Hello World"/>
</bean>

使用している@Autowired場合:

class EnglishGreeting {
   @Autowired //so automatically based on the name it will identify the bean and inject.
   private Greeting greeting;
   //setter and getter
}

.xml ファイルを使用しない場合は、次のようになります@Autowired

<bean id="englishGreeting" class="com.bean.EnglishGreeting"></bean>

<bean id="greeting" class="com.bean.Greeting">
   <property name="message" value="Hello World"/>
</bean>

それでも疑問がある場合は、以下のライブデモに進んでください

@Autowired は内部でどのように機能しますか?

于 2016-12-19T13:20:08.803 に答える
6

UserServiceImplサービス クラスに注釈を付けるだけです。

@Service("userService")

Spring コンテナーは、このクラスがサービスとして登録されるときに、このクラスのライフサイクルを処理します。

次に、コントローラーで自動配線 (インスタンス化) し、その機能を使用できます。

@Autowired
UserService userService;
于 2016-03-18T09:47:28.817 に答える
4

Spring 依存性注入は、クラスから結合を取り除くのに役立ちます。このようなオブジェクトを作成する代わりに:

UserService userService = new UserServiceImpl();

DI の導入後にこれを使用します。

@Autowired
private UserService userService;

これを実現するには、ファイルにサービスの Bean を作成する必要がありServiceConfigurationます。ServiceConfigurationその後、そのクラスをクラスにインポートしてWebApplicationConfiguration、次のようにその Bean をコントローラーに自動配線できるようにする必要があります。

public class AccController {

    @Autowired
    private UserService userService;
} 

Java 構成ベースの POC here の例を見つけることができます 。

于 2017-09-04T02:28:50.763 に答える
0

制御の反転の全体的な概念は、オブジェクトを手動でインスタンス化し、必要なすべての依存関係を提供する雑用から解放されることを意味します。クラスに適切なアノテーション (例: @Service) を付けると、Spring は自動的にオブジェクトをインスタンス化します。注釈に慣れていない場合は、代わりに XML ファイルを使用することもできます。newただし、 Spring コンテキスト全体をロードしたくない場合に、単体テストで (キーワードを使用して) クラスを手動でインスタンス化することは悪い考えではありません。

于 2017-06-27T10:19:32.327 に答える