잡동사니에도 사랑을

[21.11.08] (Chapter02) 본문

SPRING

[21.11.08] (Chapter02)

luvforjunk 2021. 11. 8. 20:31
728x90
반응형

2. 전달인자가 2개 이상인 경우

기본데이터 타입일 경우에는 value 요소를 사용하여 의존관계를 연결시키기 위한 값을 지정

public class Foo {

public Foo(int a, String b) { }

}

 

[applicationContext.xml]

<bean id="foo" class="Foo">

<constructor-arg>

<value>25</value>

</constructor-arg>

<constructor-arg value="Hello" />

</bean>

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

<bean id="foo" class="Foo">

<constructor-arg index="1" value="Hello" />

<constructor-arg index="0">

<value>25</value>

</constructor-arg>

</bean>

 

3. type 속성을 이용하여 지정

[applicationContext.xml]

<bean id="foo" class="Foo">

<constructor-arg type="int" value="25" />

<constructor-arg type="java.lang.String" value="Hello" />

</bean>

 

나. Setter Injection

: setter메소드를 이용하여 의존 관계를 연결시키는 것을 말한다.

: <property>요소의 name 속성을 이용하여 값의 의존 관계를 연결시킬 대상이 되는 필드값을 지정한다

 

public class Foo {

private Bar bar;

 

public void setBar(Bar bar){

this.bar = bar;

}

}

 

[applicationContext.xml]

<bean id="foo" class="Foo">

<property name="bar" ref="bar"></property>

</bean>

 

<bean id="bar" class="Bar" />

 

 

[실습]

Project : chapter02

Project : chapter02_SpringMaven

 

Project : chapter02

Package : sample01

Interface : MessageBean.java

Class : MessageBeanImpl.java

            HelloSpring.java - main()

src : applicationContext.xml

 

 

////////applicationContext.xml

<?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"
	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-4.3.xsd">

	<bean id="messageBeanImpl" class="sample01.MessageBeanImpl">
		<constructor-arg>
			<value>포도</value>
		</constructor-arg>
		<property name="cost">
			<value>12000</value>
		</property>
		<property name="qty" value="5" />
	</bean>
</beans>

 

 

 

 

////////////////MessageBeanImpl.java - chapter01_SpringMaven

 

 

 

아래의 Injection들을 모두 지우거나 주석처리하고 롬복을 끌어오는 방법

 

@Data - Setter, Getter, 기본생성자, toString(), hashCode(), squals()

기본생성자가 있는데 또 가져오려고 하면 에러가 떨어진다.

Setter Getter를 잡을 때 위치를 잘 설정해야 한다.

 

@Setter의 위치를 클래스 위에 바로 걸 경우, setFruit(String)까지 나오는 것을 알 수 있다.

 

@Setter의 위치를 변수 위에 걸 경우, setFruit(String)은 나오지 않고 Cost와 Qty만 나오는 것을 알 수 있다.

 

[결과]

 

@Component를 하게 되면, 생성자는 선언을 하지 않아도 자동으로 읽지만

@Setter는 절대 읽지 않으니,

@Autowired를 시켜주게 되면 자동을 Setter Getter를 잡아주게 된다.

 

더보기

package sample01;

import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

@RequiredArgsConstructor
public class MessageBeanImpl implements MessageBean {
@NonNull
private String fruit;
@Setter
private int cost, qty;

public void MessageBeanImpl() {
System.out.println("MessageBeanImpl 기본 생성자");
}

/*
// Constructor Injection
public MessageBeanImpl(String fruit) {
this.fruit = fruit;
}

//Setter Injection
public void setCost(int cost) {
this.cost = cost;
}

public void setQty(int qty) {
this.qty = qty;
}
*/

@Override
public void sayHello() {
System.out.println(fruit + "\t" + cost + "\t" + qty);
}

@Override
public void sayHello(String fruit, int cost) {
System.out.println(fruit + "\t" + cost + "\t" + qty);
}

@Override
public void sayHello(String fruit, int cost, int qty) {
System.out.println(fruit + "\t" + cost + "\t" + qty);
}
}

 

 

 

 

////////MessageBean.java

package sample01;

public interface MessageBean {
	public void sayHello();
	public void sayHello(String fruit, int cost);
	public void sayHello(String fruit, int cost, int qty);
}

 

 

 

////////HelloSpring.java

package sample01;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class HelloSpring {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		MessageBean messageBean = (MessageBean) context.getBean("messageBeanImpl");
		messageBean.sayHello();
		messageBean.sayHello("수박", 15000);
		messageBean.sayHello("바나나", 5000, 10);
	}
}

 

 

 

////////SpringConfiguration.java

package spring.conf;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import sample01.MessageBeanImpl;

@Configuration
public class SpringConfiguration {
	
	@Bean
	//Bean이라고 명시하지 않으면 그냥 일반 자바클래스이다. Spring이 요구하는 값이 아니다.
	public MessageBeanImpl messageBeanImpl() { // 메소드명은 반드시 현재클래스의 객체명을 써준다 또는 Bean명
		return new MessageBeanImpl("포도");
	}
}

 

 

 

////////MessageBeanImpl.java - chapter02_SpringMaven

package sample01;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;

@Component
//@ComponentScan("spring.conf")
public class MessageBeanImpl implements MessageBean {
	private String fruit;
	private int cost, qty;

	/*
	 * public void MessageBeanImpl() { System.out.println("MessageBeanImpl 기본 생성자");
	 * }
	 */

	// Constructor Injection
	public MessageBeanImpl(@Value("포도") String fruit) {
		this.fruit = fruit;
	}

	// Setter Injection
	@Autowired
	public void setCost(@Value("12000") int cost) {
		this.cost = cost;
	}

	@Autowired
	public void setQty(@Value("5") int qty) {
		this.qty = qty;
	}

	@Override
	public void sayHello() {
		System.out.println(fruit + "\t" + cost + "\t" + qty);
	}

	@Override
	public void sayHello(String fruit, int cost) {
		System.out.println(fruit + "\t" + cost + "\t" + qty);
	}

	@Override
	public void sayHello(String fruit, int cost, int qty) {
		System.out.println(fruit + "\t" + cost + "\t" + qty);
	}
}

 

728x90
반응형

'SPRING' 카테고리의 다른 글

[21.11.11] (sample03 - chapter02_SpringMaven)  (0) 2021.11.11
[21.11.10]  (0) 2021.11.09
[21.11.09] (Chapter02 - sample02)  (0) 2021.11.09
[21.11.09] (Chapter02 - sample02 / 03 / 04)  (0) 2021.11.09
[21.11.08] (chapter01)  (0) 2021.11.08