반응형
어노테이션(@)
- @Configuration 어노테이션이 있는 클래스를 ioc 컨테이너가 읽어들이게 되면 해당 클래스 객체를 생성한 후 @Bean 어노테이션이 존재하는 각각의 메소드를 호출하여 bean을 생성 및 관리한다
- 메소드 이름이 xml bean의 id이다
@Configuration, @Bean
package diEx03;
public class A {
private String name;
private String age;
public String getName() { return name; }
public String getAge() { return age; }
public void setName(String name) { this.name = name; }
public void setAge(String age) { this.age = age; }
}
package diEx03;
public class B {
private A a;
public B(A a) {
this.a = a;
}
public A getA() { return a; }
public void setA(A a) { this.a = a; }
}
package diEx03;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/*
@Configuration 어노테이션이 있는 클래스를 ioc 컨테이너가
읽어들이게 되면 해당 클래스 객체를 생성한 후 @Bean 어노테이션이 존재하는
각각의 메소드를 호출하여 bean을 생성 및 관리한다
*/
@Configuration
public class Applicationcontext {
/* 메소드 이름이 xml bean의 id */
@Bean
public A a() {
A obj = new A();
obj.setName("홍길동");
obj.setAge("20");
return obj;
}
@Bean
public B objB() {
B b = new B(a()); //생성자 주입
return b;
}
public A a2() {
A obj = new A();
obj.setName("고길동");
obj.setAge("30");
return obj;
}
}
package diEx03;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx
= new AnnotationConfigApplicationContext(Applicationcontext.class);
A a = ctx.getBean("a",A.class);
System.out.println("name:"+a.getName());
System.out.println("age:"+a.getAge());
System.out.println("--------------");
B b = ctx.getBean("objB",B.class);
System.out.println("name:"+b.getA().getName());
System.out.println("age:"+b.getA().getAge());
}
}
@Component
- ioc 컨테이너가 @Component 어노테이션이 있는 클래스를 읽어 객체로 생성하여 관리한다.
- 이때 생성되는 클래스 객체의 이름은 클래스 명 첫글자 소문자가 된다
- 주로 해당 클래스로 생성되는 객체가 여러개 일 필요없이 하나만 필요하며 내부 필드가 별도로 없는 경우 사용한다
- 또는 ioc 컨테이너가 생성한 객체만을 필드로 두는 경우
package diEx04;
import org.springframework.stereotype.Component;
@Component
public class A {
public void method01() {
System.out.println("A 클래스의 method01 호출!");
}
}
applicationcontext.xml 에서 Namespaces -> context 체크
<?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-3.2.xsd">
<!-- 해당 패키지 안 클래스들 중 @Component 어노테이션이 있는 클래스의 bean 생성 -->
<context:component-scan base-package="diEx04" />
</beans>
package diEx04;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class Main {
public static void main(String[] args) {
AbstractApplicationContext ctx =
new GenericXmlApplicationContext("classpath:applicationcontext.xml");
A a = ctx.getBean("a",A.class);
a.method01();
}
}
package diEx04;
import org.springframework.stereotype.Component;
@Component(value="objB")
public class B {
public void method01() {
System.out.println("B 클래스의 method01 호출!");
}
}
package diEx04;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class Main {
public static void main(String[] args) {
AbstractApplicationContext ctx =
new GenericXmlApplicationContext("classpath:applicationcontext.xml");
A a = ctx.getBean("a",A.class);
a.method01();
System.out.println("------------");
B objB = ctx.getBean("objB",B.class);
objB.method01();
System.out.println("------------");
}
}
어노테이션 기반 의존 주입
package diEx04;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class C {
private A a;
/* 생성자 의존 주입. 타입이 일치하는 1개를 넣어준다 */
@Autowired
public C(A a) {
this.a = a;
}
public void method01() {
System.out.println("C 클래스 호출 method01!");
a.method01();
}
}
package diEx04;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class Main {
public static void main(String[] args) {
AbstractApplicationContext ctx =
new GenericXmlApplicationContext("classpath:applicationcontext.xml");
C c = ctx.getBean("c",C.class);
c.method01();
}
}
@Autowired 어노테이션은 타입을 기준으로 생성되는 bean(객체)의 의존성을 주입할 수 있다
이때 타입이 같은 bean을 ioc에서 여러개 가지고 있다면 두번째로 이름이 같은 bean을 주입한다
1번째로 타입확인 : B 타입은 b, objB 두개
2번째로 이름확인 : b
@Qualifier("객체이름") 어노테이션을 사용하면 특정 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"
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-3.2.xsd">
<bean id="b" class="diEx04.B" />
<!-- 해당 패키지 안 클래스들 중 @Component 어노테이션이 있는 클래스의 bean 생성 -->
<context:component-scan base-package="diEx04" />
</beans>
package diEx04;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class D {
private B b;
@Autowired
public D(B b) {
this.b = b;
}
/*
bb 가 없어서 오류발생
public D(B bb) {
this.b = bb;
}
*/
public void method01() {
System.out.println("============================");
System.out.println("D 클래스에서 method01() 호출");
b.method01();
System.out.println("============================");
}
}
package diEx04;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class Main {
public static void main(String[] args) {
AbstractApplicationContext ctx =
new GenericXmlApplicationContext("classpath:applicationcontext.xml");
A a = ctx.getBean("a",A.class);
a.method01();
System.out.println("------------");
B objB = ctx.getBean("objB",B.class);
objB.method01();
System.out.println("------------");
B b = ctx.getBean("b",B.class);
b.method01();
System.out.println("------------");
C c = ctx.getBean("c",C.class);
c.method01();
D d = ctx.getBean("d",D.class);
d.method01();
}
}
package diEx04;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class E {
@Autowired
private A a;
private B bb;
@Qualifier("objB")
@Autowired
public void setB(B bb) { this.bb = bb; }
public void method01() {
System.out.println("--------------------------");
System.out.println("E 클래스 method01() 호출!");
a.method01();
bb.method01();
System.out.println("--------------------------");
}
}
package diEx04;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class Main {
public static void main(String[] args) {
AbstractApplicationContext ctx =
new GenericXmlApplicationContext("classpath:applicationcontext.xml");
A a = ctx.getBean("a",A.class);
a.method01();
System.out.println("------------");
B objB = ctx.getBean("objB",B.class);
objB.method01();
System.out.println("------------");
B b = ctx.getBean("b",B.class);
b.method01();
System.out.println("------------");
C c = ctx.getBean("c",C.class);
c.method01();
D d = ctx.getBean("d",D.class);
d.method01();
E e = ctx.getBean("e",E.class);
e.method01();
}
}
반응형
'Spring' 카테고리의 다른 글
[Spring] 스프링 MVC 프로젝트 (0) | 2024.11.24 |
---|---|
[Spring] AOP 어노테이션 (0) | 2024.11.23 |
[Spring] joinpoint (0) | 2024.11.22 |
[Spring] AOP (0) | 2024.11.21 |
[Spring] 스프링 프레임워크, 세터주입, 생성자 주입, 의존성 주입 (0) | 2024.11.18 |