1. IoC ( 제어의 역행)란 ??
•
기존 Web Application : 라이브러리를 통해 개발자가 소스코드에 적용하여 전체적인 LifeCycle을 관리
•
(Spring framework)라이브러리 : 개발자가 작성한 소스코드를 컨테이너가 LifeCycle를 관리
2. 가장핵심적인 기능인 'Bean'
•
ApplicationContext가 모든기능을 상속받아서 기능적으로 최상위에 있음
•
ApplicationContext가 Container라고 보면된다.
•
GenricXmlApplicationContext : xml로 메타정보를 읽어와서 ApplicationContext 실행
•
즉 ApplicationContext가 IOC Container다
3.IoC 컨테이너 역할
4. Ioc컨테이너와 Bean객체
5. 주요 컨테이너 종류
Application Context는 interface이므로 직접적으로 객체를 생성하지못한다.
그래서 annotation인지, xml인지에 따라 생성될 수있는 클래스 종류가 달라진다
6. BeanFactory란 ?
스프링 컨테너의 최상위 컨테이너이며 , ApplicationContext와 함께 스프링 컨테이너라고한다. Bean의 생성과 설정, 관리등의 역할을 맡고있다
6-1 ApplicationContext 하는 일
일반적인 자바클래스를 POJO라고불린다. ApplicationContext의 하위 구현체인 GenericXmlApplicationContext는 xml 설정 메타 정보를 읽어와서 BeanFactory를 동작시킨다. GenericXmlApplicationContext는 설정 메타 정보가 담긴 xml 파일의 경로를 클래스패스 하위 경로를 전부 기술해야 설정 파일을 읽어올 수 있다.(패키지 내에 존재해도 물리적으로는 폴더이기 때문에 하위 폴더는 / 혹은 \\로 구분해야한다.)*
Bean등록
•
Bean등록은 Spring Bean Configuration File에서 이루어진다
•
일반적인 자바클래스를 POJO라고불린다
•
Spring한테 특정클래스로 객체를 만들어서 가지고있고 내가 필요할 때 나 주면되라고 생각하면된다
•
<bean></bean>태그를 이용하며 필수속성은 class 속성이다 . 즉 어떠한 class를 bean으로 등록할건지 알려줘야한다
•
기본생성자가 없으면 에러난다
•
예시
7. xmlconfig와 javaconfig이용법
7-1 xmlconfig 예시
•
xmlconfig는 xml을 이용해서 bean을 등록하는방식이다
•
class속성넣는것이 필수이며 <constructor-arg >에 명령어를 쓰며 그 안에 index,value값을 넣어 설정할 수 있다.
예시) Application.java
여기서 context는 container이다
ApplicationContext context =
new GenericXmlApplicationContext("com/greedy/section01/xmlconfig/spring-context.xml");
System.out.println(context);
컨테이너가 보고나하고 있는 bean을 꺼내서 사용할 때는 getBean() 메소드를 이용한다.
getBean() 메소드는 타입, id를 이용해서 bean을 꺼내올 수 있는 기능을 오버로딩 해 놓았다.
1 bean의 id를 이용해 bean을 가져오는 방법*/
xml의 지정한 아이디를 이용 , MemberDTO로 다운캐스팅
MemberDTO member = (MemberDTO) context.getBean("member");
2. bean의 타입으로 bean을 가져오는 방법*/
MemberDTO member = context.getBean(MemberDTO.class);
3. bean의 id와 클래스 메타 정보를전달하여 가져오는 방법*/
MemberDTO member = context.getBean("member", MemberDTO.class);
System.out.println("member : " + member);
Java
복사
예시) spring-context.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- spring Ioc 에게 정보를 넘겨주는역할이다 -->
<!-- bean 등록 : 필요할때 나 주고 일단 너 가지고있어, 어떤한 클래스를 등록할건지 -->
<!-- com.greedy.section01.xmlconfig.MemberDTO member = new com.greedy.section01.xmlconfig.MemberDTO(); 아래선언한것이 이거와 같다, bean은 기본생성자를 이용하며
만약에 기본생성자가 없다면 에러가난다. -->
<bean id="member" class="com.greedy.section01.xmlconfig.MemberDTO">
<constructor-arg index="0" value="1"/>
<constructor-arg name="id" value="user01"/>
<constructor-arg index="2"><value>pass01</value></constructor-arg>
<constructor-arg name="name"><value>홍길동</value></constructor-arg>
</bean>
<!-- MemberDTO member = new MemberDTO(1,"user01","pass01", "홍길동") -->
</beans>
XML
복사
7-2. javaconfig예시
1.
Application
•
context로 변수로 설정 후 new로 인스턴스생성한 후 ()안에 ContextConfiguration.class라고 설정한다
•
그리고 ContextConfiguration 클래스생성후 anotation(@)에 configuration을 쓰고 import
•
MemberDTO 메소드 생성 (여기서 메소드 생성만하고 Bean이름을 지정안해주면 그냥 메소드 이름이 beanm이름이다 .
•
이름지정할시에는 (@bean name="member"로 정한다)
package com.greedy.section02.javaconfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Application {
public static void main(String[] args) {
/* AnnotataionConfigApplicationContext라는 어노테이션 설정 정보를 읽어서 컨테이너를 설정하는 구현체 이용.
* 인자로 @Configuration 어노테이션이 달린 설정 클래스의 메타 정보를 전달하여 컨테이너를 생성한다.
* */
ApplicationContext context = new AnnotationConfigApplicationContext(ContextConfiguration.class);
System.out.println(context);
// 아무것도 설정하지않으면 메소드의 이름이 bean의 id가된다
// 아니면 어노테이션옆에 @Bean(name="member")라고하면 Bean의 id는 member이다
// 컨테이너는 인스턴스생성정보를 가지고 있는녀석
// new MemberDTO쓰느일이 없어진다 왜냐하면 beanFactory에서 관리를 해주므로 이로인해 유지보수성이좋아짐
MemberDTO member = context.getBean("member", MemberDTO.class);
System.out.println(member);
}
}
Java
복사
2.ContextConfiguration
package com.greedy.section02.javaconfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ContextConfiguration {
@Bean(name="member")
//getMember가 bean의 아이디다
public MemberDTO getMember() {
return new MemberDTO(1, "user01", "pass01", "홍길동");
}
}
Java
복사