머리말
오늘날, 우리가 익숙한 Tomcat, Struts2, Netty 등과 같은 거의 대부분의 Java 응용 프로그램은 그것들을 계산할 수 없습니다.
범용을 충족시키기 위해 사용자가 기능을 사용자 정의 할 수 있도록 구성 파일이 제공됩니다.
Netty와 같은 네트워크 프레임 워크도 거의 완전히 구성된 중심이되며 일반적으로 이러한 소프트웨어를 "마이크로커 아키텍처"라고합니다.
당신이 그것을 구성하든 그것은 그것이 무엇인지입니다.
그것은 당신이 그것을 구성하는 것입니다.
가장 일반적인 구성 파일 형식은 XML, 속성 및 기타 파일입니다.
이 기사에서는 구성을로드하는 데있어 가장 일반적이고 일반적인 시나리오에 대해 설명합니다.이 시나리오는 구성 파일을 Java의 Pojo 객체에 매핑하는 것입니다.
다양한 로딩 방법을 구현하는 방법에 대해 토론하십시오. 예를 들어, 일부 구성은 로컬 XML 파일에서로드되며 일부 구성은 로컬 속성 파일에서로드해야하므로 일부 구성은 네트워크를 통해로드해야합니다.
이러한 구성로드 메커니즘을 구현하는 방법이 메커니즘을 갖추면 코드로드 구성이 어디에나 퍼지지 않으며 확장 가능하고 관리 가능합니다.
로더를 구성하십시오
먼저 구성 로더가 필요 하며이 구성 로더에는 다양한 로딩 방법이있을 수 있습니다. 따라서 인터페이스를 사용하여 다음과 같이 설명합니다.
/** * * * @author bean * @date 2016 년 1 월 21 일 오전 11:47:12 AM * @version 1.0 */public interface iconfigloader <t> * {/** * t * * @return * @Throws configexception */public t load () trows configection;}로드 그러나 왜이 인터페이스에서 제네릭을 선언해야합니까?
분명히, 구성 로더를 사용하려면이 구성 로더에게로드 후 얻은 결과를 알려야합니다.
예를 들어, 구성을로드하고 AppleConfig 객체를 얻으려면 위에서 정의 된 인터페이스를 사용할 수 있습니다.
ICONFIGLOADER <AppleConfig> 로더 = 새로운 AppleConfigloader <AppleConfig> (); appleconfig config = loader.load ();
따라서 구성 파일의 정보를 AppleConfig 객체로 변환하면이 AppleConfig 객체 인스턴스를 얻을 수 있습니다.
지금까지 AppleConfigloader가 구성 파일을로드하는 방법의 특정 노동을 구현하는 한 구성을 쉽게로드 할 수있는 것으로 보입니다.
말할 수는 있지만, 특성, DOM, SAX를 통한로드 또는 일부 타사 오픈 소스 라이브러리를 통한로드와 같은 구성이 다른 방식으로로드 될 수있는 것은 아닙니다.
따라서 로더를 구성하는 것 외에도로드 방법을 구성하는 다른 역할이 필요합니다. 그것을 iconfigprovider라고합시다.
로딩 방법의 제공자를 구성하십시오
구성로드 방법을 제공하는 사람은 구성 로더에로드 메소드를 제공 할 수 있습니다. 즉, 구성 로더에 객체를 제공 할 수 있습니다.
DOM을 통해로드되면 제공자는 로더에 문서 개체를 제공합니다.
속성을 통해로드되면 제공자는 로더에 속성 객체를 제공합니다. Apache-Commons-Digester3 (Tomcat Configuration Loading)과 같은 타사 클래스 라이브러리가 제공 한 방법을 통해로드 된 경우, 제공자는 로더 제공 업체에 소화조 객체를 제공하는 것이 좋습니다.이를 제공하는 것입니다. 즉, 로더를 구성하는 데 필요한 객체 만 제공하는 것만으로도 부하를 구성하는 데 참여하지 않습니다.
우리는 인터페이스 아이콘 피그 프로비더를 사용 하여이 공급자를 정의합니다
/** * * * @author bean * @date 2016 년 1 월 21 일 오전 11:54:28 AM * @version 1.0 */public 인터페이스 iconfigprovider <t> {/** * config를로드하는 데 사용되는 구성 소스를 제공합니다 * @Throws configException */public t rowse () trows configexception;} 여기에 제네릭을 선언하는 이유는 무엇입니까?
제공자가 필요한 경우 최소한 제공자에게 제공 해야하는 내용을 알려야합니다.
따라서 제공자가 제공 할 내용은 이에 의해 결정됩니다.
동시에, 우리는 먼저 공장을 건설하고 특정 제공 업체를 생산할 수 있습니다.
/** * * * @author bean * @Date 2016 년 1 월 21 일 오전 11시 56 분 21 일 * @version 1.0 */public class configProviderFactory {private configproviderfactory () {vask new unsupportedOperationException ( "공장 클래스 초기화 할 수 없음 :" + getImplas (); } public static iconfigprovider <cument> createocumentProvider (String Filepath) {return new DocumentProvider (FilePath); } public static iconfigprovider <properties> createPropertiesProvider (String FilePath) {return new PropertiesProvider (FilePath); } public static iconfigprovider <Digester> createGesterProvider (String FilePath) {return new DigesterProvider (FilePath); }}특정 구성 로더를 구현할 수 있습니까?
아직 괜찮지 않습니다!
이 시점에서 Apple.xml이라는 구성 파일이 있다고 가정합니다. 그리고 우리는이 apple.xml을 dom을 통해 AppleConfig 객체에로드해야합니다.
우선, 제공자 공장을 통해 문서를 제공 할 수있는 공급자를 만들고 싶습니다. 그런 다음이 공급자를 얻고 문서 객체를 얻기위한 제공 메소드를 호출 할 수 있습니다.
문서 객체를 사용하면 구성을로드 할 수 있습니다.
그러나 Bananaconfig, PearConfig ......를로드하려면 단계가 동일합니다. 따라서 기본 공통 동작을 구현하려면 추상 클래스가 필요합니다.
/** * * * @author bean * @date 2016 년 1 월 21 일 오전 11:59:19 AM * @version 1.0 */public acblack class actractconfigloader <t, u> implements iconfigloader <t> {보호 된 iconfigprovider <u> 제공자; 보호 된 AbstractConfigloader (iconfigprovider <u> 제공자) {this.provider = 공급자; } / * * @ @Seee IconFigloader#load () * / @override public t load ()는 configException {return load (getProvider ()); } public Abstract t load (u loadersource)는 configException을 던집니다. 보호 된 ICONFIGPROVIDER <U> getProvider () {return this.provider; }}각 구성 로더에는 제공자를 수신하는 매개 변수 생성자가 있습니다.
일반적인 것은 AppleConfig 또는 Bananconfig를로드 할 것인지 여부를 나타냅니다. 일반적인 <u>는로드 할로드 방법, 문서, 속성 또는 기타 기능을 나타냅니다.
실용적인 응용 프로그램 예
채소 시장 구성 파일 시장 .xml은 사과와 계란의 두 가지 제품을 포함하여 야채 시장의 제품을 구성합니다.
<market> <plect> </color> <price> 100 </price> </apple> <gard> <weight> 200 </weight> </egg> </Market>
각 스톨, 소유자 .properties에 보스 이름에 대한 구성 파일도 있습니다.
port1 = Steve Jobsport2 = Bill Gatesport3 = Kobe Bryant
다음 클래스를 먼저 정의해 봅시다.
MarketConfig.java
/** * * * @author bean * @date 2016 년 1 월 21 일 오후 11:03:37 * @version 1.0 * */public class MarketConfig {private appleconfig appleconfig; 개인 에그 콘피드 에그 컨디그; Private OwnerConfig OwnerConfig; public appleconfig getappleconfig () {return appleconfig; } public void setAppleConfig (appleconfig appleconfig) {this.appleconfig = appleconfig; } public eggconfig geteggconfig () {return eggconfig; } public void seteggconfig (eggconfig eggconfig) {this.eggconfig = eggconfig; } public OwnerConfig getOwnerConfig () {return OwnerConfig; } public void setownerconfig (weenconfig onererconfig) {this.ownerconfig = onererconfig; }}AppleConfig.java
/** * * * @author bean * @date 2016 년 1 월 21 일 오후 11:03:45 * @version 1.0 */public class appleconfig {private int price; 개인 문자열 색상; 공개 void setPrice (int price) {this.price = price; } public int getPrice () {return this.price; } public void setColor (문자열 색상) {this.color = 색상; } public String getColor () {return this.color; }}eggconfig.java
/** * * * @author bean * @date 2016 년 1 월 21 일 오후 11:03:58 * @version 1.0 * */public class eggconfig {private int weight; public void setweight (int weight) {this.weight = weight; } public int getweight () {return this.weight; }} ondererconfig.java
/** * * * @author bean * @date 2016 년 1 월 21 일 오후 11:04:06 * @version 1.0 * */public class OwnererConfig {private map <string, string> 소유자 = New Hashmap <String, String> (); public void addowner (String portname, String onder) {this.owner.put (portname, owner); } public String getownerByportName (String portName) {return this.owner.get (portName); } public map <string, String> getowners () {return collections.unmodifiablemap (this.owner); }} 이 예제에는 두 가지 구성로드 방법, 즉 DOM 및 특성 로딩 방법이 있습니다.
따라서 우리의 공급자는 두 개의 제공 업체와 함께 공장을 건설해야합니다.
그리고 두 개의 구성 로더를 정의해야합니다.
OwnerConfigloader
/** * * * @author bean * @date 2016 년 1 월 21 일 오후 11시 24 분 50 일 * @version 1.0 */public class OwnererConfigloader는 acpractConfigloder <onderconfig, properties> {/** * @param provider */protected ownerconfigloader (iconfigprovider <provider) {super (provider)); } / * * @Seee AbstractConfigloader#load (java.lang.object) * / @override public onererconfig load (속성 소품)는 configException {ondererConfig onererConfig = new OwnerConfig (); / ** * 소품을 사용하여 소유자의 속성 값을 설정하십시오. }}그런 다음 MarketConfigloader가 있습니다
import org.w3c.dom.document;/** * * @author bean * @author bean * @date 2016 년 1 월 21 일 오후 11시 18 분 56 초 * @version 1.0 * */public class MarketConfigloader <MarketConfig, Document> {/** * @param provider */protected Camegcodloader (iconfigprovider) {weptrovider); } / * * AbstractConfigloader#load (java.lang.object) * / @override public MarketConfig Load (문서 문서) configException {MarketConfig MarketConfig = New MarketConfig (); appleconfig appleconfig = 새로운 appleconfig (); eggconfig eggconfig = new eggconfig (); / ** * 문서를 여기에서 처리 한 다음 * AppleConfig 및 Eggconfg *를 얻을 수 있습니다. MarketConfig.seteggconfig (eggconfig); / ** * OwnerConfig가로드하기 위해 속성이 필요하기 때문에 XML이 아니기 때문에 새로운 welderConfigloader를 만들고 oloderConfig */ ownererConfigloader onerconfigloader = new OwnerConfigloder (configProvidErfactory.createPriperTiesProvider (your_file_Path))를 위임해야합니다. oloderconfig onvelseerconfig = ondererconfigloader.load (); MarketConfig.setownerconfig (welderconfig); Return MarketConfig; }}그렇다면 응용 프로그램 수준에서 MarketConfig를 어떻게 얻습니까?
MarketConfigloader MarketConfigloader = New MarketConfigloader (configproviderFactory.CreatedOcumentProvider (Your_File_Path));
MarketConfig MarketConfig = MarketConfigloader.load ();
아마도 사람들이 놀랄 곳이있을 수 있습니다. 분명히 4 개의 구성 클래스가 있으므로 두 개의 구성 로더가있는 이유는 무엇입니까?
MarketConfig, EggConfig 및 AppleConfig는 모두 동일한 XML 구성 파일에서로드되므로 문서 개체가 사용되는 한 MarketConfigloader를 통해로드 할 수 있습니다.
OwnerConfig는 다른 로딩 방법이므로 다른 로더가 필요합니다.
끝
이 기사에서 제안 된 구성로드 메커니즘은 실제로 구성을로드하는 데 도움이 될 수 없습니다. 이것은 dom, sax 및 dom4j 및 digester와 같은 다른 오픈 소스 라이브러리에 맡겨야합니다.
그러나이 기사에서 제안 된 구성로드 메커니즘은 구성 로딩 메커니즘을보다 유연하고 확장하기 쉽게 만들 수 있으며 여러 구성로드 방법을 통합하고 하나의 메커니즘에 통합하며 자체 포인트를 재생할 수 있습니다.
실제로, 일부 소프트웨어는 종종 struts2와 같은 여러 형식의 구성 파일과 최근 혈액을 조사하고 구토 한 국내 오픈 소스 데이터베이스 미들웨어 소프트웨어와 같은 구성 파일의 구성을로드해야합니다.
완전한 구성로드 메커니즘이 없으면 코드가 더 흩어져 있고 유지 관리가 적습니다. 사람들이 피를 구토하게 할 수 있습니다.