Spring常用注記の使い方と役割理解1

9731 ワード

目次
一、実例
@Controller
@RequestMaping
@Service
@Resource
@Autowired
@Repository
@Component
springを使用する場合、これらの寸法は必要不可欠です.今日はそれぞれの役割と使い方をまとめてみましょう.
一、実例
  • 制御層
  • @Controller
    @RequestMapping(value="/car")
    public class Action{
        @Autowired
        private IocCarSrivice iocCarSrivice ;
    
        @RequestMapping(value="/carRun")
        public void carRun(){
            iocCarSrivice.run();
        }
    }
  • service層
  • @Service
    public class IocCarService{
        @Resource
        private IIocCarDao iIocCarDaoImpl;
    
        public void carRun(){
            iIocCarDaoImpl.run();
        }
    }
  • Dao層
  • public interface IIocCarDao{
        void run();
    }
  • Daoレイヤ実装クラス
  • @Repository
    public class IIocCarDaoImpl implements IIocCarDao{
    
        @Override
        public void run(){
            System.out.println("        。");
        }
    }
  • テスト
  • package CarTest;
    
    import java.util.Date;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import com.kq.domain.TransPayLog;
    import com.kq.service.TransPayLogService;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath:applicationContext.xml"})
    public class CarTest{
        @Autowired
        private IocCarService iocCarService;
        @Test
        public void Test3_7(){
           iocCarService.carRun();
        }
    }
    

    入力:古い運転手が運転できる.
    注意:以上が最も簡単な3階層アーキテクチャです.Tomcatの下にパブリッシュされると、サーバは@Controller寸法に従ってSpring Beanファクトリに制御層インスタンスを自動的に注入し、@RequestMappingの上のパスを参照すると、一連の寸法でDao階層にアクセスできます.ここでテストは配布されていないため、手動注入を直接使用します(CarTestクラスの上の注釈を参照する方法、またはBeanFactoryを直接使用する方法について).
     
    @Controller
    使用法:クラスにタグを付ける役割:このbean(クラス)はMVCモデルの制御層であることを注釈するために使用され、配布プロセッサにクラスを認識させ、springのauto-scanによって管理に組み込まれる.一般的に、このタグクラスの中の方法に@RequestMaping("...")を加えられる.ブラウザに直接呼び出され、データ論理処理を行うことができます.例の説明:ブラウザでActionクラスのcarRunメソッド(ローカル)127.0.0.1:8080/car/carRunにアクセスする場合
    @RequestMaping
    使用法:1.@Controllerで表記するクラスにタグを付ける.@Controllerタグ付けされたクラスにタグ付けされるメソッド上の役割:使用法1,この被寸法クラスの下のすべてのメソッドを表す親寸法(すべての用法2「継承」用法1と理解できる)@RequestMapingには6つの属性value、method、consumes、produces、params、headers valueがある:ブラウザ要求のアドレスを指定する;method:要求を指すmethodタイプ、GET、POST、PUT、DELETEなど;
    @Controller
    @RequestMapping("/appointments")
    public class AppointmentsController {
    
        private AppointmentBook appointmentBook;
        
        @Autowired
        public AppointmentsController(AppointmentBook appointmentBook) {
            this.appointmentBook = appointmentBook;
        }
    
        @RequestMapping(method = RequestMethod.GET)
        public Map get() {
            return appointmentBook.getAppointmentsForToday();
        }
    
        @RequestMapping(value="/{day}", method = RequestMethod.GET)
        public Map getForDay(@PathVariable @DateTimeFormat(iso=ISO.DATE) Date day, Model model) {
            return appointmentBook.getAppointmentsForDay(day);
        }
    
        @RequestMapping(value="/new", method = RequestMethod.GET)
        public AppointmentForm getNewForm() {
            return new AppointmentForm();
        }
    
        @RequestMapping(method = RequestMethod.POST)
        public String add(@Valid AppointmentForm appointment, BindingResult result) {
            if (result.hasErrors()) {
                return "appointments/new";
            }
            appointmentBook.addAppointment(appointment);
            return "redirect:/appointments";
        }
    }

    valueのuri値は次の3つです.
    A)通常の具体値として指定することができる.
    B)ある変数を含む値(URI Template Patterns with Path Variables)として指定することができる.
    C)正規表現を含む値(URI Template Patterns with Regular Expressions)のクラスとして指定できます.
    example B)
    @RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
    public String findOwner(@PathVariable String ownerId, Model model) {
      Owner owner = ownerService.findOwner(ownerId);  
      model.addAttribute("owner", owner);  
      return "displayOwner"; 
    }

    example C)
    @RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}")
      public void handle(@PathVariable String version, @PathVariable String extension) {    
        // ...
      }
    }

    consumes:アプリケーション/json、text/htmlなどの処理要求のコミットコンテンツタイプを指定します.
    @Controller
    @RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
    public void addPet(@RequestBody Pet pet, Model model) {    
        // implementation omitted
    }

    メソッドはrequest Content-Typeが「アプリケーション/json」タイプのリクエストのみを処理します.
     
    produces:返されるコンテンツタイプを指定し、requestリクエストヘッダの(Accept)タイプに指定されたタイプが含まれている場合にのみ返されます. 
    @Controller
    @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
    @ResponseBody
    public Pet getPet(@PathVariable String petId, Model model) {    
        // implementation omitted
    }

    メソッドは、requestリクエストのAcceptヘッダに「アプリケーション/json」が含まれているリクエストのみを処理し、返されるコンテンツタイプがアプリケーション/jsonであることを示す.
    params:requestにメソッドを処理するためにいくつかのパラメータ値が含まれている必要があることを指定します. 
    @Controller
    @RequestMapping("/owners/{ownerId}")
    public class RelativePathUriTemplateController {
    
      @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue")
      public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {    
        // implementation omitted
      }
    }

    処理要求に「myParam」という名前の「myValue」という値の要求のみが含まれている. 
    headers:リクエストを処理するにはrequestに指定したheader値を含める必要があることを指定します. 
    @Controller
    @RequestMapping("/owners/{ownerId}")
    public class RelativePathUriTemplateController {
    
    @RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=http://www.ifeng.com/")
      public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {    
        // implementation omitted
      }
    }

    例の説明:ブラウザでActionクラスのcarRunメソッドにアクセスするには、ローカルドメイン名+ポート番号+このマークアップで定義されたvalue値(127.0.0.1:8080/car/carRun)@RequestMapingでよく使用されるvalueとmethodを覚えておくだけで、より詳細な説明--)リンク
    @Service
    使用法:サービス層コンポーネント(Service層)の表示に使用します.ビジネス層コンポーネントに表示すると、beanが定義され、表示されたコンポーネント名に基づいて小文字のbeanが自動的にインスタンス化されます.例の説明:IocCarServiceクラスはbeanとしてマークされ、bean名はiocCarServiceであり、このクラスはspringによって管理され、使用される
    @Resource
    使用法:フィールドまたはsetterメソッドに寸法を付け、@ResourceはデフォルトでByNameで自動アセンブリされます.Beanを自動的にアセンブリし、名前付きリソースの依存注入をアクティブにします.@Resourceプロパティnameは、自動アセンブリBeanの名前インスタンス解釈を定義できます.IocCarServiceクラスでIocCarDaoのインプリメンテーションクラスは@RepositoryにSpringによって管理されているBeanとしてマークされています.この場合、それを使用する必要がある場合は、プロパティ名に@Resourceユーザーの自動アセンブリをマークするだけでいいです.状況1:以下のコードを加えると、印刷出力はやはり:ベテラン運転手だけが運転できる.
    @Repository
    public class IIocCarDaoImplXXX implements IIocCarDao{
    
        @Override
        public void run(){
            System.out.println("           。");
        }
    }

     
    これはおかしいですね.2つの実装クラスです.プログラムはどうして私がどれを呼び出すか知っていますか.CarServiceクラスでは私たちの属性名(private IocCarDao iIocCarDaoImpl;)はiIocCarDaoImplであり、加入したばかりのiIocCarDaoImplXXXではないので印刷されたのはベテランドライバーのみ運転できます.
    ケース2:CarServicerクラスで属性名を変更した場合(private IocCarDao iIocCarDaoImplYY;)エラーが発生します(org.springframework.beans.factory.NoUniqueBeanDefinitionException:No qualifying bean of type[com.ulewo.ioc.IocCarDaoImplYY]is defined:expected single matching bean but found 2:iIocCarDaoImpl,iIocCarDaoImplXXX)は、プログラムが2つのBeanを見つけたことを意味し、iIocCarDaoImplとiIocCarDaoImplXXXという名前ですが、私たちのiIocCarDaoImplYYがないので、報告が間違っています.この場合、ソリューションはプロパティ名を変更したり、@Resource注記で正しい名前を定義したりすることができます.
    @Service
    public class IocCarService{
        @Resource(name="iIocCarDaoImplYYY")
        private IIocCarDao iIocCarDaoImpl;
    
        public void carRun(){
            iIocCarDaoImpl.run();
        }
    }

    このとき、古い運転手でなくても運転を学ぶことができます.
    @Autowired
    この注記は@Resourceの使い方と役割とほぼ一致しています.相違点:1.@ResourceはJ 2 EE、@AutowiredはSpring 2.@Autowiredはタイプ(ByType)による自動組み立ての3.@Autowiredにはname属性がありません.名前でアセンブリする場合は@Qualifierと組み合わせて使用する必要があります.
    @Service
    public class IocCarService{
        @Resource(name="iIocCarDaoImplYYY")
        private IIocCarDao iIocCarDaoImpl;
    
        public void carRun(){
            iIocCarDaoImpl.run();
        }
    }
    //   
    @Service
    public class IocCarService{
        @Autowired
        @Qualifie("iIocCarDaoImplYYY")
        private IIocCarDao iIocCarDaoImpl;
    
        public void carRun(){
            iIocCarDaoImpl.run();
        }
    }

    @Repository
    使用法:ユーザー寸法データアクセス層コンポーネント(Daoレイヤ)機能:Daoアクセスを実装する.クラスをBeanと識別し、マークアップされたクラスから放出されたデータアクセス異常をSpringのデータアクセス異常タイプにカプセル化する.例の説明:Daoレイヤ実装クラスIocCarDaoImplはSpringによってbeanとしてロードされ管理され、bean名はiIocCarDaoImplである.同時にマークアップされたクラスから放出された数をアクセス例外によってSpringにカプセル化されたデータアクセス例外タイプ.Bean名をカスタマイズする必要がある場合は、注記のvalueプロパティ値を変更するだけです.
    @Repository(value="IIocCarDaoImplZZZ")
    public class IIocCarDaoImpl implements IIocCarDao{
    
        @Override
        public void run(){
            System.out.println("           。");
        }
    }

    @Component
    使用法:コンポーネントを指します.コンポーネントが分類しにくい場合は、この注釈を使用して寸法を付けることができます.役割:前の@Service、@Repository、@Controllerと同様に、@Componentよりも大きく細分化されています.
    まとめ:
    @Repository、@Service、@Controller注記では、ラベル付けされたコンポーネントをBeanとしてSpringして管理し、Beanの名前はプロパティによってカスタマイズできます@Repositoryはデータ・アクセス・レイヤとして使用され、@ServiceはServiceレイヤとして使用されます
    @Resource、@Autowired注記は、すでにSpirngによって管理されているBeanを使用します.@Resourceの使い方はByNameです.@Autowiredの使用方法はByTypeで、@Qualifierの使用に合わせてByNameに変更できます.呼び出したBean名もカスタマイズできます