기록/BACKEND

[Spring] DI 주입하기 - xml

5월._. 2022. 4. 15.
728x90

방법 두 가지가 있는데, context.xml과 java class에서 하나씩 짝지어 생각하면 된다. 

객체 필요한 곳에서 부르기

1.  context 설정(객체 정보를 알 수 있는 xml파일)

    - new ClassPathXmlApplicationContext()에 xml 파일 주소를 넘긴다.

2.  사용할 객체 가져오기

    - context에서 Bean을 가져온다.

    - 이름만 설정 : 해당 이름의 객체를 가져온다. 이름이 없다면 해당하는 class를 알아서 가져온다.

    - 클래스만 설정 : 해당 class타입으로 자동 형 변환해서 가져온다. 클래스 설정하지 않으면 Object 타입으로 반환한다.

ApplicationContext context = new ClassPathXmlApplicationContext("com/___/configuration/applicationContext.xml");
GuestBookService guestBookService = context.getBean("gbService",GuestBookService.class);

 

context.xml

1.  new > Spring Bean Configuration File을 클릭한다. 이렇게 하지 않아도 그냥 xml 파일 알아서 만들면 된다. 

sts

2.  namespace는 beans와 context를 체크한다. 이거 말고도 본인이 필요한 건 전부 체크한다. 이때 체크하지 않아도 파일 생긴 뒤에 얼마든지 더 추가할 수 있다. 물론 xml 파일에 직접 쓰는 것도 가능하다.

파일 생성할 때 namespace 설정 - sts
파일 만든 후 namespace추가하는 곳 - sts

방법1) Bean & Property

1.  사용하려는 bean을 작성한다.

2.  객체는 bean, 그 객체에서 사용해야하는 또 다른 객체가 있을 때 property를 사용한다.

3.  이 때, property가 이미 다른 bean에 설정되어있다면 ref="bean이름"을 쓴다. 직접 String으로 적을 경우 value="값"을 쓴다.

    - String 중에 &가 있다면 &로 변경한다. 문자열을 xml엘리먼트로 인식하고 해석을 시도할 수 있기 때문이다.

4.  scope을 설정할 수 있다. default는 singleton이지만, prototype, session, request도 가능하다. (이 얘긴 다른 글에서 쓰겠다.)

5.  property의 name이 중요하다. property가 속한 bean에서 setName을 찾는다. [set + 첫 글자 대문자 + 나머지] <- 이름을 찾아간다.

<bean id="ds" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
	<property name="driverClass" value="com.mysql.cj.jdbc.Driver"></property>
	<property name="url" value="jdbc:mysql://127.0.0.1:3306/스키마이름?serverTimezone=UTC&amp;useUniCode=yes&amp;characterEncoding=UTF-8"></property>
	<property name="username" value="이름"></property>
	<property name="password" value="비밀번호"></property>
</bean>

<bean id="gbDao" class="com.___.model.dao.GuestBookDaoImpl">
	<property name="dataSource" ref="ds"></property>
</bean>

 

방법2) component-scan(xml + annotation 섞인 방법)

1.  bean을 하나하나 설정하지 않고 쓸 수 있는 방법이다. 대신 쓰려는 클래스에 가서 annotation을 붙여야 한다.

2.  먼저 context.xml에 스캔할 위치를 입력한다. 이 위치 아래에 있는 클래스를 전부 탐색한다.

<context:component-scan base-package="com.____.hello.di4"></context:component-scan>

 

CLASS

방법1) Bean & Property

1.  위에서 gbDao란 아이디로 설정했던 GuestBookDaoImpl 클래스다. property (name=dataSource)를 쓴다고 했기 때문에 해당 클래스에 setDataSource를 만들었다.

2.  클래스에서 어떤 이름으로 DataSource를 만드는지는 상관없다. 대신 setDataSource라는 이름만 정확하게 지켜주면 된다. (get도 같은 규칙이다.)

public class GuestBookDaoImpl implements GuestBookDao {	
	private DataSource dataSource;

	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}
    //중략
}

 

방법2) Component & Property

1.  annotation을 활용한다. 사용하려는 클래스 앞에 붙인다. 종류는 Controller, Service, Repository, Component가 있다. 이것도 나중에 다른 글로 소개한다.

2.  annotation을 붙이면서 id를 정할 수 있다. (value="아이디")

3.  bean에서 따로 설정했던 것처럼 scope를 정할 수도 있다.

4.  property는 @Autowired를 붙여서 사용한다. 따로 이름을 만들어서 구분하려면 Qualifier를 쓴다.

//@Component(value="kor")
@Service(value="kor")
@Scope(value="prototype")
public class CLASSNAME  {
	@Autowired
//	@Qualifier(value="t2dao")
	private TestDao d;
}

'기록 > BACKEND' 카테고리의 다른 글

[WEB] IoC  (0) 2022.04.19
[Spring] DI 주입하기 - java  (0) 2022.04.16
[WEB] 파라미터와 어트리뷰트  (0) 2022.04.04
[WEB] 요청과 응답의 Scope  (0) 2022.04.04
[WEB] Java에서 DB연결하기  (0) 2022.04.02

댓글