기존 자바는 객체를 생성할 때 아래와 같이
new
객체를 이용하여 생성한다.
Board board = new Board();
스프링 Bean을 이용하면 프레임워크가 만든 Bean을 가져다 쓰기 때문에 Spring 프레임워크를 사용하지 않아도 된다.
XML에 저장된 Bean 가져오는 클래스
GenericXmlApplicationContext
ClassPathXmlApplicationContext
AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:패키지/Bean.xml");
// 컨테이너에 있는 Bean을 가져다 쓸 때 사용하는 클래스
객체 변수명 = ctx.getBean("xml에 등록되어있는 id", 객체.타입);
Property가 자바의 클래스에 데이터를 주입하는 방법을 말한다.
Java의 Class에서 필드값과 Getter/Setter를 만들어주면, 그 Setter를 이용해 값을 주입한다.
프로젝트의 src/main/java
에 xml의 정보를 담을 Java 파일을 생성하기 위해 패키지를 만들어주고, Calculator
클래스를 만들어준다.
package com.gdu.app01.xml01;
public class Calculator {
// method
public void add(int a, int b) {
System.out.println(a + "+" + b + "=" + (a+b));
}
public void sub(int a, int b) {
System.out.println(a + "-" + b + "=" + (a-b));
}
public void mul(int a, int b) {
System.out.println(a + "*" + b + "=" + (a*b));
}
public void div(int a, int b) {
System.out.println(a + "/" + b + "=" + (a/b));
}
}
package com.gdu.app01.xml01;
public class Student {
// field
private String name;
private String school;
private Calculator calculator;
// method(getter + setter)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public Calculator getCalculator() {
return calculator;
}
public void setCalculator(Calculator calculator) {
this.calculator = calculator;
}
}
src/main/resources
에 Spring Bean Configuration File을 만들어준다.
Spring Bean Configuration File은 Bean을 만드는 xml이다.
Bean을 만들어서 Container에 보관한다.
<?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 Been Configuration File이야.
난 Bean을 만드는 xml이야.
내가 만든 Bean은 컨테이너(Container)에 보관되지.
-->
<!--
1. 디폴트 생성자 + setter (property 태그)
-->
<bean id="calc" class="com.gdu.app01.xml01.Calculator"></bean> <!-- xml인데 java랑 연결되어 있다. -->
<bean id="haksang" class="com.gdu.app01.xml01.Student">
<property name="name">
<value>홍길동</value> <!-- setName() 연결. (property라는 태그는 setter랑 연결) -->
</property>
<property name="school"> <!-- 각종 데이터타입은 value태그안 byte, int, String, char 등 -->
<value>한국대학교</value> <!-- setSchool() 연결. -->
</property>
<property name="calculator">
<ref bean="calc" /> <!-- setCalculator() 연결. ref태그는 참조타입이라 bean id="calc"와 이름 맞춰야 한다. -->
</property>
</beans>
<value>
: byte, short, int, long, float, double, boolean 등 기본 타입<property>
: 기본 타입을 제외한 참조 타입
package com.gdu.app01.xml01;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class SpringMain {
public static void main(String[] args) {
// 기존 개발자
// 개발자가 Bean을 만들었다.
// Calculator calculator = new Calculator();
// 새로운 프레임워크
// 프레임워크가 만든 Bean을 가져다 쓴다.
AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:xml01/appCtx.xml");
Calculator calculator = ctx.getBean("calculator", Calculator.class);
calculator.add(5, 2);
calculator.sub(5, 2);
calculator.mul(5, 2);
calculator.div(5, 2);
// XML에 저장된 Bean 가져오는 클래스
// GenericXmlApplicationContext
// ClassPathXmlApplicationContext
AbstractApplicationContext ctx = new GenericXmlApplicationContext("xml01/appCtx.xml"); // "classpath:xml01/appCtx.xml"과 동일
Student student = ctx.getBean("haksang", Student.class); // Student student = (Student)ctx.getBean("haksang");
System.out.println(student.getName());
System.out.println(student.getSchool());
student.getCalculator().add(7, 3);
student.getCalculator().sub(7, 3);
student.getCalculator().mul(7, 3);
student.getCalculator().div(7, 3);
ctx.close(); // 생략가능
}
}
결과값
package com.gdu.app01.xml02;
public class Engine {
// field
private String fuel; // 연료(디젤, 가솔린)
private double efficency; // 연비(12.5)
private int cc; // 배기량(1998)
// method (getter/setter)
public String getFuel() {
return fuel;
}
public void setFuel(String fuel) {
this.fuel = fuel;
}
public double getEfficency() {
return efficency;
}
public void setEfficency(double efficency) {
this.efficency = efficency;
}
public int getCc() {
return cc;
}
public void setCc(int cc) {
this.cc = cc;
}
}
package com.gdu.app01.xml02;
public class Car {
// field
private String model;
private String maker;
private Engine engine;
// method (getter/setter)
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getMaker() {
return maker;
}
public void setMaker(String maker) {
this.maker = maker;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
}
Engine 클래스를 참조하는 Car 클래스가 있다.
<?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">
<bean id="crdi" class="com.gdu.app01.xml02.Engine">
<property name="fuel" value="가솔린" />
<property name="efficency" value="12.5" />
<property name="cc" value="1998" />
</bean>
<bean id="dreamCar" class="com.gdu.app01.xml02.Car">
<property name="model" value="소나타" />
<property name="maker" value="현대" />
<property name="engine" ref="crdi"></property> <!-- bean id="crdi"을 ref에 넣는다. -->
</bean>
</beans>
위에서 언급했듯이
<value>
태그는value=""
value 속성으로 대체할 수 있다.
package com.gdu.app01.xml02;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringMain {
public static void main(String[] args) {
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("xml02/appCtx.xml");
Car myCar = ctx.getBean("dreamCar", Car.class); // 이름, 타입 전달
System.out.println(myCar.getModel());
System.out.println(myCar.getMaker());
Engine engine = myCar.getEngine();
System.out.println(engine.getFuel());
System.out.println(engine.getEfficency());
System.out.println(engine.getCc());
ctx.close();
}
}
결과값
<property>
태그를 <bean>
태그의 p: 속성으로 바꿔서 사용할 수 있다.상단 beans의 속성에 xmlns:p
라는 속성이 추가 된다.
<property>
태그를 <bean>
태그의 p:
속성으로 바꿔서 사용할 수 있다.
package com.gdu.app01.xml03;
public class Address {
// field
private String jibun;
private String road;
private String zipCode;
// method (getter/setter)
public String getJibun() {
return jibun;
}
public void setJibun(String jibun) {
this.jibun = jibun;
}
public String getRoad() {
return road;
}
public void setRoad(String road) {
this.road = road;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
}
package com.gdu.app01.xml03;
public class Person {
// field
private String name;
private int age;
private Address addr;
// method (getter/setter)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Address getAddr() {
return addr;
}
public void setAddr(Address addr) {
this.addr = addr;
}
}
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
Namespaces 탭에서 "p" 옵션을 체크하면
<property> 태그를 <bean> 태그의 p: 속성으로 바꿔서 사용할 수 있다.
-->
<bean id="myAddr" class="com.gdu.app01.xml03.Address" p:jibun="가산동" p:road="디지털로" p:zipCode="12345" />
<bean id="select" class="com.gdu.app01.xml03.Person" p:name="손현우" p:age="31" p:addr-ref="myAddr" />
</beans>
<property>
태그를<bean>
태그의p:
속성으로 바꿔서 사용할 수 있다.
package com.gdu.app01.xml03;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringMain {
public static void main(String[] args) {
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("xml03/appCtx.xml");
Person person = ctx.getBean("select", Person.class);
System.out.println(person.getName());
System.out.println(person.getAge());
Address address = person.getAddr();
System.out.println(address.getJibun());
System.out.println(address.getRoad());
System.out.println(address.getZipCode());
ctx.close();
}
}
결과값
<bean>
태그의 scope 속성
scope="singleton"
- bean을 하나만 만들어둔다.
- 생략하면 singleton이 사용된다.
scope="prototype"
- bean을 요청할 때마다 새로 만들어준다.
- 자주 사용되지 않는다.
package com.gdu.app01.xml04;
public class Dao {
//method
public void list() {
System.out.println("목록 가져오기");
}
public void detail() {
System.out.println("상세보기");
}
}
<?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">
<bean id="dao" class="com.gdu.app01.xml04.Dao" scope="prototype" />
</beans>
scope="prototype"
을 주어서 Main Class에서getBean
을 요청할 때마다bean
을 생성해준다.
package com.gdu.app01.xml04;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class SpringMain {
public static void main(String[] args) {
AbstractApplicationContext ctx = new GenericXmlApplicationContext("xml04/appCtx.xml");
Dao dao1 = ctx.getBean("dao", Dao.class);
Dao dao2 = ctx.getBean("dao", Dao.class);
Dao dao3 = ctx.getBean("dao", Dao.class);
System.out.println(dao1 == dao2);
System.out.println(dao2 == dao3);
System.out.println(dao1 == dao3);
ctx.close();
}
}
결과값
- scope가
"singleton"
경우에는true
값이 나오고,- scope가
"prototype"
경우에는false
값이 나온다.
package com.gdu.app01.xml05;
import java.sql.Connection;
import java.sql.DriverManager;
public class MyConnection {
// field
private String driverClassName;
private String url;
private String username;
private String password;
// method (getter + setter)
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
// Connection 반환 메소드
public Connection getConnection() {
Connection con = null;
try {
con = DriverManager.getConnection(url, username, password);
System.out.println("Connection 생성 완료");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
}
<?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">
<bean id="conn" class="com.gdu.app01.xml05.MyConnection">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="SCOTT" />
<property name="password" value="TIGER" />
</bean>
</beans>
SCOTT 계정 로그인 정보를 넘겨주었다.
프로젝트의 [Build Path]에 ojdbc6.jar
등록하고 실행한다.
package com.gdu.app01.xml05;
import java.sql.Connection;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class SpringMain {
public static void main(String[] args) throws Exception {
AbstractApplicationContext ctx = new GenericXmlApplicationContext("xml05/appCtx.xml");
MyConnection myCon = ctx.getBean("conn", MyConnection.class);
Connection con = myCon.getConnection();
if(con != null) {
con.close();
System.out.println("Connection 해제 완료");
}
ctx.close();
}
}
실행값