주석 기반 DI

목차
  • 1. 주 해 를 사용 하 는 절차
  • 2. @ Component
  • 3. @ Value
  • 4. @ Autowired
  • 5. @ Qualifier
  • 6. @ Resource
  • 7. XML 과 주해 비교
  • spring 의 주 해 를 통 해 자바 대상 의 생 성, 속성 에 대한 할당 을 완 료 했 습 니 다. xml 파일 대신.
    ioc 는 서비스 와 dao 대상 간 의 결합 을 실현 할 수 있 습 니 다.
    자주 사용 하 는 주석:
  • @ Component, 창설 대상
  • @ Respotory, dao 대상 을 만 들 고 데이터 베 이 스 를 방문 합 니 다
  • @ Service, Service 대상 을 만 들 고 업무 논 리 를 처리 하 며 업무 기능 이 있 을 수 있 습 니 다
  • @ Controller, 컨트롤 러 대상 생 성, 요청 수신, 처리 결과 표시
  • @ Value, 간단 한 유형의 속성 할당
  • @ Autowired, spring 프레임 워 크 에서 형식 할당 주 해 를 참조 하여 by Name, by Type, 기본 by Type
  • 을 지원 합 니 다.
  • @ Resource, jdk 의 주 해 는 인용 데이터 형식 할당 을 자동 으로 주입 합 니 다. by Name, by Type, 기본 by Name
  • 을 지원 합 니 다.
    1. 주 해 를 사용 하 는 절차
  • maven 의 의존 spring - context 를 추가 합 니 다. spring - context 를 추가 하 는 동시에 spring - aop 의 의존 도 를 간접 적 으로 추가 합 니 다. 주 해 를 사용 하려 면 spring - aop 의존
  • 을 사용 해 야 합 니 다.
  • 클래스 에 spring 의 주해 (여러 기능 의 주해)
  • 를 추가 합 니 다.
  • spring 설정 파일 에 구성 요소 스캐너 탭 을 추가 하여 프로젝트 의 위 치 를 설명 합 니 다
  • 
    
  • 주 해 를 사용 하여 대상 을 만 들 고 용기 ApplicationContext
  • 를 만 듭 니 다.
    우선 새로운 항목 을 만 들 고 pom. xml 파일 에 의존 도 를 추가 합 니 다.
    
          org.springframework
          spring-context
          5.2.5.RELEASE
    
    

    2. @ Component
    우선 학생 클래스 만 들 기
    package com.md.b1;
    
    import org.springframework.stereotype.Component;
    
    /**
     * @author MD
     * @create 2020-08-08 15:51
    
     * @Component:      ,       
      *       :value        ,   bean id ,
      *          value      ,        spring      
      *       :     
      *
      *  @Component(value = "myStudent")   
     *   
     */
    
    
    //@Component(value = "myStudent")
    
    //      value,  
    
    @Component("myStudent")
    
    //            , spring    :        (student)
    //@Component
    public class Student {
    
        private String name;
        private Integer age;
    
        public Student() {
            System.out.println("  Student       ");
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    

    그리고 spring 설정 파일 에 applicationContext. xml 를 구성 요소 스캐너 에 추가 합 니 다.
    
    
    
        
    
    
       
    
    
    

    테스트:
    package com.md;
    
    import com.md.b1.Student;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    /**
     * @author MD
     * @create 2020-08-08 16:05
     */
    public class MyTest01 {
        @Test
        public void test01(){
            ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
            //         
            Student student = (Student) ac.getBean("myStudent");
            System.out.println(student);
        }
    }
    
    

    주의 1: 여러 가방 의 세 가지 방식 을 지정 합 니 다.
        
        
        
    
        
        
    
        
        
    
    

    중점:
    주의 2: spring 과 @ Component 기능 이 일치 합 니 다. 생 성 대상 에 대한 설명 은 다음 과 같 습 니 다.
  • @ Repository (지구 층 류 에 사용): dao 의 실현 류 위 에 놓 으 면 dao 대상 을 만 들 고 dao 대상 은 데이터 베 이 스 를 방문 할 수 있 음 을 나타 낸다
  • @ Service (업무 층 류 에 사용): service 의 실현 류 위 에 놓 고 service 대상 을 만 듭 니 다. service 대상 은 업무 처 리 를 하고 업무 등 기능 을 할 수 있 습 니 다
  • @ Controller (컨트롤 러 위 에 사용): 컨트롤 러 (프로세서) 클래스 위 에 놓 고 컨트롤 러 대상 을 만 드 는 컨트롤 러 대상 은 사용자 가 제출 한 인 자 를 받 아들 여 요청 한 처리 결 과 를 표시 할 수 있 습 니 다.

  • 상기 세 개의 주해 의 사용 문법 은 @ Component 와 같 습 니 다.대상 을 만 들 수 있 지만 이 세 개의 주 해 는 추가 기능 이 있 습 니 다.
    @ Repository, @ Service, @ Controller 는 프로젝트 의 대상 을 층 으로 나 누 어 줍 니 다.
    어떤 종 류 는 위의 세 개의 주석 이 모두 적합 하지 않 을 때 @ Component 를 사용 합 니 다. : , ?
    3. @ Value 속성 에 주석 @ Value 를 사용 해 야 합 니 다. 이 주해 의 value 속성 은 주입 할 값 을 지정 하 는 데 사 용 됩 니 다.
    이 주 해 를 사용 하여 속성 주입 을 완료 할 때 클래스 에 setter 가 필요 없습니다.물론 속성 에 setter 가 있 으 면 setter 에 추가 할 수 있 습 니 다.
    다음 과 같다.
    package com.md.b2;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    /**
     * @author MD
     * @create 2020-08-08 15:51
     */
    @Component("myStudent")
    public class Student {
        /**
         * @Value:          
         *     : value  String   ,          
         *     : 1.        ,  set  ,    。
         *         2. set     
         */
    
    //    @Value(value = "   ")
        @Value("   ")
        private String name;
    
    //    @Value(value = "18")
        @Value("22")
        private Integer age;
    
        public Student() {
            System.out.println("  Student       ");
        }
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    

    그리고 spring 설정 파일 에 applicationContext. xml 를 구성 요소 스캐너 에 추가 합 니 다.
     
    

    테스트
     @Test
        public void test01(){
    
            ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
            //         
    
            Student student = (Student) ac.getBean("myStudent");
            System.out.println(student);
    //  Student       
    //Student{name='   ', age=22}
    }
    

    4. @ AutowiredbyType
    @ Autowired: spring 프레임 워 크 가 제공 하 는 주석 으로 참조 형식의 할당 을 실현 합 니 다.
    인용 속성 에 주석 @ Autowired 를 사용 해 야 합 니 다. 이 주 해 는 기본적으로 유형 에 따라 Bean 을 자동 으로 조립 하 는 방식 (by Type) 을 사용 합 니 다.
    package com.md.b3;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    /**
     * @author MD
     * @create 2020-08-08 16:39
     */
    
    @Component("student")
    public class Student {
        @Value("   ")
        private String name;
    
        @Value("20")
        private Integer age;
    
        /**
         *       
         * @Autowired:spring       ,         
         * spring                        ,  byName,byType
         *      byType    
         *
         *   :        ,  set  ,  
         *        set     
         */
    
    //      School        ,          bean           set       
        @Autowired
        private School school;
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", school=" + school +
                    '}';
        }
    }
    

    스 쿨 클래스
    package com.md.b3;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    /**
     * @author MD
     * @create 2020-08-08 16:40
     */
    @Component("mySchool")
    public class School {
    
        @Value("  ")
        private String name;
        @Value("  ")
        private String address;
    
        @Override
        public String toString() {
            return "School{" +
                    "name='" + name + '\'' +
                    ", address='" + address + '\'' +
                    '}';
        }
    
        public void setName(String name) {
            this.name = name;
        }
        public void setAddress(String address) {
            this.address = address;
        }
    }
    

    그리고 spring 설정 파일 에 applicationContext. xml 를 구성 요소 스캐너 에 추가 합 니 다.
     
    

    테스트 는 위 와 마찬가지 로 쓰 지 않 습 니 다. 주 해 를 사용 하 는 것 외 에 xml 방식 도 사용 할 수 있 습 니 다.
    이렇게 하면 된다.
     
            
            
        
    

    5. @ QualifierbyName
    @ Autowired 는 기본적으로 by Type 을 사용 하기 때문에 by Name 방식 을 사용 하기 위해 서 입 니 다.
    인용 속성 에 주석 @ Autowired 와 @ Qualifier 를 공동으로 사용 해 야 합 니 다.
    @ Qualifier 의 value 속성 은 일치 하 는 Bean 의 id 값 을 지정 하 는 데 사 용 됩 니 다.
      byName  
    1.        @Autowired  
    2.       @Qualifier(value="bean id")  ,         bean    
                       
    

    스 쿨 클래스
    @Component("school")
    public class School {
    
        @Value("    ")
        private String name;
        @Value("  ")
        private String address;
    
        @Override
        public String toString() {
            return "School{" +
                    "name='" + name + '\'' +
                    ", address='" + address + '\'' +
                    '}';
        }
    }
    
    

    학생 류
    @Component("student")
    public class Student {
    
    
        @Value("   ")
        private String name;
    
        @Value("20")
        private Integer age;
    
    
    //  School            school
        @Autowired
        @Qualifier("school")
        private School school;
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", school=" + school +
                    '}';
        }
    
    }
    

    속성: required, boolean 형식의 기본 true
  • required = true: 인용 형식 할당 이 실 패 했 고 프로그램 이 잘못 보고 되 었 으 며 실행 을 중지 합 니 다.추천 사용
  • required = false: 인용 형식 이 할당 에 실패 하면 프로그램 이 정상적으로 실 행 됩 니 다. 인용 유형 은 null
  • 입 니 다.
    예 를 들 어 위의 프로그램 에서
    byName 방식 을 사 용 했 는데, 이 때 비 안의 id 를 잘못 썼 습 니 다.
  • 기본 값 을 사용 하면 결과 또는 오류
  • 아래 에 쓰 인 대로 집행 하면 틀 리 지 않 지만 데이터 가 비어 있다
  • @Component("student")
    public class Student {
    
        @Value("   ")
        private String name;
    
        @Value("20")
        private Integer age;
    
    //  School            school
        @Autowired(required = false)
        @Qualifier("schoo")
        private School school;
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", school=" + school +
                    '}';
        }
    }
    
    
    

    6. @ Resource
    spring 은 jdk 에서 @ Resource 주석 에 대한 지원 을 제공 합 니 다.
    @ Resource 주 해 는 이름 에 따라 Bean 과 일치 할 수도 있 고 유형 에 따라 Bean 과 일치 할 수도 있 습 니 다.기본 값 은 이름 으로 입력 (by Name)
    이 설명 을 사용 하면 JDK 는 6 이상 버 전이 어야 합 니 다. @ Resource 는 속성 적 으로 도, set 방법 으로 도 가능 합 니 다.
    학교
    @Component("school")
    public class School {
    
        @Value("    ")
        private String name;
        @Value("  ")
        private String address;
    
    
        @Override
        public String toString() {
            return "School{" +
                    "name='" + name + '\'' +
                    ", address='" + address + '\'' +
                    '}';
        }
    
    }
    

    이때
    @Component("student")
    public class Student {
    
        @Value("   ")
        private String name;
    
        @Value("20")
        private Integer age;
    
    
        /**
         *     
         * @Resource:   jdk    ,spring               ,            
         *                       ,  byName, byType .   byName
         *    : 1.        ,  set  ,    。
         *        2. set     
         */
        //   byName:    byName    ,  byName    ,   byType
        //@Resource
    
        //     byName  ,         name,name    bean id(    )
        @Resource(name = "school")
        private School school;
    
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", school=" + school +
                    '}';
        }
    
    }
    
    
    

    spring 설정 파일 에 applicationContext. xml 구성 요소 스캐너 추가
       
    

    테스트:
       @Test
        public void test01(){
    
            ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
            //         
    
            Student student = (Student) ac.getBean("student");
            System.out.println(student);
    
    //       Student{name='   ', age=20, school=School{name='    ', address='  '}}
        }
    

    7. XML 과 주해 비교
    주해 의 장점 은 편리 하고 직관 적 이 며 효율 적 이라는 것 이다.
    단점: 자바 코드 에 하 드 인 코딩 으로 기록 하고 코드 를 다시 컴 파일 해 야 합 니 다.
    자주 고치 지 않 는
    XML 방식 의 장점 은 설정 과 코드 가 분리 되 어 xml 에서 수정 되 며 코드 를 컴 파일 할 필요 가 없고 서버 를 다시 시작 하면 새로운 설정 을 불 러 올 수 있다 는 것 이다.
    단점: 번 거 롭 고 효율 이 낮 으 며 대형 프로젝트 가 너무 복잡 하 다.

    좋은 웹페이지 즐겨찾기