스프링 컨테이너 : 빈을 관리한다.
 * 스프링 컨테이너는 빈 객체를 저장하고 있으며, 각 객체간의 의존 관계를 관리해준다.
     BeanFactory와 ApplicationContext가 컨테이너 역할을 수행하는 인터페이스
 * 1 BeanFactory (인터페이스)
 * 2 ApplicationContext (BeanFactory 를 상속받은 하위 인터페이스.)
   3. ApplicationContext를 구현할 클래스들: ClassPathXmlApplicationContext, FileSystemXmlApplicationContext(파일시스템 접근방식),
   AnnotationConfigApplicationContext(어노테이션접근방식),GenericXmlApplicationContext
 * 3 WebApplicationContext(컨테이너역할) (인터페이스. 웹 어플리케이션을 위한 ApplicationContext다.
     하나의 웹어플(즉, 하나의ServletContext) 마다 한 개 이상의 WebApplicationContext를 가질 수 있다).
 - 구현 클래스: XmlWebApplicationContext,AnnotationConfigWebApplicationContext
 * DI(dependency Injection) : 의존성 주입
 * 1 객체 간의 관계를 느슨하게 연결하도록 해주는 기능 중의 하나.
 * 2 참조되는 객체를 직접적으로 참조하는 객체에서 생성하지 않고 
 * 컨테이너에서 생성을 해서 사용하는 방법이다. 

bean위치

bean을 이용할때는 src/main/resources에 두고 사용한다 (applicationContext.xml)

사용하는 법

SpringAppTest.java

package ex06;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.GenericApplicationContext;

public class SpringAppTest {

	public static void main(String[] args) {
		String config="classpath:applicationContext.xml"; 
		//저장경로가 C:\myjava\SpringWorkspace\SpringIOC02\target\classes 되어서 
		//classpath:파일명해도됨.
		//ApplicationContext ctx=new GenericXmlApplicationContext(config);
		ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
		
		MessageBean mb1=ctx.getBean("mb1",MessageBean.class);
		//mb1.sayHi("짱구","철수","맹구");
		
		MessageBean mb2=ctx.getBean("mb2",MessageBean.class);
		mb2.sayHi("짱구","훈이","유리");

	}

}

config처럼 경로 설정하면 사용가능

MessageBean.java

package ex06;

public interface MessageBean {
	void sayHi(String ... args); //...는 매개변수 넣는만큼 받겠다는 뜻
}

MessageBeanImpl.java

package ex06;

import java.io.IOException;

public class MessageBeanImpl implements MessageBean {
	
	private String msg;//property(멤버변수)
	private int money;
	
	private outputter out;//참조형 property
	
	@Override
	public void sayHi(String ... args) {
		if(args!=null) {
			for(String name: args) {
				//System.out.println(name+"님~~"+msg);
				//System.out.println(money+"만원");
				try {
					if(out!=null)
					out.output(name+"님~~"+msg+">> "+money+"만원~~");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	//setter----------------------
	public void setMsg(String msg) {
		this.msg=msg;
		//System.out.println(msg);
	}
	public void setMoney(int money) {
		this.money=money;
		//System.out.println(money);
	}
	public void setOut(outputter out) {
		this.out=out;
	}
}

applicationContext.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">
	
	<!-- [1] ConsoleOutputter빈을 생성하고 path에는 ******************** 주입하세요 -->
	<bean id="c" class="ex06.ConsoleOutputter">
		<property name="path" value="**********"/>
	</bean>
	
	<!-- [2] FileOutputter빈을 생성하고 path에는 C:/MyJava/springLog.txt 주입하세요 -->
	<bean id="f" class="ex06.FileOutputter">
		<property name="path" value="C:/MyJava/springLog.txt"></property>
	</bean>
	
	<!-- [3] MessageBeanImpl 빈을 mb2로 등록한 뒤에 msg, money, out 프로퍼티를 주입하세요 -->
	<bean id="mb2" class="ex06.MessageBeanImpl">
		<property name="msg" value="먹고 떨어져라"/>
		<property name="money" value="800"/>
		<property name="out" ref="c"/>
	</bean>
	
	
	<!-- MessageBeanImpl빈을 등록한 뒤에 msg값과 money값을 setter로 주입하세요 -->
	<bean id="mb1" class="ex06.MessageBeanImpl">
		<property name="msg" value="show me the money"/>
		<property name="money" value="700"/>
	</bean>

</beans>

bean 자료구조

applicationContext2.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-4.3.xsd">
	
	<bean id="s1" class="ex07.ServiceImpl">
		<property name="list">
			<list>
				<value>Java</value>
				<value>JavaScript</value>
				<value>JQuery</value>
				<value>Spring</value>
			</list>
		</property>
	</bean>
	<!-- List list=new ArrayList();
		list.add("java"): list.add("javaScript"); ...
		s1.setList(list);
	 -->
	 
	 <bean id="s2" class="ex07.ServiceImpl">
	 	<property name="map">
	 		<map>
	 			<entry>
	 				<key>
	 				 	<value>Age</value>
	 				</key>
	 				<value>22</value>
	 			</entry>
	 			<entry>
	 				<key>
	 				 	<value>Salary</value>
	 				</key>
	 				<value>5000</value>
	 			</entry>
	 		</map>
	 	</property>
	 </bean>
	<!-- Map<String,Integer> map=new HashMap<>();
		map.put("Age",22);
		map.put("Salary",5000);
		s2.setMap(map);
	 -->
	 
	 <bean id="s3" class="ex07.ServiceImpl">
	 	<property name="set">
	 		<set>
	 			<value>Oracle</value>
	 			<value>Oracle</value>
	 			<value>SQLServer</value>
	 			<value>MySQL</value>
	 		</set>
	 	</property>
	 </bean>
	 <!-- Set<String> set=new HashSet<>();
	 		set.add("Oracle")...
	 		s3.setSet(set); -->

	<bean id="s4" class="ex07.ServiceImpl">
		<property name="prop">
			<props>
				<prop key="username">Scott</prop>
				<prop key="password">tiger</prop>
			</props>
		</property>
	</bean>
	<!-- Properties prop=new Properties();
		prop.setProperty("username","scott");
		...
		s4.setProp(prop) -->
	
</beans>

Service.java

package ex07;

public interface Service {

	void test1();
	void test2();
	void test3();
	void test4();
}

ServiceImpl.java

package ex07;
import java.util.*;

public class ServiceImpl implements Service {

	private List<String> list;
	private Map<String, Integer> map;
	private Set<String> set;
	private Properties prop;
	
	//setter--------------------
	public void setList(List<String> list) {
		this.list = list;
	}
	
	public void setMap(Map<String, Integer> map) {
		this.map = map;
	}
	
	public void setSet(Set<String> set) {
		this.set = set;
	}
	
	public void setProp(Properties prop) {
		this.prop = prop;
	}
	

	@Override
	public void test1() {
		if(list==null) return;
		// list에 저장된 값을 출력하세요
		for(String str:list) {
			System.out.println(str);
		}
		System.out.println("------------");

	}


	@Override
	public void test2() {
		if(map==null) return;
		// map의 key값과 value값을 출력하기
		for(String key : map.keySet()) {
			int value= map.get(key);
			System.out.println(key+": "+value);
		}
		System.out.println("--------------");
	}

	@Override
	public void test3() {
		// set에 저장된 값 출력하기 set=중복된 값 저장 x
		if(set==null)return;
		for(String str:set) {
			System.out.println(str);
		}
		System.out.println("-------------------------");
	}

	@Override
	public void test4() {
		if(prop==null)return;
		System.out.println("username: "+prop.getProperty("username")); //키값 가져오는법
		System.out.println("password: "+prop.getProperty("password"));
	}

}

SpringAppTest.java

package ex07;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class SpringAppTest {

	public static void main(String[] args) {
		//s1룩업 한 뒤에 test1()호출하세요
		String config="classpath:applicationContext2.xml";
		ApplicationContext ctx=new GenericXmlApplicationContext(config);
		
		ctx.getBean("s1",Service.class).test1();
		
		ctx.getBean("s2",Service.class).test2();
		
		ctx.getBean("s3",Service.class).test3();
		
		ctx.getBean("s4",Service.class).test4();
		
	}
}

config 클래스

Java코드로 Bean생성 사용법은 같다.

package ex08;
//자바코드에서 어노테이션을 이용한 스프링 환경 설정


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;


@Configuration
//현재 config클래스를 스프링 환경설정으로 사용하겠다는 의미
public class config {
	
	@Bean(name="emp1")
	@Scope("prototype") //객체 하나를 재사용하지않고 호출할 때마다 새로 객체를 생성할 때 
						// scope 빈의 범위를 singleton(default)으로설정하게되면 emp2를 호출하지 않고 service()에서 emp1을 호출해도 emp2값이 들어가게 된다.
	
	//스프링은 기본적으로 빈의 범위를 singleton으로 설정한다 => default
	//단일 객체가 아니라 매번 다른 객체를 생성하도록 하고 싶다면 prototype으로 설정하자.
	public Emp empInfo() {
		Emp e1= new Emp();
		e1.setName("Scott");
		e1.setEmpno(7788);
		e1.setDept("sales");
		return e1;
	}
	
	//Bean name: emp2 values: king Operation 7799
	@Bean(name="emp2")
	public Emp empInfo2() {
		Emp e=this.empInfo(); //new Emp();
		e.setName("King");
		e.setEmpno(7799);
		e.setDept("Operation");
		return e;
	}
	//@Bean선언 시 별도의 name을 지정하지 않으면 메소드이름이 빈의 id가 된다.
	@Bean
	public ServiceInpl service() {
		ServiceInpl s=new ServiceInpl();
		s.setEmp(this.empInfo());
		return s;
	}
}

+ Recent posts