ApplicationContext : BeanFactory를 상속받은 인터페이스 , 스프링에서 주로 사용
>ApplicationEventPublisher, BeanFactory, EnvironmentCapable, HierarchicalBeanFactory, ListableBeanFactory, MessageSource, ResourceLoader, ResourcePatternResolver 상속
1. 프로젝트 resources에 Spring XML Configuration file을 생성 후 Bean 등록
repo1
package main;
public class repo1{
public repo3 giveA(repo3 repo)
{
return repo;
}
}
repo2
package main;
public class repo2{
repo1 rp1;
public void setRp1(repo1 rp1) {
this.rp1 = rp1;
}
public repo3 geta(repo3 rp)
{
return rp1.giveA(rp);
}
}
: repo1의 Setter를 가지고 있음
application.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.xsd">
<bean id="repo1" class = "main.repo1">
</bean>
<bean id="repo2" class = "main.repo2">
<property name ="rp1" ref="repo1"/>
</bean>
</beans>
repo1 과 repo2 등록
repo2 등록시 필드값 rp1에 ref에 해당하는 repo1을 넣음
이때 repo2에서 repo1값을 받을수 있는 setter메서드가 존재하여야함 (의존성 주입)
SpringstudyApplication
package main;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringstudyApplication {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
repo1 rp1 = (repo1) ctx.getBean("repo1");
repo2 rp2 = (repo2) ctx.getBean("repo2");
}
}
ApplicationContext : ctx 를 ClassPathXmlApplicationContext로 가져와서 getBean(Bean id)를 통해 Bean을 싱글톤으로 주입받음 (object형으로 받기 때문에 캐스팅 필수)
>> XML로 하나씩 등록하기가 번거로움
2. Component를 활용한 Bean등록
application.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.xsd">
<context:component-scan base-package="main"/>
</beans>
component scan을 활용하여 main package안에 어노테이션(Service,component등)으로 등록된 객체들을 Bean으로 등록
repo2
package main;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class repo2{
@Autowired
repo1 rp1;
public void setRp1(repo1 rp1) {
this.rp1 = rp1;
}
public repo3 geta(repo3 rp)
{
return rp1.giveA(rp);
}
}
필드값 repo1 rp1을 Autowired를 통해 의존성 주입 가능
>>여전히 XML은 불편함
3. Java Configuration을 활용한 Bean 등록
ApplicationConfig
package main;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfig {
@Bean
public repo1 r1()
{
return new repo1();
}
@Bean
public repo2 r2()
{
repo2 rp2 = new repo2();
rp2.setRp1(r1());
return rp2;
}
}
ApplicationConfig 클래스를 만든후 @Configuration을 붙여 설정파일임을 알림
이후 Bean으로 등록될 객체를 @Bean 어노테이션이 붙은 메서드를 만들어 직접 생성후 등록
의존성주입도 직접 입력
그러나 Setter를 사용하면 의존성 주입을 직접하지 않고 Autowired로 필드값 입력가능
생성자에서 의존성주입시 new를 사용한 객체 생성자체가 불가하므로 Autowired 사용불가
SpringstudyApplication
package main;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringstudyApplication {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class);
repo1 rp1 = (repo1) ctx.getBean("r1");
repo2 rp2 = (repo2) ctx.getBean("r2");
}
}
ApplicationContext 를 AnnotaionConfigApplicationContext로 가져옴
GetBean으로 Bean을 사용시 Configuration 에서 Bean으로사용했던 메서드 명이 등록된 Bean의 id
( GetBean(메서드명) )
4. ApplicationConfig에 ComponentScan을 활용한 Bean등록 (SpringBoot)
ApplicationConfig
package main;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan(basePackageClasses = SpringstudyApplication.class)
@Configuration
public class ApplicationConfig {
}
ComponentScan을 활용하여 SpringstudyApplication이 있는 패키지내에 Bean등록 어노테이션이 붙은 모든 객체를 찾은후 Bean으로 등록
SpringstudyApplication
package main;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringstudyApplication {
@Autowired
repo1 rp1;
@Autowired
repo2 rp2;
public static void main(String[] args) {
}
}
@SpringBootApplication으로 등록하면 Configuration 어노테이션이 붙은 설정 파일을 실행하며 모든 Bean들을 사용가능하게함
'Tools > Spring' 카테고리의 다른 글
스프링 AOP 적용 예제 (0) | 2021.02.28 |
---|---|
스프링 AOP 기본 동작 원리 (0) | 2021.02.27 |
Component와 Component Scan (0) | 2020.08.09 |
ApplicationContext-2 (Autowired) (0) | 2020.08.06 |
Spring Ioc 컨테이너와 Bean (0) | 2020.08.04 |