[Spring] IOC

내용
bean
BeanFactory
진행일시
2021/03/15
속성

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
복사