정적 변수 문제를 해결하기 위해 스프링이 주입 될 수있다 (턴)

문제
는 오늘 쓰기 JDBCUtils 도구에 원하는 학습 과정에 바인딩 연결 스레드 만보고 널 포인터 예외가 인터넷 후에 봄 정적 멤버 변수를 지원하지 않는 검색 것으로 밝혀졌다 시험에 주입, 재판은 그렇게 확신 빛 @Autowired 그것은 허용되지 않습니다. 도구를 작성하지만 우리는 확실히 정적 변수와 메소드를 사용하고자 할 때, 나는 주입을 달성 할 수있는 정적 멤버 변수의 방법을 사용하는 것을 요약.

@Component
 공공  클래스 JDBCUtils { 
    @Autowired 
    개인  정적 ComboPooledDataSource은 dataSource; 

    개인  정적 의 ThreadLocal <접속> TL =  의 ThreadLocal <접속> ();
    공공의  고정 연결 getThreadConnection () { 
        접속 CONN = tl.get ();
        경우 (CONN == ) { 
            CONN = 의 getConnection (); 
            tl.set (CONN); 
        } 
        반환 CONN; 

    } 
    공공  정적데이터 소스 getDataSource는 () {
         반환 데이터 소스; 
    } 
    공용  정적 연결의 getConnection () { 
        접속 연결 = ;
        시도 { 
            연결 = 적인 DataSource.getConnection를 (); 
        } 캐치 (예외 : SQLException 전자) { 
            e.printStackTrace (); 
        } 
        반환 연결; 

    } 
    공공  정적  무효 removeThreadConnection () { 
        tl.remove (); 
    } 
}

세트 주입법

주석 방법

추가 @Component 노트에서 공과를 시작하기 전에, 플러스 두 가지 설정 방법에 @Autowired 코멘트
변수 1. 구성 파일 구성되어있는 매개 변수를
제거하는 정적 수정 2. 정적 변수를 자동으로 생성 설정 방법을 가지고, 또는 그렇지 못할 주입

@Component
 공공  클래스 JDBCUtils { 

    개인  정적 ComboPooledDataSource은 dataSource; 
    @Autowired 
    공개  공극 setDataSource (ComboPooledDataSource 데이터 소스) { 
        JDBCUtils.dataSource = 은 dataSource; 
    }

XML 방법

또한 참고 정적 집합을 제거하는 방법

공공  클래스 JDBCUtils {
     개인  정적    ComboPooledDataSource은 dataSource; 

    공개  공극 setDataSource (ComboPooledDataSource은 dataSource) {
          .dataSource = 은 dataSource; 
    } 


    개인  정적 의 ThreadLocal <접속> TL =  의 ThreadLocal <접속> ();
    공공의  고정 연결 getThreadConnection () { 
        접속 CONN = tl.get ();
        경우 (CONN == ) { 
            CONN = 의 getConnection (); 
            tl.set (CONN);
        }
         반환 CONN; 

    } 
    공용  정적 데이터 소스는 getDataSource () {
         반환 데이터 소스; 
    } 
    공용  정적 연결의 getConnection () { 
        접속 연결 = ;
        시도 { 
            연결 = 적인 DataSource.getConnection를 (); 
        } 캐치 (예외 : SQLException 전자) { 
            e.printStackTrace (); 
        } 
        반환 연결; 

    } 
    공공  정적  무효 removeThreadConnection () {
        tl.remove (); 
    } 
}
   <콩 ID = "JDBCUtils" 클래스 = "com.cc.utils.JDBCUtils"> 
        <속성 이름 = "는 dataSource"REF = "는 dataSource"> </ 부동산> 
    </ 콩>

@PostConstruct 주입 모드 특수
사용 @PostConstruct 클래스 초기화 방법에있어서, 멤버 변수를 실행 한 후, init 메소드에 첨가 하였다. 이에 앞서, 우리는 우리가 그들의 @Autowired 주입을 달성하는 데 사용할 수있는 그래서, 우리는 변수를 주입 할 수정 정적을 제거, 어떤 도구를 변환해야합니다. 우리는이 변수가 객체를 참조 통과 할 때 그런 정적 클래스 자체 개체에 대한 참조를 추가합니다.

@Component
 공공  클래스 JDBCUtils { 
    @Autowired 
    개인   ComboPooledDataSource 데이터 소스;
    개인  정적의 JDBCUtils의 jdbcUtils; 
    @PostConstruct 
    공개  공극 () {INIT를 
        jdbcUtils = ;
         .dataSource = 은 dataSource; 
    } 

    개인  정적 의 ThreadLocal <접속> TL =  의 ThreadLocal <접속> ();
    공공의  고정 연결 getThreadConnection () { 
        접속 CONN = tl.get ();
        경우 (CONN == ) { 
            CONN = 의 getConnection (); 
            tl.set (CONN); 
        } 
        반환 CONN; 

    } 
    공용  정적 데이터 소스는 getDataSource () {
         반환 jdbcUtils.dataSource 단계; 
    } 
    공용  정적 연결의 getConnection () { 
        접속 연결 = ;
        시도 { 
            연결 = jdbcUtils.dataSource.getConnection를 (); 
        } 캐치 (예외 : SQLException 전자) { 
            e.printStackTrace ();
        } 
        반환 연결; 

    } 
    공공  정적  무효 removeThreadConnection () { 
        tl.remove (); 
    } 
}

물론,이 또한 XML 구성 초기화 방법, 같은 원리로 사용할 수 있습니다.

공공  클래스 JDBCUtils {
     개인   ComboPooledDataSource은 dataSource; 

    공개  공극 setDataSource (ComboPooledDataSource은 dataSource) {
          .dataSource = 은 dataSource; 
    } 

    개인  정적 JDBCUtils의 jdbcUtils;
    공공  공극 초기화 () { 
        jdbcUtils = ;
         .dataSource = 은 dataSource; 
    } 

    개인  정적 의 ThreadLocal <접속> TL =  의 ThreadLocal <접속> ();
    공공  정적연결 getThreadConnection () { 
        접속 CONN = tl.get ();
        경우 (CONN == ) { 
            CONN = 의 getConnection (); 
            tl.set (CONN); 
        } 
        반환 CONN; 

    } 
    공용  정적 데이터 소스는 getDataSource () {
         반환 jdbcUtils.dataSource 단계; 
    } 
    공용  정적 연결의 getConnection () { 
        접속 연결 = ;
        시도 { 
            연결 =을jdbcUtils.dataSource.getConnection (); 
        } 캐치 (예외 : SQLException 전자) { 
            e.printStackTrace (); 
        } 
        반환 연결; 

    } 
    공공  정적  무효 removeThreadConnection () { 
        tl.remove (); 
    } 
}
<빈 ID = "JDBCUtils 「클래스 ="com.cc.utils.JDBCUtils "INIT 메소드 ="초기화 "> 
        <속성 명 = 데이터 소스" "REF = 데이터 소스" "> </ 속성> 
    </ 콩>

참고 링크 : HTTPS : //blog.csdn.net/chen1403876161/article/details/53644024

----------------
면책 조항 :이 문서는 CSDN 블로거 "qq_42524262 '원본입니다, BY-SA 저작권 계약, 원본 소스 링크이 문을 첨부 해주십시오되는 재생 CC 4.0을 따릅니다. .
원본 링크 : HTTPS : //blog.csdn.net/qq_42524262/article/details/97898796

추천

출처www.cnblogs.com/muxi0407/p/11897191.html