일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- Spring 커맨드 객체
- 오라클 DROP
- 코드로 배우는 스프링 웹 프로젝트
- Spring
- 오라클 CREATE
- JSR - 303
- Dependency Injection
- 스프링 파라미터 추출
- Spring 객체로 주입받기
- properties 변수
- 오라클 TRUNCATE
- 자바
- JSR - 380
- ddl alter
- DDL DROP
- properties 파일
- 자바스크립트
- 자바 List
- 스프링 인터셉터
- Spring MVC5 기본 세팅
- collection framework
- annotation
- Servlet cookie
- properties 파일 주입
- Spring message
- Mybatis 오류
- DDL TRUNCATE
- 자바오류
- Spring MVC Interceptor
- Spring Cookie
- Today
- Total
개발이좋아
[Spring] xml로 Bean 객체 생성하기 본문
스프링에서 Bean 객체는 애노테이션으로 자동 생성할 수도 있지만 xml파일이나 자바 클래스에서 생성할 수도 있다.
xml 파일에서 생성할 때는 bean 태그안에 bean 클래스의 대한 정보를 설정해줌으로써 Bean 객체의 생성이 가능하다.
xml파일을 이용하여 Bean객체를 생성하기 위해서는 먼저 Bean 객체를 생성하기 위한 Bean 클래스가 필요하다.
// Bean 클래스
public class TestBean {
public TestBean() {
System.out.println("TestBean의 생성자");
}
}
위의 코드는 Bean클래스로써 IoC컨테이너에서 xml파일을 로딩하여 Bean 객체가 생성되면 객체가 생성되었다는 로그가 찍히게끔 한 코드이다.
그리고 위의 작성한 Bean클래스의 정보를 기반으로 xml파일에 Bean 생성 설정을 해준다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- class 속성은 반드시 있어야함 -->
<bean id="Bean의 이름" class="패키지 포함 Bean클래스의 이름" />
</beans>
※<bean> : 사용할 Bean을 정의하는 태그
xml파일에서 <beans> 태그를 만든 후 <bean> 태그안에 Bean의 이름을 지정하는 id속성과 Bean 클래스를 지정하는 class 속성을 지정한다.
class 속성은 Bean클래스를 나타내는 속성이기 때문에 반드시 작성해주어야 하며 id 속성은 Bean객체의 이름값이 필요 없다면 작성해주지 않아도 된다.
이 외에 <bean> 태그의 속성에는 아래와 같은 것들이 있다.
- lazy-init : 속성 값을 true로 주면 xml파일을 로딩할 때 Bean객체가 생성되지 않고 getBean( ) 메서드를 호출할 때 Bean 객체가 생성된다.
- init-method , destroy-method : Bean 객체의 생명주기와 관련된 속성 Bean 생성 후에 초기화 작업을 할 때 사용
- scope : 객체의 범위를 설정하는 속성 (singleton : 객체를 하나만 생성해서 사용, prototype : 객체를 getBean( ) 메서드를 호출할 때마다 생성하여 사용)
생성된 객체는 기본 범위가 singleton이기 때문에 xml을 컨테이너에 로딩하는 시점에 딱 하나만 생성되어져서 사용되며,
<bean> 태그안에 scope 속성을 prototype으로 주었을 경우 xml이 컨테이너에 로딩되는 시점에 생성되는 것이 아닌 getBean 메서드를 호출했을 때 생성되며, getBean( ) 메서드를 호출할 때마다 새로운 Bean 객체가 생성된다.
Bean클래스를 만들고 xml파일에서 Bean객체 생성의 대한 설정을 맞쳤다면 메인 클래스에서 XML 파일을 로딩하여 객체를 생성하도록 한다.
xml을 로딩할 때 xml파일이 패키지 외부에 있는 경우와 패키지 내부에 있는 경우에 사용하는 클래스가 다르기 때문에 주의가 필요하다.
xml 파일이 패키지 외부에 있는 경우
public class MainClass {
public static void main(String[] args) {
// IoC 컨테이너 - xml파일에 패키지 외부에 있는 경우
FileSystemXmlApplicationContext ctx1 = new FileSystemXmlApplicationContext("beans.xml");
ctx1.close();
}
}
xml파일이 패키지 외부에 있는 경우 FileSystemXmlApplicationContext 클래스를 사용하여 xml파일을 로딩해준다.
생성자의 매개변수로는 xml파일의 이름을 작성하면 된다.
그 후 close메서드를 이용하여 리소스를 닫아준다.
xml 파일이 패키지 내부에 있는 경우
public class MainClass {
public static void main(String[] args) {
// IoC 컨테이너 - xml파일에 패키지 내부에 있는 경우
ClassPathXmlApplicationContext ctx1 = new ClassPathXmlApplicationContext("패키지 포함 xml파일의 이름");
ctx1.close();
}
}
xml 파일이 패키지 내부에 있는 경우에는 ClassPathXmlApplicationContext 클래스를 이용하여 xml파일을 로딩하며 생성자에 매개변수로는 xml파일의 패키지 포함 이름을 작성해준다.
예를 들어 config 패키지의 beans.xml파일이라면 ("config/beans.xml"); 으로 작성해준다.
그 후 close( ) 메서드를 이용하여 리소스를 닫아준다.
main 클래스를 실행해보면 xml파일에 작성한 bean의 scope가 singleton이기 때문에 xml파일을 컨테이너에 로딩하면서 자동으로 객체가 생성되어 콘솔 로그에 Bean클래스에 생성자에 작성한 로그가 출력되는 것을 확인할 수 있다.
위의 로그가 찍혔다면 Bean객체가 잘 생성된 것이고 <bean> 태그 속성에 lazy-init 속성을 true로 주었다던가 scope 속성 값이 prototype이면 객체를 getBean( ) 메서드를 이용하여 생성할 필요가 있다.
public class MainClass {
public static void main(String[] args) {
// IoC 컨테이너 - xml파일에 패키지 내부에 있는 경우
ClassPathXmlApplicationContext ctx1 = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml");
// Bean클래스형 변수에 getBean 메서드를 이용하여 객체를 생성함
TestBean bean = ctx1.getBean("t1", TestBean.class);
ctx1.close();
}
}
위 코드는 <bean> 태그 scope 속성이 prototype이라던가 혹은 lazy-init 속성이 true일때 getBean( ) 메서드를 이용하여 Bean 객체를 생성하는 예제이다.
getBean( ) 메서드의 첫 번째 매개변수 인자 값은 <bean>태그의 id값이고 id값이 없고 해당 타입의 Bean이 하나라면 생략이 가능하다.
두 번째 매개변수 인자 값은 해당 Bean타입의 클래스명. class가 들어간다.
본 포스팅은 필자가 공부한 내용을 정리한 것으로 오류가 존재할 수 있습니다.
참고: 인프런 - 스프링 프레임워크 개발자를 위한 실습을 통한 입문 과정
'Web개발 > Spring' 카테고리의 다른 글
[Spring] xml에 setter메서드를 통한 의존성 주입(Dependency Injection) (0) | 2020.01.16 |
---|---|
[Spring] 생성자를 통한 의존성 주입 (Dependency Injection) (0) | 2020.01.14 |
[Spring] MyBatis (0) | 2020.01.13 |
[Spring] JSR-250 Annotation (0) | 2020.01.12 |
[Spring] 자바 파일로 Bean등록하기 (0) | 2020.01.11 |