봄-다례 대상prototype-생명주기 방법 문제

4763 단어
다중 대상spring용기는 생성만 책임지고 회수는 책임지지 않습니다
@Lazy(true)//구성 지연 로드 @Scope("prototype")//기본값은singleton
@Lazy(true)와 @Scope("prototype")가 동시에 나타날 때, 이 쓰기 무효 지연 로드는 단일 역할 영역 대상에만 적용됩니다
//ElementType.TYPE  , ElementType.METHOD  ElementType.CONSTRUCTOR //ElementType.PARAMETER , ElementType.FIELD 
//@Retention(RetentionPolicy.RUNTIME) , 
//@Documented , javadoc 
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lazy {

    /**
     * Whether lazy initialization should occur.
     */
    boolean value() default true;

}

/spring-ioc-v5/src/main/java/utils/OpenDataSource.java
package utils;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
/**
 * @Component  bean 
 *
 */
@Component
@Scope("prototype")// singleton
public class OpenDataSource {//key , 
    /**
     * @PostConstruct  
     *  jdk1.7
     */
    @PostConstruct
    public void init(){
        System.out.println("OpenDataSource.init()");
    }
    /**
     * @PreDestroy  
     *  jdk1.7
     */
    @PreDestroy
    public void close(){
        System.out.println("OpenDataSource.close()");
    }
}

/spring-ioc-v5/src/main/java/config/AppRootConfig.java
package config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
 *  spring-configs.xml
 * @Configuration  
 * @ComponentScan  
 */

@Configuration
@ComponentScan("utils") // spring 
public class AppRootConfig {
}
package test;

import org.junit.After;
import org.junit.Before;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import config.AppRootConfig;

public class TestBase {
    protected AnnotationConfigApplicationContext ctx;

    @Before
    public void init(){
        ctx = new AnnotationConfigApplicationContext(AppRootConfig.class);
    }
    @After
    public void close(){
        ctx.close();
    }
}
package test;

import org.junit.Test;

import utils.OpenDataSource;

public class TestOpenDataSource01 extends TestBase{
    @Test
    public void testOpenDataSource(){
        // bean 
        OpenDataSource ds1 = ctx.getBean("openDataSource",OpenDataSource.class);
        OpenDataSource ds2 = ctx.getBean("openDataSource",OpenDataSource.class);
        // bean 
        System.out.println(ds1==ds2);
    }
}

pom.xml

  4.0.0
  com.gq
  spring-ioc-v5
  0.0.1-SNAPSHOT
    
        
            org.springframework
            spring-context
            4.3.9.RELEASE
        
        
        
            junit
            junit
            4.12
        
        


    
    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.5.1
                
                    1.8
                    1.8
                    UTF-8
                
            
        
    



실행 결과
클래스가 여러 번 설정되어 있기 때문에 close () 방법을 사용하지 않은 것을 볼 수 있습니다.
  06, 2018 3:54:25   org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
 : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@368239c8: startup date [Thu Sep 06 15:54:25 CST 2018]; root of context hierarchy
OpenDataSource.init()
OpenDataSource.init()
false
  06, 2018 3:54:26   org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
 : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@368239c8: startup date [Thu Sep 06 15:54:25 CST 2018]; root of context hierarchy

좋은 웹페이지 즐겨찾기