JavaBean이란 무엇입니까?


1793

나는 "Bean"이 속성과 getter / setter를 가진 Java 클래스라는 것을 이해했다. 내가 이해하는 한 C 구조체와 같습니다. 그게 사실입니까?

또한 빈과 정규 클래스 사이에 실질적인 구문상의 차이가 있습니까? 특별한 정의 나 인터페이스가 있습니까?

기본적으로 왜 이것에 대한 용어가 있습니까?

또한 Serializable인터페이스는 무엇을 의미합니까?


14
참조 자바 콩 사용 장소를? . 특정 규칙을 따르는 수업입니다.
Matthew Flaschen

5
완성을 위해 JavaBeans Specification에 대한 링크가 있습니다.
informatik01

2
그냥 참고하십시오. 사람들이 POJO라는 용어를 던지는 것을 듣는다면 종종 콩을 의미합니다. POJO를 보면 거의 항상 setter와 getter가 있고 직렬화 가능하다.… 실제로 POJO는 setter와 getter, 직렬화 가능 인터페이스 등을 필요로하지 않는다. 단지 특정 요구 사항이없는 Plain Old Java Object 일 뿐이다.
Bill K

답변:


2011

JavaBean은 단지 표준입니다

  1. 모든 개인 속성 ( 게터 / 세터 사용 )
  2. 인수없는 공개 생성자
  3. 구현 Serializable.

그게 다야. 컨벤션 일뿐입니다. 많은 라이브러리가 그것에 의존합니다.

에 관해서 SerializableAPI 문서에서 :

클래스의 직렬화 기능은 java.io.Serializable 인터페이스를 구현하는 클래스에 의해 가능합니다. 이 인터페이스를 구현하지 않는 클래스는 직렬화 또는 직렬화 해제 된 상태가 없습니다. 직렬화 가능 클래스의 모든 하위 유형은 직렬화 가능합니다. 직렬화 인터페이스에는 메소드 또는 필드가 없으며 직렬화 가능의 의미를 식별하는 역할 만합니다.

다시 말해, 직렬화 가능 객체는 스트림, 따라서 파일, 객체 데이터베이스 등에 실제로 기록 될 수 있습니다.

또한 JavaBean과 다른 클래스 간에는 구문상의 차이가 없습니다. 클래스가 표준을 따르는 경우 JavaBean입니다.

표준은 라이브러리가 미리 정의 된 방식으로 정의한 클래스 인스턴스를 사용하여 프로그래밍 방식으로 작업을 수행 할 수 있도록 허용하기 때문에 용어가 있습니다. 예를 들어, 라이브러리가 전달한 객체를 스트리밍하려는 경우 라이브러리가 객체를 직렬화 할 수 있기 때문에 라이브러리가 가능하다는 것을 알고 있습니다 (lib는 객체가 올바른 JavaBeans 여야한다고 가정).


197
내 생각에 콩을 중심으로하는 거의 모든 문서는이 용어를 간결하게 설명 할 수 없습니다. +1
AndaP

10
Bean의 멤버도 Bean이어야합니까? 합리적인 요구 사항 인 것 같습니다.
worldsayshi

14
@worldsayshi-아니요, 필요하지 않습니다. 예를 들어, 빈은 문자열을 포함 할 수 있습니다. String은 빈이 아닙니다. (문자열은 변경할 수 없으므로 빈 생성자와 setter를 호출하여 만들 수 없습니다.) Serializable 객체는 외부에서 직렬화되지 않는 한 Serializable 멤버를 가져야하는 것이 합리적입니다. 따라서 Java Bean 멤버는 Java Bean의 측면을 가질 필요가 없습니다. 그들이 콩이라면 더 간단 하지만 .
Viliam Búr

12
"모든 개인 정보"가 올바르지 않습니다. 프로퍼티는 getter와 setter로부터 추론됩니다 (메소드 X getFoo ()가있는 경우-> bean은 "foo"라는 읽을 수있는 프로퍼티를가집니다. setFoo (X foo) 메소드가있는 경우-> Bean은 "foo"). 속성은 일반적으로 비공개 인 멤버 필드에 의해 지원 될 수 있습니다 (그러나 반드시 그런 것은 아닙니다).
Puce

2
자바 빈이되기를 희망한다. "클래스는 반드시 공개되어야한다". 그리고 Serializable Interface를 구현해야합니까?
Satyabrata sahoo

286

그것을 특별하게 들리게하는 용어가 있습니다. 현실이 그렇게 신비로운 곳은 없습니다.

기본적으로 "Bean":

  • 직렬화 가능한 객체 (즉, 구현 java.io.Serializable하고 올바르게 수행)입니다.
  • getter 및 setter가 특정 이름을 가진 메소드 인 "properties"(예 : getFoo()"Foo"특성의 getter 임)
  • public 0-arg 생성자가 있습니다 (따라서 자유롭게 생성하고 속성을 설정하여 구성 할 수 있음).

최신 정보:

에 관해서는 Serializable그것은 아무것도하지만 자바를 알려주는 "마커 인터페이스"(어떤 함수를 선언하지 않는 인터페이스)를 구현하는 클래스 동의는 "직렬화"(그것은 할 수 있음을 의미한다) 것이 없다 - 프로세스가 변환 : 바이트 스트림으로의 인스턴스 이러한 바이트는 파일에 저장되거나 네트워크 연결 등을 통해 전송 될 수 있으며 JVM (적어도 객체 유형에 대해 알고있는 것)이 나중에 객체를 나중에 재구성 할 수 있도록 충분한 정보를 가질 수 있습니다. 응용 프로그램 또는 전체 다른 시스템에서도!

물론 그렇게하기 위해서는 클래스는 특정 제한 사항을 준수해야합니다. 그중에서도 모든 인스턴스 필드는 기본 유형 (int, bool 등)이거나 직렬화 가능한 일부 클래스의 인스턴스이거나 transientJava가 필드를 포함하지 않도록 표시 되어야합니다. (물론 이것은 transient필드가 스트림을 넘어도 여행에서 살아남지 않음을 의미합니다. 필드가있는 클래스는 transient필요한 경우 다시 초기화 할 수 있도록 준비해야합니다.)

이러한 제한 사항을 준수 할 수없는 클래스는 구현해서는 안됩니다 Serializable(IIRC의 경우 Java 컴파일러에서도이를 허용 하지 않음 ).


이것은 어리석은 질문 일 수 있지만 인스턴스 필드는 기본 유형이나 클래스 인스턴스 외에 무엇을 할 수 있습니까?
kingfrito_5005

8
@ kingfrito_5005 : 하나 또는 다른 하나가 될 것입니다. 그러나 클래스의 인스턴스 인 경우 해당 클래스의 직렬화 가능 여부가 중요합니다. 클래스를 직렬화 할 수 있으려면 클래스가 아닌 transient부분은 직렬화 할 수있는 유형이어야합니다.
cHao

아마도 생성자에 인자가 없어야한다는 것을 잊었을 것이다. 공개 기본 생성자가 있습니다 (따라서 자유롭게 생성하고 속성을 설정하여 구성 할 수 있음).
Amos Kosgei

@AmosKosgei : 잊지 않았다; 중복 될뿐입니다. 정의없이 기본 생성자를 인수없이 호출 할 수 있습니다.
cHao

@Amos : 내가 보았을 때 "기본 생성자"는 Java에서 C ++과 약간 다른 것을 의미하는 것 같습니다. : P "default"를 "0-arg"로 대체했습니다.
cHao

94

JavaBeans는 매우 간단한 코딩 규칙을 준수하는 Java 클래스입니다. 당신이 할 일은

  1. java.io.Serializable인터페이스 구현 -객체의 상태를 저장
  2. 공개 빈 인수 생성자를 사용하여 객체를 인스턴스화하십시오.
  3. 공개 getter / setter 메소드 제공-개인 변수 (properties)의 값을 가져오고 설정합니다.

그런 간단한 설명은 내가 찾던 것입니다. 감사합니다!
Modo

62

자바 빈즈의 속성

JavaBean은 특정 프로그래밍 규칙을 만족시키는 Java 객체입니다.

  1. JavaBean 클래스는 Serializable또는 Externalizable

  2. JavaBean 클래스에는 인수가없는 생성자가 있어야합니다.

  3. 모든 JavaBean 특성에는 공용 setter 및 getter 메소드가 있어야합니다.

  4. 모든 JavaBean 인스턴스 변수는 개인용이어야합니다

자바 빈즈의 예

@Entity
public class Employee implements Serializable{

   @Id
   private int id;
   private String name;   
   private int salary;  

   public Employee() {}

   public Employee(String name, int salary) {
      this.name = name;
      this.salary = salary;
   }
   public int getId() {
      return id;
   }
   public void setId( int id ) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName( String name ) {
      this.name = name;
   }
   public int getSalary() {
      return salary;
   }
   public void setSalary( int salary ) {
      this.salary = salary;
   }
}

3
주석이 필요합니까 아니면 Java Bean의 일부입니까?
giannis christofakis

7
@giannischristofakis 아니요, 주석은 필요하지 않습니다. 주석은 Java Bean을 광범위하게 사용하는 Spring Framework의 일부로 사용됩니다.
Tianxiang Xiong

1
인수없는 생성자가 필요한 이유는 무엇입니까?
Renato

6
@Renato 이것은 매우 간단합니다. arg-constructor로 bean을 자동으로 인스턴스화 해야하는 spring에 대해 생각해보십시오 ... 인수로 무엇을 전달할 것입니까? ;)
Alex75

24

예를 들어 설명하십시오.

1. 수입 java.io.Serializable

직렬화에 대해서는 문서를 참조하십시오 .

2. 개인 분야

외부 클래스가 해당 필드를 쉽게 수정할 수 없도록 필드는 개인용이어야합니다. 해당 필드에 직접 액세스하는 대신 일반적으로 getter / setter 메소드가 사용됩니다.

3. 생성자

인수가없는 공개 생성자

4. 게터 / 세터

개인 필드에 액세스하고 수정하기위한 Getter 및 Setter 메소드

/** 1. import java.io.Serializable */
public class User implements java.io.Serializable {
    /** 2. private fields */
    private int id;
    private String name;

    /** 3. Constructor */
    public User() {
    }
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    /** 4. getter/setter */
    // getter
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    // setter
    public void setId(int id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
}

2
나는 setId(int id)당신이 this.id = id;대신 말하고자하는 신체를 생각합니다this.id = is;
steven7mwesigwa

18

Java Beans는 적은 코드와 더 많은 작업 방식을 위해 사용하고 있습니다 ... Java Beans는 Java EE 전체에서 런타임 발견 및 액세스를위한 범용 계약으로 사용됩니다. 예를 들어, JSP (JavaServer Pages)는 페이지 간 또는 서블릿과 JSP 간의 데이터 전송 오브젝트로 Java Bean을 사용합니다. Java EE의 JavaBeans Activation Framework는 Java Bean을 사용하여 MIME 데이터 유형에 대한 지원을 Java EE에 통합합니다. Java EE 관리 API는 Java EE 환경에서 관리 할 자원을 계측하기위한 기초로 JavaBeans를 사용합니다.

직렬화 정보 :

객체 직렬화에서 객체는 객체의 유형과 객체에 저장된 데이터 유형에 대한 정보뿐만 아니라 객체의 데이터를 포함하는 일련의 바이트로 표현 될 수 있습니다.

직렬화 된 객체가 파일에 기록 된 후에는 파일에서 읽혀지고 역 직렬화 될 수 있습니다. 즉 객체와 해당 데이터를 나타내는 유형 정보 및 바이트를 사용하여 객체를 메모리에 다시 만들 수 있습니다.


17

Bean이 지속되어 서버간에 전송되므로 여러 서버에 프로젝트를 배치 할 때 직렬화가 유용합니다.


1
여러 서버에 프로젝트를 배포하는 방법에 대한 자세한 정보를 제공해 주시겠습니까? 감사합니다
Hanfeng

4
Websphere의 경우이 링크 stackoverflow.com/questions/3193345/… 가 도움 이 될 수 있습니다.
Truong Ha

10

Java Beans는 표준이며 기본 구문 요구 사항은 다른 답변에서 명확하게 설명되었습니다.

그러나 IMO는 단순한 구문 표준 이상입니다. Java Beans의 진정한 의미 또는 의도 된 사용법은 표준을 중심으로 다양한 도구 지원과 함께 코드 재사용 및 구성 요소 기반 소프트웨어 엔지니어링을 용이하게합니다. 즉, 개발자가 기존 구성 요소 (클래스)를 조립하거나 작성하지 않고도 응용 프로그램을 빌드 할 수 있도록합니다. 코드 (또는 작은 접착제 코드 만 작성하면됩니다). 불행히도이 기술은 업계에서 과소 평가되고 활용도가 낮 으며이 스레드의 답변에서 알 수 있습니다.

Java Beans에 대한 Oracle 자습서 를 읽으면 이에 대해 더 잘 이해할 수 있습니다.


유용한 게시물 및 링크. Bean을 생각할 때 Oracle 기사에 설명 된대로 실제로 "Visual Builder"유형의 항목을 생각합니다. 큰 방법으로 프레임 워크를 사용하는 다른 프레임 워크가 많이 있는지 궁금합니다.
mike rodent

9

Wikipedia에 따라 :

  1. 클래스에는 공개 기본 생성자가 있어야합니다 (인수 없음). 이를 통해 편집 및 활성화 프레임 워크 내에서 쉽게 인스턴스화 할 수 있습니다.

  2. 클래스 속성은 get, set, is (get 대신 부울 속성에 사용할 수 있음) 및 표준 명명 규칙에 따라 다른 메서드 (소위 접근 자 메서드 및 변경자 메서드)를 사용하여 액세스 할 수 있어야합니다. 이를 통해 프레임 워크 내에서 빈 상태를 쉽게 자동으로 검사하고 업데이트 할 수 있으며, 여기에는 다양한 유형의 특성에 대한 사용자 정의 편집기가 포함됩니다. 세터는 하나 이상의 인수를 가질 수 있습니다.

  3. 클래스는 직렬화 가능해야합니다. [이것은 애플리케이션과 프레임 워크가 VM 및 플랫폼과 독립적 인 방식으로 Bean의 상태를 안정적으로 저장, 저장 및 복원 할 수있게합니다.]

자세한 내용은이 링크 를 참조하십시오 .


7

질문의 두 번째 부분과 관련하여 직렬화는 객체를 부호있는 바이트 시퀀스로 저장하는 데 사용되는 지속성 메커니즘입니다. 덜 공식적으로 말하면 객체의 상태를 저장하므로 나중에 직렬화 해제를 통해 객체를 검색 할 수 있습니다.


7

Java Bean은 다음 규칙을 따라야하는 Java 클래스 [개념적]입니다.

  1. 인수가없는 생성자가 있어야합니다.
  2. 직렬화 가능해야합니다.
  3. getter 및 setter 메소드라고하는 특성 값을 설정하고 가져 오는 메소드를 제공해야합니다.

재사용 가능한 소프트웨어 구성 요소입니다. 여러 개체를 하나의 개체로 캡슐화하여 여러 개체에서 동일한 개체에 액세스 할 수 있으며 코드를 쉽게 유지 관리하기위한 단계입니다.


1
Java Bean에 대해 이야기 할 때 "재사용 가능한 소프트웨어 구성 요소"라는 문구가 마음에 들었습니다. Java Bean은 일반적으로 아무것도 수행하지 않기 때문입니다.
Rodney P. Barbati 2012

6

그것들은 직렬화 가능하고 인수가없는 생성자를 가지며 getter 및 setter 메소드를 사용하여 특성에 액세스 할 수 있습니다. "Bean"이라는 이름은이 표준을 포함하도록 주어졌으며, 이는 Java 용 재사용 가능한 소프트웨어 구성 요소를 작성하는 것을 목표로합니다. according to 위키

애플리케이션의 백본을 형성하고 Spring IoC 컨테이너에 의해 관리되는 객체를 Bean이라고합니다. Bean은 Spring IoC 컨테이너에 의해 인스턴스화, 조립 및 관리되는 객체입니다. 그렇지 않으면, Bean은 단순히 응용 프로그램의 많은 오브젝트 중 하나입니다. according to 봄 io .


4

빈 개념에 대한 약간의 배경 / 업데이트. 다른 많은 답변들은 실제로 그 이유는 있지만 그다지 많은 이유는 없습니다.

이들은 GUI 구축의 일부로 Java에서 초기에 발명되었습니다. 이들은 도구가 쉽게 분리 할 수있는 패턴을 따랐기 때문에 Bean의 속성을 편집 할 수 있도록 특성 패널을 작성할 수 있습니다. 일반적으로 Bean 속성은 화면의 컨트롤을 나타냅니다 (x, y, width, height, text, ..)

또한 강력한 형식의 데이터 구조로 생각할 수도 있습니다.

시간이 지남에 따라 동일한 유형의 액세스를 사용하는 많은 도구에 유용하게되었습니다 (예 : 데이터베이스에 데이터 구조를 유지하기 위해 최대 절전 모드).

도구가 발전함에 따라, 주석쪽으로 더 나아가서 setter / getter 이름을 분리하지 않았습니다. 이제 대부분의 시스템은 Bean을 필요로하지 않으며, 주석 처리 된 속성이있는 일반 오래된 Java 오브젝트를 사용하여 조작 방법을 알려줄 수 있습니다.

이제 콩을 주석이 달린 속성 볼로 간주합니다. 실제로 주석에 유용합니다.

콩 자체는 건강한 패턴이 아닙니다. 그것들은 모든 속성을 외부 조작에 노출시키기 때문에 본질적으로 캡슐화를 파괴합니다. 그것들이 사용됨에 따라 빈 내부에 코드를 생성하는 대신 외부에서 빈을 조작하는 코드를 생성하는 경향이 있습니다 (필수는 아님). '객체에게 가치를 요구하지 말고, 당신에게 무언가를 해달라고 부탁하십시오 "). 게터가 최소화되고 세터가없는 주석이 달린 포조를 사용하면 캡슐화를 훨씬 더 잘 복원하고 불변의 가능성이 있습니다.

그건 그렇고,이 모든 일이 일어나면서 누군가가 개념을 Enterprise Java Beans로 확장했습니다. 이것들은 ... 다르다. 그리고 그들은 많은 사람들이 Bean 개념 전체를 이해하지 못한다고 생각하고 용어 사용을 중단 할 정도로 복잡합니다. 이것은 일반적으로 POJO라고하는 Bean을 듣는 이유입니다 (모든 Java 객체는 POJO이기 때문에 기술적으로는 OK이지만 누군가 POJO라고 들으면 Bean 패턴을 따르는 무언가에 대해 가장 자주 생각합니다)


권리 위반- "물건에게 가치를 요구하지 말고, 물건을 위해 무언가를 요구하십시오")
ARK

3

Java Bean은 다음 세 가지 기준을 충족하는 모든 Java 클래스입니다.

  1. 직렬화 가능 인터페이스 (Marker 인터페이스)를 구현해야합니다.
  2. 생성자는 공용이어야하고 인수가 없어야합니다 (다른 사람들은 "비 인수 생성자"라고 부릅니다).
  3. 게터와 세터가 있어야합니다.

serialVersionUID 필드는 객체 상태를 유지 관리하는 데 중요합니다. 아래 코드는 Bean으로 규정됩니다.

public class DataDog implements java.io.Serializable {

private static final long serialVersionUID = -3774654564564563L;

private int id;
private String nameOfDog;

//The constructor should NOT have arguments
public DataDog () {}


/** 4. getter/setter */

// getter(s)
public int getId() {
    return id;
}
public String getNameOfDog() {
    return nameOfDog;
}
// setter(s)
public void setId(int id) {
    this.id = id;
}
public void setNameOfDog(String nameOfDog) {
    this.nameOfDog = nameOfDog;
}}

2

JavaBean을 이해하려면 다음 사항에주의해야합니다. JavaBean은 개념적인 것이므로 특정 것의 클래스를 나타낼 수 없습니다.

JavaBean은 재사용 가능한 소프트웨어 구성 요소의 작동에서 시각화 할 수있는 개발 도구입니다

JavaBean은 Sun JavaBeans 사양을 기반으로하며 재사용 가능한 구성 요소 일 수 있습니다. 가장 큰 특징은 재사용 성입니다.


1

Bean 특성 , 메소드이벤트에 대한 Java Bean 지침 (디자인 패턴이라고도 함)을 따르는 메소드 이름을 가진 Java 클래스입니다.. 따라서 특성 정의의 일부가 아닌 Bean 클래스의 공용 메소드는 Bean 메소드입니다. 최소한, 단일 멤버 (물론 공개 getter 및 setter가 동반 됨)로서 특성이 있거나 단일 멤버로서 공용 메소드이거나 하나의 공개 이벤트 리스너 등록 메소드 만있는 Java 클래스는 Java Bean입니다. 또한이 속성은 읽기 전용 속성 (게터 메서드는 있지만 세터는 없음) 또는 쓰기 전용 속성 (세터는 메서드 만) 일 수 있습니다. Java bean은 모든 beanbox 도구 또는 컨테이너에 표시 될 수있는 공용 클래스 여야합니다. 컨테이너는 인스턴스화 할 수 있어야합니다. 따라서 공용 생성자도 있어야합니다. 자바 빈즈 사양컨테이너가 컨테이너를 인스턴스화하기 위해 명시 적 또는 기본값 인 공개 0 인수 생성자를 가질 필요는 없습니다. 직렬화 된 인스턴스를 포함하는 파일 (확장명이 .ser 인 파일)을 제공 할 수있는 경우 Beanbox 도구는 해당 파일을 사용하여 프로토 타입 Bean을 인스턴스화 할 수 있습니다. 그렇지 않으면, Bean에는 명시 적 또는 기본값 인 공용 0-args 생성자가 있어야합니다.

Bean이 인스턴스화되면 Java Bean API (java.beans. *)가이를 조사하고 메소드를 호출 할 수 있습니다. BeanInfo 인터페이스를 구현하거나 BeanInfo 구현을 확장하는 클래스 (SimpleBeanInfo 클래스)를 사용할 수없는 경우, 내부 검사에는 리플렉션 (암시 적 내부 검사)을 사용하여 대상 Bean이 지원하는 메소드를 연구 한 후 간단한 설계 패턴 (지침)을 적용하여 추론 할 수 있습니다. 속성, 이벤트 및 공용 메서드가 지원되는 메서드 BeanInfo 인터페이스 (Bean Foo의 경우 FooBeanInfo로 이름 지정되어야 함)를 구현하는 클래스를 사용할 수있는 경우 API는 암시 적 내성을 검사하지 않고이 클래스의 공용 메소드 (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ())를 사용하여 정보. SimpleBeanInfo를 확장하는 클래스가 사용 가능한 경우 재정의 된 SimpleBeanInfo 공용 메소드 (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ())에 따라 대체 된 메소드를 사용하여 정보를 가져옵니다. 재정의되지 않은 메서드의 경우 해당 암시 적 내부 검사로 기본 설정됩니다. 암묵적인 내부 검사가 수행되지 않더라도 빈은 인스턴스화되어야합니다. 따라서 공개 zeri-args 생성자의 요구 사항입니다. 그러나 Serializable 또는 Externalizable 인터페이스는 인식 할 필요가 없습니다. 그러나 Java Bean 사양에 따르면 '내부 상태를 저장하고 싶지 않고 생각하기를 원하지 않는 작은 Bean의 일반적인 경우에는 "사소한"것이기를 바랍니다. 따라서 모든 Bean은 Serializable 또는 Externalizable 인터페이스를 구현해야합니다. 사무용 겉옷, JavaBeans 사양은 Bean을 구성하는 요소에 대해 어렵고 빠르지 않습니다. "JavaBeans 컴포넌트 작성은 놀라 울 정도로 쉽습니다. 특별한 도구가 필요하지 않으며 인터페이스를 구현할 필요가 없습니다. Bean 작성은 단순히 특정 코딩 규칙을 따르는 문제입니다. 클래스를 다음과 같이 작성하면됩니다. 콩 — 콩을 사용하는 도구는 콩을 인식하고 사용할 수 있습니다. " 사소하게, 다음 클래스조차 Java Bean입니다.

public class Trivial implements java.io.Serializable {}

빈 생성자에는 몇 가지 매개 변수가 있습니다. 일부가 간단한 유형이라고 가정하십시오. 컨테이너는 할당 할 값을 모를 수 있습니다. 그렇게하더라도 결과 인스턴스는 재사용 할 수 없습니다. 사용자가 Spring Bean에서와 같이 주석 또는 XML 구성 파일로 구성 (값 지정) 할 수있는 경우에만 의미가 있습니다. 그리고 일부 매개 변수가 클래스 또는 인터페이스 유형이라고 가정하십시오. 다시, 컨테이너는 어떤 값을 할당할지 알지 못할 수 있습니다. 사용자가 주석 또는 xml 구성 파일로 구성 (특정 객체 지정) 할 수있는 경우에만 의미가 있습니다. 그러나 XML (XML 구성 파일을 통해) 에서조차도 특정 객체 (문자열 이름 포함)를 생성자 인수 (생성자 인수의 속성 또는 요소)에 할당하는 것은 유형 안전하지 않습니다. 기본적으로 리소스 주입과 같습니다. 다른 Spring bean (생성자 인자 요소의 via 요소를 통해)에 대한 참조는 기본적으로 의존성 주입이므로 형식이 안전합니다. 분명히, 의존성 (collaborator bean)에는 매개 변수가 삽입 된 생성자가있을 수 있습니다. 주입 된 의존성에는 매개 변수 등이있는 생성자가있을 수 있습니다. 이 시나리오에서는 궁극적으로 생성자에 대한 의존성 주입을 통해 다른 협업 Bean을 생성하기 전에 단순히 새로운 MyBean ()을 호출하여 컨테이너가 인스턴스화 할 수있는 일부 Bean 클래스 (예 : MyBean.class)가 필요합니다. public zero-args 생성자를 갖는 Bean 컨테이너가 의존성 주입을 지원하지 않거나 Spring에서와 같이 일부 주석 또는 xml 구성 파일을 통해 간단한 유형 값을 생성자에 할당하도록 허용하지 않는 경우, 빈 생성자에는 매개 변수가 없어야합니다. Spring bean 애플리케이션조차도 public zero-args 생성자를 갖기 위해 일부 bean이 필요할 것입니다 (예 : Spring 응용 프로그램에 생성자 인수로 단순한 유형의 bean이없는 시나리오).

JSF 관리 Bean은 웹 컨테이너에서 실행됩니다. @ManagedBean 어노테이션 또는 애플리케이션 구성 자원 파일 managed-bean.xml을 사용하여 구성 할 수 있습니다. 그러나 리소스 주입 (유형 안전 아님)을 통한 주입 만 지원합니다. 생성자에 주입하기에 적합하지 않습니다. 그만큼JSF 사양관리 Bean에는 공용 0 인수 생성자가 있어야합니다. 또한이 스펙의 버전 2.3에서이 절에 지정된대로 관리 Bean 기능을 사용하지 않는 것이 좋습니다. 동일한 문제를 해결하기위한 더 우수하고 응집력있는 통합 솔루션은 JSR-365에 지정된대로 CDI (Contexts and Dependency Injection)를 사용하는 것입니다. " CDI 스펙은 웹 티어가 아닌 JEE 플랫폼의 모든 컨테이너에 적용되는 관리 Beans 스펙을 채택하므로 웹 컨테이너는 CDI 스펙을 구현해야합니다.

여기에서 추출한 것입니다 관리 Bean 스펙 "관리 Bean은 최소한의 요구 사항을 가진 컨테이너 관리 오브젝트입니다."POJO "(일반 오래된 Java 오브젝트)라는 이름으로도 알려져 있습니다. Java SE 플랫폼에서 볼 수있는 Java EE 플랫폼 향상 버전의 JavaBeans 컴포넌트 모델로 볼 수 있습니다. …. Managed Beans는 JSF (JavaServer Faces) 기술에서 볼 수있는 동종 설비에 선구자가 있다는 사실을 잊지 못할 것입니다.이 스펙에 정의 된 관리 Bean은 JSF에서 발견 된 것들의 일반화를 나타냅니다. 특히, Managed Beans는 웹 모듈뿐만 아니라 Java EE 애플리케이션의 어느 곳에서나 사용할 수 있습니다. 예를 들어, 기본 컴포넌트 모델에서 관리 Bean은 인수가없는 생성자를 제공해야하지만 CDI (JSR-299)와 같이 관리 Bean을 기반으로하는 스펙을 제공해야합니다. 잘 정의 된 규칙을 따르는 한 Managed Beans가 요구 사항을 완화하고 Managed Beans가 생성자에게 더 복잡한 서명을 제공 할 수 있도록합니다 ... Managed Bean은 최종 클래스, 추상 클래스, 비 정적 내부 클래스가 아니어야합니다. . 관리되는 Bean은 일반 JavaBean 구성 요소와 달리 직렬화 할 수 없습니다.” 따라서 POJO 또는 POJO Bean으로 알려진 관리 Bean의 스펙은 CDI에서와 같이 확장을 허용합니다.

CDI 스펙 은 관리 Bean을 다음과 같이 재정의합니다. Java EE에서 실행될 때 최상위 레벨 Java 클래스는 요구 사항을 충족시키는 경우 관리 Bean입니다.

• 내부 수업이 아닙니다. • 비 추상적 인 클래스이거나 @Decorator로 주석이 달렸습니다. • javax.enterprise.inject.spi.Extension을 구현하지 않습니다. • @Vetoed 또는 @Vetoed로 주석이 달린 패키지에는 주석이 없습니다. • 적절한 생성자가 있습니다. 클래스에 매개 변수가없는 생성자가 있거나 클래스가 @Inject로 주석이 달린 생성자를 선언합니다.

이러한 조건을 만족하는 모든 Java 클래스는 관리 Bean이므로 관리 Bean을 정의하기 위해 특별한 선언이 필요하지 않습니다. 또는

다른 Java EE 스펙에 의해 관리 Bean으로 정의 된 경우

• EJB 구성 요소 정의 주석으로 주석을 달거나 ejb-jar.xml에서 EJB Bean 클래스로 선언되지 않았습니다.

Spring bean과 달리 단순 유형의 생성자를 지원하지 않습니다. Spring 또는 주석과 같은 xml 구성 파일을 사용하여 구성을 지원 한 경우 가능할 수 있습니다.

EJB는 EJB 컨테이너에서 실행됩니다. 그것의 사양"세션 Bean 구성 요소는 관리 Bean입니다." "클래스에는 Bean을 사용하지 않는 공용 생성자가 있어야합니다."세션 Bean과 메시지 구동 Bean 모두에 대해 "세션 Bean 클래스는 SessionBean 인터페이스 나 Serializable 인터페이스를 구현할 필요가 없습니다.” EJBF 의존성 주입은 기본적으로 자원 주입이라는 JSF bean과 같은 이유로 JSF bean은 인수가있는 생성자, 즉 의존성 주입을 통해 생성자를 지원하지 않지만 EJB 컨테이너가 CDI를 구현하는 경우“선택적으로 : 클래스에는 "Inject 주석으로 주석이 달린 추가 생성자"는 세션 Bean 및 메시지 구동 Bean 모두에 대해 말합니다. 콩."


0

실제로 Bean은 사용하기 편리한 객체 일뿐입니다. 그것들을 직렬화한다는 것은 그것들을 쉽게 유지할 수 있다는 것을 의미합니다 (쉽게 복구되는 형태로 저장).

실제 콩의 일반적인 용도 :

  • 재사용이 가능한 간단한 객체 POJO (Plain Old Java Objects)
  • 시각적 개체
  • Spring은 객체를 처리하기 위해 Bean을 사용합니다 (예 : 세션에서 직렬화해야하는 User 객체)
  • EJB (Enterprise Java Beans), JSF Bean (JSF는 매우 오래된 기술 임) 또는 JSP Bean과 같은보다 복잡한 객체

사실 콩은 단지 관습 / 표준입니다 Java 객체에서 동작 (일련 화)하고 특정 방식으로 변경 (속성 설정) 할 수있는 방법을 제공 입니다.

그것들을 사용하는 방법은 당신의 발명 일뿐이지만, 내가 입대 한 가장 일반적인 경우입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.