Spring에서 bean의 몇 가지 주입 방식을 상세히 설명하다

우선 스프링의 빈의 주입 방식을 배우려면 주입에 의존하는 것이 무엇인지 알아야 한다.의존 주입은 호출 클래스가 특정한 인터페이스에 대한 실현 클래스의 의존 관계를 제3자가 주입하도록 함으로써 호출 클래스가 특정한 인터페이스 실현 클래스에 대한 의존을 없애는 것을 말한다.
스프링 용기에서 지원하는 의존 주입 방식은 주로 속성 주입, 구조 함수 주입, 공장 방법 주입이 있다.다음은 이 세 가지 의존 주입 방식과 그것들의 구체적인 설정 방법을 상세하게 소개할 것이다.
1. 속성 주입
속성 주입은 setXXX () 방법으로 bean의 속성 값이나 의존 대상을 주입합니다.속성 주입 방식은 선택성과 유연성이 높은 특징을 가지고 있기 때문에 실제 개발에서 가장 자주 사용하는 주입 방식이기도 하다.
스프링은 먼저 bean의 기본 구조 함수 실례화 bean 대상을 호출한 다음에 반사 방법으로 set 방법을 호출해서 속성 값을 주입합니다.
속성 주입은 bean에 기본 구조 함수를 제공하고 주입이 필요한 속성에 set 방법을 제공해야 합니다.
TIps: 기본 구조 함수, 즉 매개 변수가 없는 구조 함수입니다.클래스에 사용자 정의 구조 함수가 없으면 시스템(JVM)은 자동으로 인자가 없는 기본 구조 함수를 생성하고, 클래스에 인자가 있는 구조 함수를 현저하게 사용자 정의하면 기본 구조 함수를 자동으로 생성하지 않으며, 인자가 없는 구조 함수를 수동으로 추가해야 한다.
다음은 Spring에서 bean의 속성 주입 방식을 실례로 보여 줍니다.
사용자 클래스 작성:

package com.Kevin.bean;
/**
 *  bean 
 * @author Kevin
 *
 */
public class User {  
  private String username;
  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }
}
구성 파일:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->

  <!--   -->
  <bean id="user" class="com.Kevin.bean.User">
    <property name="username">
      <value>Kevin</value>
    </property>
  </bean>  
</beans>
그 중에서 모든 속성 값은property 탭에 대응하고name 속성 값은 클래스의 속성 이름입니다.bean 구현 클래스에는 그에 대응하는 구현 방법 setUsername () 이 있습니다.
Tips:Spring은 bean에 setter 방법이 포함되어 있는지만 검사할 뿐, 대응하는 속성 변수가 있는지에 대해서는 구체적인 요구를 하지 않지만, 약정된 규칙에 따라 상응하는 속성 변수를 설정하는 것이 가장 좋다.
Spring에서 레이블의 명명 사양:
  • Spring의 라벨에 지정된 속성 이름과 bean 구현 클래스의 setter 방법은 Sun JavaBean의 속성 명명 규범, 즉 XXX의 속성이 setXX()에 대응하는 방법을 만족시킨다
  • 일반적인 상황에서 자바의 속성 변수 이름은 모두 소문자로 시작하지만 특수한 의미의 영문 줄임말을 고려하여 자바빈도 대문자로 시작하는 변수 이름을 허용한다.그러나 다음 두 가지를 충족해야 합니다.
  • 변수의 앞의 두 자모는 모두 대문자이거나 모두 소문자이다
  • 그러나 일반적인 프로그래밍 습관으로 말하자면 속성명은 모두 소문자를 사용하는 것이 가장 좋고 프로그래밍과 읽기에 편리하다
  • 속성 주입 방식에 있어 인위적으로 프로필에서만 보증을 제공할 수 있을 뿐 문법 단계에서는 보증을 제공할 수 없다.이때 구조 함수를 사용하여 이런 방식을 주입하여 요구를 더욱 잘 만족시켜야 한다.
    2. 구조 함수 주입
    구조 함수 주입은 속성 주입을 제외한 또 다른 상용 주입 방식으로 일부 필요한 속성이 bean 실례화 시 설정되고 실례화 후에 사용할 수 있음을 보장한다.
    구조 함수를 사용하여 주입하는 전제는 bean이 반드시 참고를 가진 구조 함수를 제공해야 한다는 것이다.
    구성 파일은 구조 함수를 주입할 때 다음과 같은 방법으로 사용할 수 있습니다.
  • 유형에 따라 입참한다
  • 색인에 따라 일치합니다
  • 연합 사용 유형과 인덱스가 일치합니다
  • 자신의 유형 반사를 통해 입참한다
  • [유형별 입참 방식 일치]
    bean 코드 작성:
    
    package com.Kevin.bean;
    /**
     *  bean 
     * @author Kevin
     *
     */
    public class Person {
      private String name;
      private Integer age;
      public String getName() {
        return name;
      }
      public void setName(String name) {
        this.name = name;
      }
      public Integer getAge() {
        return age;
      }
      public void setAge(Integer age) {
        this.age = age;
      }
    }
    
    구성 파일을 작성하려면 다음과 같이 하십시오.
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
    
      <!--   -->
      <bean id="person" class="com.Kevin.bean.Person">
        <constructor-arg type="String">
          <value>Kevin</value>
        </constructor-arg>
        <constructor-arg type="Integer">
          <value>20</value>
        </constructor-arg>
      </bean>  
    </beans>
    
    
    Spring의 구성 파일은 요소 레이블 순서와 무관한 구성 정책을 사용하기 때문에 구성 정보의 확실성을 어느 정도 보장할 수 있습니다.
    그러면 bean의 구조 함수의 여러 가지 유형 매개 변수가 같을 때 유형에 따라 입참하는 방식은 헷갈리기 쉬우므로 색인에 따라 입참하는 다른 방식을 사용해야 한다.
    [인덱스에 따라 입참하기]
    bean 코드 작성:
    
    package com.Kevin.bean;
    /**
     *  bean 
     * @author Kevin
     *
     */
    public class Student {
      private String name;
      private String gender;
      private Double score;
      public Student(String name, String gender, Double score) {
        super();
        this.name = name;
        this.gender = gender;
        this.score = score;
      }
    }
    구성 파일은 다음과 같이 작성됩니다.
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
    
      <!--   -->
      <bean id="student" class="com.Kevin.bean.Student">
        <constructor-arg index="0" value="Kevin"></constructor-arg>
        <constructor-arg index="1" value="Male"></constructor-arg>
        <constructor-arg index="2" value="66"></constructor-arg>
      </bean>  
    </beans>
    
    Tips: 속성 주입 시 Spring은 자바 bean의 규범에 따라 설정 속성과 대응하는 setter 방법을 확정하고 자바 반사 메커니즘으로 속성을 호출하는 setter 방법으로 속성 주입을 완성합니다.그러나 자바 반사 메커니즘은 구조 함수의 인삼 이름을 기억하지 못하기 때문에 우리는 구조 함수의 인삼 이름을 제정하여 구조 함수의 설정을 할 수 없기 때문에 우리는 인삼의 유형과 인덱스를 통해 구조 함수의 속성 주입을 간접적으로 완성할 수 밖에 없다.
    [공동 사용 유형과 색인 일치 입참]
    일부 복잡한 프로필에서는 type과 index를 동시에 사용해야 구조 함수의 매개 변수 주입을 완성할 수 있습니다.다음은 실례를 사용하여 보여 드리겠습니다.
    bean 작성:
    
    package com.Kevin.bean;
    /**
     *  bean 
     * @author Kevin
     *
     */
    public class Teacher {
      private String name;
      private String address;
      private double salary;
      private int age;
      public Teacher(String name, String address, double salary) {
        super();
        this.name = name;
        this.address = address;
        this.salary = salary;
      }
      public Teacher(String name, String address, int age) {
        super();
        this.name = name;
        this.address = address;
        this.age = age;
      }
    }
    이 클래스에는 두 개의 재부팅 구조 함수가 있는데 그들은 모두 세 개의 매개 변수가 있다. 이런 상황에서 type과 index를 사용하는 방법은 요구를 완성할 수 없다. 이때 두 개의 속성을 동시에 사용해야 한다.
    구성 파일:
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
    
      <!--   -->
      <bean id="teacher" class="com.Kevin.bean.Teacher">
        <constructor-arg index="0" type="String">
          <value>Kevin</value>
        </constructor-arg>
        <constructor-arg index="1" type="String">
          <value>China</value>
        </constructor-arg>
        <constructor-arg index="2" type="int">
          <value>20</value>
        </constructor-arg>
      </bean>  
    </beans>
    세 번째 인덱스 형식에 중점을 두고 있음을 알 수 있습니다. 그래서 프로필에 인덱스와 형식을 지정하면 스프링이 어떤 구조 함수에 인자를 주입했는지 알 수 있습니다.
    Tips: 저희가 설정해야 할 파일에 잘못된 뜻이 있습니다. 스프링 용기는 정상적으로 시작할 수 있고 오류가 발생하지 않습니다. 랜덤으로 일치하는 구조 함수 실례화 bean을 사용합니다.무작위로 선택한 구조 함수는 사용자가 필요로 하는 것이 아닐 수도 있기 때문에 우리는 프로그래밍을 할 때 이런 잘못된 뜻이 발생하지 않도록 조심해야 한다.
    [자체 유형 반사 일치 입참]
    만약에 bean구조함수 입참의 유형이 판별할 수 있다면,java반사 메커니즘은 구조함수 입참의 유형을 얻을 수 있기 때문에, 구조함수 주입이 유형과 색인 정보를 제공하지 않더라도,Spring은 구조함수 정보의 주입을 완성할 수 있다.예를 들어 다음 실례에서 Manager 클래스의 구조 함수의 인삼 유형은 판별할 수 있다.
    Manager 클래스 작성:
    
    package com.Kevin.bean;
    /**
     *  Bean 
     * @author Kevin
     *
     */
    public class Manager {
      private String name;
      private Double salary;
      private Person person;
      public Manager(String name, Double salary, Person person) {
        super();
        this.name = name;
        this.salary = salary;
        this.person = person;
      } 
    }
    구성 파일을 작성하려면 다음과 같이 하십시오.
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
    
      <!--   -->
      <bean id="manager" class="com.Kevin.bean.Manager">
        <constructor-arg>
          <value>Kevin</value>
        </constructor-arg>
        <constructor-arg>
          <ref bean="user"/>
        </constructor-arg>
        <constructor-arg>
          <ref bean="person"/>
        </constructor-arg>
      </bean>  
    </beans>
    상기 몇 가지 방법은 구조 함수 파라미터의 주입을 실현할 수 있으나 문제의 발생을 피하기 위해 현식 index와 type을 사용하여 구조 함수의 인삼 정보를 설정하는 것을 권장합니다.
    3. 공장 방법 주입
    공장 방법은 응용에서 자주 사용되는 디자인 모델이자 반전과 단일 실례 디자인 사상을 통제하는 주요한 실현 방법이다.공장 클래스는 하나 이상의 공장 클래스 실례를 만드는 것을 맡고 공장 클래스 방법은 일반적으로 인터페이스나 추상적인 클래스 변수의 형식으로 목표 클래스 실례를 되돌려준다.
    공장류는 대외적으로 목표류의 실례화 절차를 차단했고 호출자는 심지어 구체적인 목표류가 무엇인지 지정할 필요가 없었다.스프링 용기는 프레임워크 방법으로 공장 방법의 기능을 제공하고 개발자에게 투명하게 개방되기 때문이다.따라서 수작업으로 공사 방법을 짜는 것은 매우 드물다.그러나 일부 유류 시스템이나 제3자 라이브러리에서 공사 방법에 부딪히면 스프링 공장 주입 방법으로 스프링 주입을 할 수 있다.
    스프링 공장에서 주입하는 방법은 정태와 비정태 두 가지로 나눌 수 있다.
    [비정적 공장 방법]
    일부 공장 방법은 비정태적이어서 반드시 화학 공장류를 실례한 후에야 공장 방법을 사용할 수 있다.다음은 실례를 통해 보여 드리겠습니다.
    공장 클래스 작성:
    
    package com.Kevin.factorybean;
    /**
     *  
     * @author Kevin
     *
     */
    
    public class BookFactory {
      public Book buyBook(){
        Book book = new Book();
        book.setName("Think in Java");
        return book;
      }
    }
    구성 파일 작성:
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
    
      <!--   -->
      <bean id="bookFactory" class="com.Kevin.factorybean.BookFactory"></bean>
      <bean id="book" factory-bean="bookFactory" factory-method="buyBook"></bean>
      </beans>
    
    bookFactory의 공장 방법은 정태적이지 않기 때문에 먼저 공장 종류의 bean을 정의한 다음factory-bean 속성을 통해 공장 bean의 실례를 인용해야 한다.속성factory-method를 통해 대응하는 공장 방법을 지정합니다.
    [정적 공장 방법]
    많은 공장류 방법은 정태적이다. 이것은 공장류 실례를 만들 필요가 없는 상황에서 공장류 방법을 호출할 수 있다는 것을 의미한다.따라서 정적 공정 방법은 비정적 공장 방법의 호출보다 더욱 편리하고 간결하다.다음은 하나의 실례를 통해 정적 공장 방법을 보여 준다.
    factory 클래스 작성:
    
    package com.Kevin.factorybean;
    /**
     *  
     * @author Kevin
     *
     */
    public class CarFactory {
      public static Car createCar(){
        Car car = new Car();
        car.setBrand("Lamborghini");
        return car;
      }
    }
    
    구성 파일을 작성하려면 다음과 같이 하십시오.
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
    
      <!--   -->
      <bean id="car" class="com.Kevin.factorybean.Car" factory-method="createCar"></bean>  
    </beans>
    
    총결산
    Spring은 세 가지 선택 가능한 주입 방식을 제공하지만 실제 응용 프로그램에서 우리가 도대체 어떤 주입 방식을 선택해야 하는지는 다음과 같은 참고할 만한 기준이 없다.
    구조 함수 주입 이유:
  • 구조 함수는 중요한 속성을 미리 설정한다
  • 모든 속성의 setter 방법을 제공할 필요가 없고 유형의 방법 개수를 감소한다
  • 외부 오류 호출을 피하기 위해 클래스 변수를 더 잘 봉인할 수 있습니다
  • 속성 주입 이유:
  • 속성이 너무 많을 때 구조 함수가 비대해진다
  • 구조 함수 주입의 유연성이 강하지 않기 때문에 때때로 속성에 null값을 주입해야 한다
  • 여러 개의 구조 함수를 만들 때 설정에 잘못된 뜻이 생기고 복잡도가 높아진다
  • 구조 함수는 클래스의 계승과 확장에 불리하다
  • 구조 함수 주입은 순환 의존 문제를 일으킬 수 있다. 
  • 사실 Spring은 우리에게 파라미터를 주입하는 데 이렇게 많은 방법을 제공했다. 그러면 이런 방법은 반드시 그들이 존재하는 이치가 있다. 모든 방법은 어떤 문제에 있어서 독특한 장점을 가진다. 우리는 우리의 구체적인 사용 수요에 따라 적합한 방법을 선택하여 사용하면 되지만 일반적으로 공장 방법을 주입하는 것을 추천하지 않는다.
    이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

    좋은 웹페이지 즐겨찾기