class A{
private B b;
public A(){
this.b = new B();
}
}
B 인터페이스
interface B{
void methodB();
}
B 인터페이스 구현체
public class BB implements B{
@Override
public void methodB(){
System.out.println("I'm BB from B");
}
}
------------------------------------------------------------
public class BC implements B{
@Override
public void methodB(){
System.out.println("I'm BC from B");
}
}
package.A
class A{
private B b;
public A(B b){
this.b = b;
}
public void methodA() {
b.methodB();
}
}
Main 클래스
public class Main {
public static void main(String[] args) {
A a1 = new A(new BB());
A a2 = new A(new BC());
a1.methodA(); //I'm BB from B
a2.methodA(); //I'm BC from B
}
}
package.A
class A{
private B b;
public void setB(B b){
this.b = b;
}
public void methodA() {
b.methodB();
}
}
Main 클래스
public class Main {
public static void main(String[] args) {
A a = new A();
a.setB(new BB());
a.methodA(); //I'm BB from B
a.setB(new BC());
a.methodA(); //I'm BC from B
}
}
- Spring 파일 생성 - Spring Bean Configuration file을 통해 생성이 가능하다.
- applicationContext.xml 파일을 Namespaces로 보면 자신이 사용할 태그를 추가할 수 있다.(Eclipse 기준)
package.A
class A{
private B b;
public void A(B b){
this.b = b;
}
public void methodA() {
b.methodB();
}
}
applicationContext.xml 파일
<beans> <!--생략 -->
<bean id="a" class="package.A">
<constructor-arg ref="bc"></constructor-arg>
<!-- <constructor-arg value="10"></constructor-arg>
A를 생성할 때 int 인자를 주입할 때는 value 속성 사용-->
</bean>
<bean id="bc" class="package.BC"></bean>
</beans>
package.A
class A{
private B b;
public void setB(B b){
this.b = b;
}
public void methodA() {
b.methodB();
}
}
applicationContext.xml 파일
<beans> <!--생략 -->
<bean id="a" class="package.A">
<property name="b" ref="bc"></property>
<!--<property name="c" value="10"></property>
A 생성할 때 int 인자를 주입할 때는 value 속성 사용-->
</bean>
<bean id="bc" class="package.BC"></bean>
</beans>
Main 클래스
import org.springframework.context.support.GenericXmlApplicationContext;
public class Main {
public static void main(String[] args) {
GenericXmlApplicationContext container=
new GenericXmlApplicationContext("applicationContext.xml");
A a= (A) container.getBean("a");
a.methodA(); // I'm BC from B
//getBean은 Object 타입을 반환하기 때문에 명시적 형 변환이 필요하다.
// getBean을 이용한 방식은 Spring Container로부터 객체를 획득하는 것이다.(Lookup)
}
}
package.A#01
형식으로 임의로 배정된다.lazy-init="true"
를 bean 속성에 추가하면 lazy-loading(요청시 객체 생성)으로 변경할 수 있다.scope="prototype"
으로 요청할 때마다 새로운 객체를 생성하게 할 수 있다.init-method="method이름"
, destroy-method="method이름"
를 이용해 객체 생성 후, 소멸 전 메소드를 실행할 수 있다.applicationContext.xml 파일
<beans> <!--생략 -->
<context:component-scan base-package="package.~"></context:component-scan>
<!--base-package 하위 패키지에서 Annotation을 찾는다. -->
</bean>
</beans>
package.A
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("a") //id="a"로 하는 bean으로 등록하는 것과 같다.
class A{
@Autowired //해당 타입의 객체를 찾아서 자동으로 할당해준다.
private B b;
public void setB(B b) {
this.b=b;
}
public void methodA() {
b.methodB();
}
}
B 인터페이스 구현체인 BC 클래스
import org.springframework.stereotype.Component;
@Component // @Autowired가 연결될 객체
public class BC implements B{
public void methodB(){
System.out.println("I'm BC from B");
}
}
Main 클래스
import org.springframework.context.support.GenericXmlApplicationContext;
public class Main {
public static void main(String[] args) {
GenericXmlApplicationContext container=
new GenericXmlApplicationContext("applicationContext2.xml");
A a=(A)container.getBean("a");
a.methodA(); //I'm BC from B
}
}
- 해당 클래스를 메모리에 올려 접근이 가능한 형태로 만들어준다.
- @Component(“id”) 로 id를 지정해줄 수 있다.
- 메모리 내 해당 타입의 객체를 찾아 자동으로 할당해준다.
- 해당 타입의 객체는 메모리에 존재해야 하고 유니크하게 존재해야 한다.
Reference: