프로젝트를 진행할 때 리스너를 사용하여 스프링 구성 파일을 얻은 다음 필요한 콩을 꺼냅니다. 예를 들어, 웹 사이트 홈페이지를 만듭니다. 제품의 배경 비즈니스 논리가 잘 완료되었다고 가정하면, 우리는 리스너를 만들고 프로젝트 시작에서 홈페이지 데이터를 쿼리하고 응용 프로그램에 넣어야합니다. 먼저 리스너를 만듭니다.
1.이 시작자를 만듭니다
청취자 InitDatalistener를 작성하십시오. ServletContextListener :
/** * @description : todo (프로젝트가 시작될 때 데이터를 초기화하는 데 사용) * @author eson_15 * * // @component // Listener는 웹 계층의 구성 요소입니다. 그것은 봄에 의해 인스턴스화되지 않은 Tomcat에 의해 인스턴스화됩니다. Spring Public Class InitDatalistener 구현 ServletcontextListener {private productservice productservice = null; // productService는 제품 @override public void contextDestroyed (servletcontextevent everent) {} @override public void contextinitialized (servletcontextevent everent) {}} {}} {}}Web.xml에서 리스너를 구성합니다.
위에서 언급했듯이 제품의 일부 비즈니스 논리는 Productservice에 정의되어 있으며이 ProductService는 관리를 위해 Spring에 전달됩니다. 그렇다면 어떻게이 개체를 얻을 수 있습니까? 가장 먼저 확실한 것은 : 우리는 스스로를 얻을 수 없습니다. 왜냐하면 그것이 나오면 Spring의 IOC와 아무 관련이 없기 때문입니다. 그것을 달성하는 세 가지 주요 방법이 있습니다. 우리는 그것을 하나씩 분석하고 마지막으로 장점과 단점을 비교합니다.
2. beans.xml 파일을 직접로드하십시오
이 방법은 간단하고 조잡합니다. 구성 파일을로드 할 필요가 없습니까? 좋아, 다음과 같이로드하겠습니다.
// component // Listener는 웹 계층의 구성 요소입니다. 그것은 봄이 아닌 Tomcat에 의해 인스턴스됩니다. Spring Public Class InitDatalistener 구현 ServletContextListener {Private ProductService ProductService = NULL; // ProductService는 제품 @override public void contextdestroyed (servletcontextevent event) {} @override public void contextinitialized (servletcontextevent event)와 관련된 비즈니스 로직을 정의합니다. ProductService = (ProductService) context.getBean ( "ProductService"); System.out.println (Productservice); // 얻을 수 있는지 확인하기 위해 output // 다음은 특정 ProductsErvice 관련 작업입니다 ...}}이 방법은 완전히 괜찮으며 아이디어는 매우 명확합니다. 먼저 구성 파일 Beans.xml을로드 한 다음 Bean을 가져옵니다. 그러나 Tomcat을 시작한 후 콘솔의 정보 출력을 살펴 보겠습니다.
이 시점 에서이 방법의 단점을 찾아야합니다. 구성 파일은 두 번로드되었으므로 콩이 두 번 인스턴스화되었음을 의미합니다. 인쇄 된 정보를 판단하면 구성 파일을 직접로드하고 인스턴스화 한 콩을 얻었습니다. 이 방법은 분명히 바람직하지 않습니다.
3. ServletContext에서 얻으십시오
위의 방법에서, 우리는 스프링이 청취자를 통해 구성 파일을 한 번로드했음을 알 수 있습니다. 다시로드 할 필요가 없습니다. 스프링이 어디로로드되었는지 알면 구성 파일을 얻을 수 있다고 생각하기 쉽습니다. 봄에 구성 파일을로드하는 프로세스를 살펴 보겠습니다.
위 그림 (관련없는 코드가 생략 됨)에서 ContextLoaderListener는 Web.xml에서 구성한 스프링 리스너입니다. 또한 ServletContextListener를 구현하고 컨텍스트 로더를 상속합니다. 리스너에서 구성 파일은 주로 initwebapplicationcontext 메소드를 통해 얻어지고 웹 applicationContext 객체를 만듭니다. initwebapplicationcontext 메소드에서 두 가지 주요 사항이 수행됩니다. 하나는 스프링 컨텍스트를 얻는 것입니다. 다른 하나는 스프링 컨텍스트를 ServletContext에 넣는 것입니다. 키는 다음과 같습니다. webApplicationContext.root_web_Application_context_attribute. 그렇다면 봄의 맥락을 어떻게 얻습니까? Web.xml에서 구성된 스프링 경로를 얻는 것입니다. config_location_parm은 실제로 문자열 상수이며 web.xml에서 다음과 같은 구성된 스프링 리스너입니다.
<CERLXT-PARAM> <Param-Name> ContextConfigLocation </param-name> <!-config_location_parm is contextConfigLocation-> <param- value> classPath : beans.xml </param- value> </context-param>
따라서 web.xml에서 구성된 경로를 통해 Beans.xml을 얻은 다음이 구성 파일을로드하고 Bean을 인스턴스화하는 것이 분명합니다.
스프링 후 구성 파일을로드하고 ServletContext에 넣으면 여기로 가서 직접 얻을 수 있습니다!
// component // Listener는 웹 계층의 구성 요소입니다. 그것은 봄이 아닌 Tomcat에 의해 인스턴스됩니다. Spring Public Class InitDatalistener 구현 ServletContextListener {Private ProductService ProductService = NULL; @override public void contextDestroyed (servletcontextevent event) {// todo 자동 생성 메소드 스터브} @override public void contextinitialized (servletcontextevent event) {// 비즈니스 로직 클래스 쿼리 제품 정보 정보 // 솔루션이 시작되면 스프링 구성 파일이 스프링 리스너를 통해로드됩니다. ServletContext에서 얻기 만하면됩니다. ApplicationContext Context = (ApplicationContext) event.getServletContext () .getAttribute (webApplicationContext.root_web_application_context_attribute); ProductService = (ProductService) context.getBean ( "ProductService"); System.out.println (Productservice); }} 이런 식으로, 우리는 Producerservice의 인스턴스화 된 객체를 얻을 수 있습니다. 이 방법은 양호하지만 GetAttribute의 매개 변수는 너무 길다. 그 당시 프로그래머의 이마가 잘린지 모르겠습니다. 나는 그가 더 적합한 다른 이름을 생각할 수 없다고 생각합니다 ~
4. Spring <br />가 제공 한 도구 클래스를 통해로드 스프링을 개발 한 큰 사람들은이 매개 변수의 이름이 너무 길다는 것을 깨달았으므로 구성 파일을로드 할 수있는 메소드 클래스를 제공했습니다.
공개 클래스 초기 initdatalistener 구현 ServletContextListener {private productService productService = null; @override public void contextDestroyed (servletcontextevent event) {// todo 자동 생성 메소드 스터브} @override public void contextinitialized (servletcontextevent event) {// 비즈니스 로직 클래스 query query query webapplicationcontext context = webapplicationContUtils (webApationContUtils.getScontext); ProductService = (ProductService) context.getBean ( "ProductService"); System.out.println (Productservice); }} 실제로, getWebApplicationContext 메소드는 위의 방법을 캡슐화합니다. 이 방법의 소스 코드를 살펴 보겠습니다.
public static webApplicationContext getWebApplicationContext (ServletContext SC) {return getWebApplicationContext (sc, webApplicationContext.root_web_application_context_attribute); }이것은 프로그래머가 호출하는 것이 더 편리합니다. 그게 전부입니다 ... 따라서 우리는 일반적으로 세 번째 방법을 사용하여 Spring의 구성 파일을 얻으므로 해당 인스턴스형 Bean을 얻습니다.
원본 링크 : http://blog.csdn.net/eson_15/article/details/51373937
위는 iPhone 6splus wechat 충돌에 대한 솔루션입니다. 모든 사람에게 도움이되기를 바랍니다. 또한 Wulin.com을 지원하고 Wulin.com에서 더 흥미로운 콘텐츠에 더 많은 관심을 기울이기를 바랍니다.