방법 두 가지가 있는데, 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 파일 알아서 만들면 된다.
2. namespace는 beans와 context를 체크한다. 이거 말고도 본인이 필요한 건 전부 체크한다. 이때 체크하지 않아도 파일 생긴 뒤에 얼마든지 더 추가할 수 있다. 물론 xml 파일에 직접 쓰는 것도 가능하다.
방법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&useUniCode=yes&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 |
댓글