0

OK、Spring MVC 3 を学んでいます。IoC や DI などについてはまだ少し初心者です。古いレガシーの過ちの多くをクリーンアップしたいと考えています。:-)

@Autowired私たちはユーザーサービスなどをとても気に入っています。

ただし、オートワイヤリングで解決したい問題があります。

LoginBeanがあるとしましょう:

public class Login {
    private String username;
    private String email;

    // getters/setters....
}

この Bean は、セッション全体で使用する必要があります。すべてのコントローラーがこの単一のオブジェクトにアクセスできるようにしたいと考えています。

application-config.xml で必要だと思います

<bean id="login" class="com.example.models.Login" scope="session" />

また、次のような別のクラスがあるとしましょう。

public class Employee {
    private String firstName;
    private String lastName;

    private Login login;

    public Employee(Login paLogin) {
        this.login = paLogin;
    }
}

そしてそれをセッションに入れるには:

<bean id="employee" class="com.example.models.Employee" scope="session" />

OK、このアプリケーションの後半では、電子メール通知サービスがあります。そのサービスは、Login Bean からのアクセスusernameemail、Employee Bean からの情報にアクセスする必要があります。確かに、セッション メモリからログイン Bean にアクセスできましたが、これは単なる例です。

@Controller
public class EmailController {

    @Autowired
    Login login;    // this should come from session memory automatically right??

    @Autowired
    Employee employee;    // OK, this should also come from session memory.  Which contains a reference of the login too.  Correct?

    // getters/setters....


    public void sendEmails() {
        // ....
        String email = login.getEmail();
        String firstName = employee.getFirstName();
        // ....
    }
}

これが理にかなっていることを願っています。私たちが本当に達成したいことは、XML 構成の削減、定数パラメーターの受け渡しの削減、最小限の注釈などです。

私を正しい方向に向けることができる助けがあれば幸いです。

ありがとう!

4

1 に答える 1

2

あなたが立てたコントローラーに関するいくつかのこと。

@Controller
public class EmailController {

@Autowired
Login login;    // The container has to create a bean of type Login to autowire into EmailController

@Autowired
Employee employee;    //same as above

// getters/setters....
}

コンテナーがアプリケーションの起動時にシングルトン Bean を作成する必要がある場合は、Login および Employee クラスにアノテーション@Componentを付けてマークする必要があります。@Repository や @Service などのアノテーションでさえ、これを行います。これらの注釈の違いについては、この回答をご覧ください。

したがって、これらのアノテーションのいずれかでクラスをマークすると、アプリケーションの起動時にそれぞれのタイプのシングルトン Bean が作成されます。ログに次のようなものが表示されます

Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@6c811e18

そして、それが作成した Bean のリスト。これらの Bean を他の Bean に注入できます。そして、これらの Bean はセッションに保存されません。ただし、それらはコンテナー自体によって管理されます。

@Controller、@Component などのアノテーションを使用している場合は、xml Bean 定義を廃止できます。また、@Configuration を使用して、xml 構成ファイルの大部分を回避できます。ここここで例を確認できます。

于 2012-10-23T16:17:22.643 に答える