스프링 컨테이너 : 빈을 관리한다.
* 스프링 컨테이너는 빈 객체를 저장하고 있으며, 각 객체간의 의존 관계를 관리해준다.
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;
}
}
'개발자 > 국비지원 SW' 카테고리의 다른 글
국비지원 87일차 - SpringMVC 환경 세팅, Bean properties파일 사용, config 생성에서 주입, annotation (0) | 2020.08.19 |
---|---|
국비지원 86일차 - Spring Bean xml < - > java(config), NodeJS oracleDB (0) | 2020.08.14 |
국비지원 84일차 - NodeJS 미들웨어, 뷰엔진, MVC설정 (0) | 2020.08.12 |
국비지원 82일차 - NodeJS http, request, url, express, routing (0) | 2020.08.10 |
국비지원 81일차 - 장바구니 목록 (0) | 2020.08.07 |