문제
는 오늘 쓰기 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