Spring IoC 빈 등록하기 , 의존객체 주입

떡ol·2022년 10월 10일
0

context.xml 파일을 만들어 빈설정을 하느라 웹 검색좀 하고 있는데, 이게 구식사용법이란다. 요즘은 JAVA에 @Bean설정을 바로 한다고 한다(?) 그래서 그냥 정리할겸 메모한다.

우선 빈으로 등록할 객체를 하나 만들었다.

public class PracticeService {
	
	String a,b,c,d;
	int i;
	
	PracticeService objectTest;
	
	public PracticeService() {}
	
	public PracticeService(String a, PracticeService objectTest) {
		this.objectTest = objectTest;
		this.a = a;
	}

	public String getA() {
		return a;
	}

	public void setA(String a) {
		this.a = a;
	}

	public String getB() {
		return b;
	}

	public void setB(String b) {
		this.b = b;
	}

	public String getC() {
		return c;
	}

	public void setC(String c) {
		this.c = c;
	}

	public String getD() {
		return d;
	}

	public void setD(String d) {
		this.d = d;
	}

	public int getI() {
		return i;
	}

	public void setI(int i) {
		this.i = i;
	}

	public PracticeService getObjectTest() {
		return objectTest;
	}

	public void setObjectTest(PracticeService objectTest) {
		this.objectTest = objectTest;
	}


}

아래는 context.xml에 등록하는 방법이다.

	<bean id="ThisIsPractice" class="com.test.PracticeService">
		<constructor-arg value="Hello world!!"/>
		<constructor-arg ref="objectTest"/>	
		<property name="b">
			<value type="java.lang.String">안녕하세요</value>
		</property>
		<property name="c" value=" 'c'입니다."/>
	</bean>
	
	<bean id="ThisIsPractice2" 
		class="com.test.PracticeService"
		p:d="이건 namespaces 지정한방법입니다." p:i="1234"/>

	<bean id="objectTest" class="com.test.PracticeService"/>
  • constructor-arg : 생성자에 들어갈 객체나 변수값을 주입한다. 요소에 index="0" 과같이 지정하여 인자값에 순서를 정해줄 수 있다. 지정안하면 형식과 비교하여 순서대로 주입시킨다.
    (매개변수가 있는 생성자를 호출하여 초기화)
  • property : 선언된 변수,객체값을 찾아 주입한다. setter를 선언해줘야 찾아 들어간다.
    (매개변수가 없는 생성자 호출후 setter메서드를 호출하여 필드값을 초기화)

요소값으로는 여러가지방법을 이용할 수 있는데, value를 바로 선언해도되고, value type에 값을 넣어 사용 할 수도있다. 또는 namespaces 에서 p:schema 를 이용하면 bean tag 안에 한줄로 작성도 가능하다.
value랑 ref의 차이점이라면 value는 값이고 ref는 bean id를 찾아 그대로 참조해준다.

자, 이제 main source에다가 주입해서 getter로 불러와 사용하면 잘 작동 된다.

	@Autowired
	PracticeService ThisIsPractice;
	
	@Autowired
	PracticeService ThisIsPractice2;

그럼 이걸 JAVA 소스에 선언할 때는 어떻게 하느냐?
@Configuration을 클래스에 정의해주고, @Bean을 사용하여 객체를 작성해주면 된다.

@Configuration
public class ApplicationConfig {

	@Bean
	public PracticeService ThisIsPractice3() {
		PracticeService ps = new PracticeService();
		ps.setA("Hello world!!");
		ps.setB("안녕하세요");
		ps.setC("c 입니다.");
		ps.setD("이건 자바 컨피그 어노테이션으로 불러온거에요.");
		
		return ps;
	} 
	
}

만약 Component Scan을 이용하고 싶은경우에는 다음과 같이 설정하면 필터가능하다.

@Configuration
@ComponentScan(basePackages = "com")
//@ComponentScan(basePackageClasses = ApplicationConfig.class)  
public class ApplicationConfig { // 생략...

요정도까지만해도 기본적인거는 다 할 수 있을거다.



참고자료들___
(참고) [Spring] 빈을 설정하는 3가지 방법 - XML, JAVA, Component Scan
(참고) Spring IoC - 빈 등록 방법 5가지

profile
하이

0개의 댓글