명확한 목표
이 기사가 해결하고자하는 문제를 간단히 설명하겠습니다. 더 이상 스프링을 사용하여 봄에 Bean 인스턴스를 만들지 말고 Bean Creation Process를 개발자에게 전송하는 방법을 설명하겠습니다.
분명한 생각
Bean 인스턴스를 만드는 방법 :
1) 생성자를 통해 (매개 변수가 있거나없는)
방법 : <bean id=""/>
2) 정적 공장 방법을 통해
방법 : <bean id="" factory-method="静态工厂方法"/>
참고 : 공장 클래스 인스턴스가 생성되지 않았습니다
3) 인스턴스 공장 방법 (비 정적 메소드)을 통해
방법:
<bean id="factory"/>
<bean id="" factory-bean="factory" factory-method="实例工厂方法"/>
참고 : 공장 클래스 인스턴스가 생성됩니다
실용적인 방법
Example 1 :
필요:
1 Bean.xml이로드 될 때 Bean을 인스턴스화하고 싶지 않지만 인스턴스화 된 개체에서로드 된 Bean.xml을 분리하고 싶습니다.
2 싱글 톤 Bean 구현
위의 상황에서는 콩을 공장 메드를 통해 만들 수 있습니다.
이런 식으로 Bean.xml이로드되면 콩은 직접 인스턴스화되지 않지만 공장에서 언급 한 방법이 호출 될 때만 진정으로 인스턴스화되기 시작합니다.
구현 : Spring Factory-Method를 통해 Singleton Bean을 만듭니다
먼저 정적 내부 클래스를 통해 싱글 톤 객체 생성
package com.spring.test.factorymethod; public class stage {public void perform () {system.out.println ( "show start ..."); } private stage () {} private static class StageSingleTonholder {static stage instance = new Stage (); } public static stage getInstance () {return StagesingEtonHolder.instance; }}스프링 구성 파일 GetInstance에서로드 방법을 지정하십시오
<? xml version = "1.0"alcoding = "utf-8"?> <beans xmlns : xsi = "http://www.w.w.2001/xmlschema-instance"xmlns = "http://ww.springframework.org/schema/beans" xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id = "thestage"factory-method = "getinstance"
응용 프로그램 컨텍스트에서 Bean을 호출하여 인스턴스를 가져옵니다
package com.spring.test.factorymethod; import org.springframework.context.applicationcontext; import org.sprameframework.context.support.support.classpathxmlapplicationContext; public static void main (string [] args) {ApplicationContext ctx = new classPathXmlApplicationContext ( "bean.xml"); 단계 단계 = ((단계) ctx.getBean ( "thestage")); // getInstance (); stage.perform (); }}실행 결과
2015 년 1 월 24 일 오후 6:38:18 org.springframework.context.support.abstractApplicationContext PrepareResh 정보 : 새로 고침 org.sprameframework.support.classpathxmlapplicplicationcontext@512dbd1a : startup date [Sat 24 18:38:18 cst 2015]; 컨텍스트의 루트 Hierarchyyjan 24, 2015 6:38:19 pm org.springframework.beans.beans.factory.xml.xmlbeandefinitionreader loadbeandefinitions 정보 : 클래스 경로 자원에서 XML Bean 정의로드 [Bean.xml] 2015 년 1 월 24 일 오후 6:38:19 PM. org.springframework.beans.beans.support.defaultListableBeanFactory preinstantiatesingletons information : org.springframework.beans.beans.support.defaultlistablebeanfactory@2d1879ea : 콩, sonnet29, sonnet29, sonnnet29, sonnet29, sonnet29; 공장의 근원 계층 성능이 시작됩니다 ...
공장 방법 제작 Bean 소개
1. 정적 공장 방법을 사용하여 콩을 만듭니다
정적 팩토리 메소드를 사용하여 Bean 인스턴스를 만들 때 클래스 속성을 지정해야하지만 현재 클래스 속성은 Bean 인스턴스를 지정하는 구현 클래스가 아니라 정적 공장 클래스입니다. Spring은 Bean 인스턴스를 만들기 위해 어떤 공장을 사용할 것인지 알아야하기 때문입니다. 또한 정적 공장 메소드 이름을 지정하려면 공장 메드를 사용해야합니다. Spring은 정적 공장 방법 (매개 변수 세트가 포함될 수 있음)을 호출하여 Bean 인스턴스를 반환합니다. 지정된 Bean 인스턴스가 얻어지면 스프링 이후의 처리 단계는 일반 방법을 사용하여 Bean 인스턴스를 만드는 것과 정확히 동일합니다. 정적 공장 방법을 사용하여 콩을 만들 때이 공장 메드는 정적이어야합니다. 이 구절은 조금 어지러워서 말하지 않고 코드를 추가하십시오.
먼저 인터페이스를 정의하면 정적 메소드가 인터페이스의 인스턴스를 생성합니다.
Public Interface Animal {public void sayhello ();}인터페이스의 두 가지 구현 클래스는 다음과 같습니다.
공공 계급 고양이는 동물 {개인 문자열 msg; // 종속성 주입 중에 필요한 세터 메소드 공개 void setmsg (String Msg) {this.msg = msg; } @override public void sayhello () {system.out.println (msg + ", Meow ~ Meow ~"); }} 공공 계급 개는 동물 {개인 문자열 msg; // 종속성 주입 중에 필요한 세터 메소드 공개 void setmsg (String Msg) {this.msg = msg; } @override public void sayhello () {system.out.println (msg + ", strong ~ strong ~"); }}아래의 AnimalFactory Factory에는 정적 인 getanimal 방법이 포함되어 있으며 전달 된 매개 변수를 기반으로 생성 할 객체를 결정합니다. 이것은 전형적인 정적 공장 디자인 패턴입니다.
Public Clas AnimalFactory {public static animal getanimal (문자열 유형) {if ( "cat".equalsignorecase (type)) {return new cat (); } else {return new Dog (); }}}Spring이 AnimalFactory를 사용하여 동물 물체를 생성하도록 지정 해야하는 경우 Spring 구성 파일에서 다음을 구성 할 수 있습니다.
<!-고양이를 생성하기위한 getanimalfactory의 getanimal 메소드를 구성합니다-> <bean id = "cat"factory-method = "getanimal"> <!-정적 공장 메소드의 매개 변수를 구성하면, getanimal 메소드는 cat-type 객체를 생성합니다-> <constructor-arg value = "cat" /> <! value = "cat" /> < /bean> <!-개를 생성하기위한 getanimalfactory의 getanimal 메소드를 구성합니다-> <bean id = "dog"factory-method = "getanimal"> <!-정적 공장 메소드의 매개 변수를 구성합니다. <속성 이름 = "msg"value = "dog" /> < /bean>
위의 구성에서, 우리는 두 콩의 두 콩 구성의 클래스와 공장 메드가 동일한 정적 공장 클래스와 동일한 정적 공장 방법을 사용하여 생성되기 때문에 두 콩의 두 콩 구성이 정확히 동일하다는 것을 알 수 있습니다. 이 정적 공장 메소드에 지정된 매개 변수는 다르기 때문에 <생성자 -ARG /> 요소를 사용하여 정적 공장 메소드의 매개 변수를 지정하십시오.
두 개의 콩 인스턴스 고양이와 개를 얻는 주요 프로그램의 방법은 변경되지 않았습니다. 스프링 컨테이너의 getBean () 만 호출하면됩니다.
공개 클래스 테스트 {public static void main (String args []) {ApplicationContext context = new ClassPathXmlApplicationContext ( "ApplicationContext.xml"); 동물 a1 = context.getBean ( "cat", Animal.class); a1.sayhello (); 동물 a2 = context.getBean ( "개", 동물성); a2.sayhello (); }}출력 결과 :
<code> 고양이, Meow ~ meow ~ dog, strong ~ strong ~ </code>
정적 공장 메소드를 사용하여 인스턴스를 생성 할 때는 인스턴스를 생성하는 공장 클래스 및 정적 공장 메소드를 제공해야합니다. 정적 공장 메소드를 통해 인스턴스를 생성 할 때는 스프링 구성 파일을 다음과 같은 변경해야합니다.
클래스 속성은 Bean 인스턴스의 구현 클래스가 아니라 Bean 인스턴스를 생성하는 정적 공장 클래스입니다.
공장 메드를 사용하여 Bean 인스턴스를 생성하기위한 정적 공장 메소드를 지정하십시오.
정적 팩토리 메소드에 매개 변수가 필요한 경우 <생성자-arg /> 요소를 사용하여 구성하십시오.
Spring이 정적 공장 메소드를 사용하여 Bean 인스턴스를 생성한다고 지정할 때 Spring은 먼저 구성 파일을 구문 분석하고 구성 파일에 지정된 정보를 기반으로 반사를 통해 정적 공장 클래스의 정적 공장 메소드를 호출하고 정적 공장 메소드의 반환 값을 Bean 인스턴스로 사용합니다. 이 과정에서 Spring은 더 이상 Bean 인스턴스를 생성 할 책임이 없으며 Bean 인스턴스는 사용자가 제공 한 정적 공장 방법에 의해 제공됩니다.
2. 인스턴스 팩토리 메소드를 사용하여 콩을 만듭니다
인스턴스 팩토리 메소드는 정적 공장 메소드와 약간 다릅니다. 정적 공장 메소드를 호출하면 공장 클래스를 사용하면 필요하며 인스턴스 팩토리 메소드를 호출하려면 공장 인스턴스를 사용해야합니다. 따라서 스프링 구성에는 한 가지 차이가 있습니다. 정적 공장 클래스를 지정하기 위해 정적 공장 메소드를 구성하고 인스턴스 팩토리 메소드를 구성하여 공장 인스턴스를 지정합니다. 위의 동일한 예는 다음과 같은 동물 변형을 바꿉니다.
Public Clas AnimalFactory {public Animal Getanimal (문자열 유형) {// 여기서 정적 키워드는 ( "cat".EqualSignoreCase (type)) {return new Cat (); } else {return new Dog (); }}}스프링 파일은 다음으로 수정됩니다.
<!-공장 클래스를 먼저 구성합니다-> <bean id = "AnimalFactory" /> <!-여기서 우리는 공장 콩을 사용하여 인스턴스 공장 클래스 객체를 사용하여 공장 클래스 객체를 지정합니다-> <bean id = "cat"factory-bean = "AnimalFactory"factory-method = "getanimal"> <! <septory-arg vales = " /> <ms. value = "cat" /> < /bean> <bean id = "dog"factory-bean = "Animalfactory"Factory-Method = "getanimal"> <생성자-arg 값 = "dog" /> <property name = "msg"value = "dog" /> < /bean>
테스트 클래스를 수정할 필요가 없으며 출력 결과는 위와 동일합니다.
대부분의 경우 <bean id = "bean1"class = "..." />는 콩을 정의하는 데 사용됩니다. 이 방법으로 스프링은 기본 매개 변수가없는 생성자를 호출하여 Bean 인스턴스를 만듭니다. 또한 공장을 사용하여 Bean 인스턴스를 만들어 콩 생성 및 사용을 분리하고 Bean Creation Work를 공장에 넘겨 줄 수 있습니다.
공장 콩을 구성하는 세 가지 방법이 있습니다.
추상 인터페이스 :
public interface imusicbox {public void play (); } 1. 정적 공장 방법에 대한 Bean 예제를 얻으십시오
공장 카테고리 :
public class musicboxfactory {public static imusicbox createmusicbox () {return new imusicbox () {public void play () {System.out.println ( "Play Piano ..."); }}; }}구성 파일 :
<bean id = "musicbox"factory-method = "createmusicbox" />
테스트 클래스 :
public static void main (string [] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext ( "bean-config.xml"); imusicbox musicbox = (imusicbox) ctx.getbean ( "musicbox"); musicbox.play (); }2. 공장 인스턴스의 방법은 Bean 인스턴스를 얻습니다
공장 카테고리 :
public class musicboxfactory {public imusicbox createmusicbox () {// 정적 수정 없음 return new imusicbox () {public void play () {System.out.println ( "Play Piano ..."); }}; }}구성 파일 :
<bean id = "FactoryBean" /> <bean id = "Musicbox"Factory-bean = "FactoryBean"Factory-Method = "Createmusicbox" />
"Factory-Bean"속성은 공장 Bean을 지정하고 "Factory-Method"속성은 Bean 인스턴스를 얻기위한 공장 메소드를 지정합니다.
테스트 클래스 :
public static void main (string [] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext ( "bean-config.xml"); imusicbox musicbox = (imusicbox) ctx.getbean ( "musicbox"); musicbox.play (); } 3. 공장 클래스는 org.springframework.beans.factory.facotrybean 인터페이스를 구현합니다
공장 카테고리 :
org.springframework.beans.factory.ctorybean import; 공개 클래스 MusicboxFactory2는 FactoryBean {public object getObject () throws exception {return new Imusicbox () {public void play () {System.out.println ( "Play Piano ..."); }}; } public class getObjectType () {return imusicbox.class; } public boolean issingleton () {return false; }}구성 파일 :
<bean id = "musicbox"/>
테스트 클래스 :
public static void main (string [] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext ( "bean-config.xml"); // 팩토리 IMUSICBOX MusicBox = (imusicbox) ctx.getBean ( "MusicBox")의 "제품"을 추가하고 반환하지 않습니다. musicbox.play (); // 팩토리 클래스 인스턴스 객체를 추가하고 반환합니다. obj = ctx.getBean ( "& musicbox"); System.out.println (obj.getClass (). getName ()); }FactoryBean 인터페이스를 구현하는 클래스는 일반 콩으로 간주되지 않으며 Spring은 자동으로이를 감지하고 GetObject 메소드를 호출하여 Bean 인스턴스를 얻습니다.
요약
이것은 Spring Factory Methods에서 콩 인스턴스 인스턴스를 소개하는 끝입니다. 단점이 있으면 메시지를 남겨두고 지적 할 수 있습니다. 이 사이트를 지원해 주신 친구들에게 감사드립니다!