늅늅
545
2019-04-19 12:13:54 작성 2019-04-19 12:14:25 수정됨
4
362

스프링부트2 공부중 자바 기본 질문


안녕하세요 늅늅입니다.


/**
 *    Copyright 2015-2019 the original author or authors.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package sample.mybatis;

import sample.mybatis.dao.CityDao;
import sample.mybatis.dao.CityDao2;
import sample.mybatis.mapper.HotelMapper;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SampleXmlApplication implements CommandLineRunner {

	public static void main(String[] args) {
		SpringApplication.run(SampleXmlApplication.class, args);
	}

	private final CityDao cityDao;
	
	private final CityDao2 cityDao2;

	private final HotelMapper hotelMapper;

	public SampleXmlApplication(CityDao cityDao, HotelMapper hotelMapper) {
		this.cityDao = cityDao;
		this.hotelMapper = hotelMapper;
	}

	@Override
	@SuppressWarnings("squid:S106")
	public void run(String... args) {
		System.out.println(this.cityDao.selectCityById(1));
		System.out.println(this.hotelMapper.selectByCityId(1));
	}

}


스프링부트2 테스트중에 자바 관련 질문입니다.

소스는 위와 같고 

----------------------------------------------------

public SampleXmlApplication(CityDao cityDao, HotelMapper hotelMapper) {

this.cityDao = cityDao;

this.hotelMapper = hotelMapper;

}

-----------------------------------------------

"The blank final field cityDao2 may not have been initialized" 

에러가 발생 합니다.

궁금한게 final 선언한변수(cityDao2) 를 왜 생성자에 매개변수로 넣어주지 않으면 에러가 발생 할까요?


0
0
  • 답변 4

  • cat11
    342
    2019-04-19 12:26:40

    final 키워드의 의미를 생각해보시면 됩니다

    final은 한번 값을 할당하면 불변한 성질을 가지기 때문에 초기화를 해주지 않으면 안됩니다

    1
  • JohnMark
    340
    2019-04-19 12:29:12

    final 키워드가 붙으면 객체 생성시기에 반드시 초기화가 이루어져야합니다.
    따라서 생성자가 호출되는 시점에 멤버 변수 초기화 단계에서 생성자의 인수로 받아와 초기화를 하여 final 객체를 초기화 하거나, final 키워드를 빼주셔야합니다

    1
  • 늅늅
    545
    2019-04-19 12:54:26

    !cat11 !JohnMark


    답변 감사 합니다~

    final 키워드는 보통 상수에 많이 사용 하는데

    sample 소스에서 객체에도 다른 변수를 주입 못시키게 할려고 하는구나 라고 생각하는데


    public SampleXmlApplication(CityDao cityDao, HotelMapper hotelMapper) {

    이 생성자 매개번수 cityDao 객체는 누가 넘겨주지 하고 고민 해봤는데 아무리 봐도 스프링??

    넘겨주는것 같긴 하네요.

    0
  • JohnMark
    340
    2019-04-19 14:09:07

    스프링에서 클래스 프로퍼티의 객체를 생성자에서 인자로 넘겨주어 초기화시키면 스프링 IoC 컨테이너에서는 해당 객체를 빈으로 만들어 주입을 해줍니다. @Autowired 방법보다 권장되는 DI 방법입니다.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.