본문 바로가기

java,jsp,spring/Spring

Spring 기초 (3)

컨테이너 생명 주기

빈 생명 주기

1.implements InitializingBean, DisposableBean

2. @PostConstruct, @PreDestroy→ 어노테이션 안될 때 context 추가 필요!

빈 범위(Scope)

  • bean 설정

  • MainClass.java

외부 파일을 이용한 설정

  • Environment 객체

예제

1. AdminConnection.java - 인터페이스를 상속받은 클래스

import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;

public class AdminConnection implements InitializingBean, EnvironmentAware {
	private Environment env; // 프로젝트당 1개만 만들 수 있음
	private String adminId;
	private String adminPw;
	
	@Override
	public void setEnvironment(Environment environment) {
		System.out.println("setEnvironment()");
		setEnv(environment);
		// 객체 생성 전 set
	}
	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("afterPropertiesSet()");
		setAdminId(env.getProperty("admin.id"));
		setAdminPw(env.getProperty("admin.pw"));
	}
	
	public Environment getEnv() {
		return env;
	}
	public void setEnv(Environment env) {
		this.env = env;
	}
	public String getAdminId() {
		return adminId;
	}
	public void setAdminId(String adminId) {
		this.adminId = adminId;
	}
	public String getAdminPw() {
		return adminPw;
	}
	public void setAdminPw(String adminPw) {
		this.adminPw = adminPw;
	}
}

2. MainClass.java - 객체 정보를 불러와 출력하는 클래스

import java.io.IOException;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.io.support.ResourcePropertySource;

public class MainClass {
	public static void main(String[] args) {
		ConfigurableApplicationContext ctx= new GenericXmlApplicationContext();
		ConfigurableEnvironment env = ctx.getEnvironment();
		MutablePropertySources propertySources = env.getPropertySources();
		
		try {
			propertySources.addLast(new ResourcePropertySource("classpath:admin.properties"));
			// 외부 파일이 없을 수 있어 예외처리
			System.out.println(env.getProperty("admin.id"));
			System.out.println(env.getProperty("admin.pw"));
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		GenericXmlApplicationContext gctx =(GenericXmlApplicationContext)ctx;
		gctx.load("classpath:applicationCTX.xml");
		gctx.refresh();
		
		AdminConnection adminConnection = gctx.getBean("adminConnection", AdminConnection.class);
		System.out.println("admin ID : "+adminConnection.getAdminId());
		System.out.println("admin PW : "+adminConnection.getAdminPw());
	}
}

3. admin.properties - 관리자 정보가 담긴 파일(위치는 resource 폴더)

admin.id = abcde
admin.pw = 12345

4. applicationCTX.xml - 객체 설정 파일

<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="AdminConnection" class="com.javalec.spring_8_.AdminConnection"></bean>
</beans>

프로퍼티 파일을 이용한 설정

1. xml 파일에 프로퍼티 파일 명시

  • 외부 파일 사용
<context:property-placeholder location=”” />
  • 참조값 사용
<property name=”adminId”>
    <value>${admin.id}</value>
</property>

2. 자바 파일에 프로퍼티 파일 명시

  • 외부 파일 사용
public static PropertySourcesPlaceholderConfigurer properties(){}
  • 참조값 사용 : value 어노테이션 이용
@Value(”${admin.id}”)
private String adminId;

 

프로파일(profile) 속성을 이용한 설정

1. xml 설정 예제

// ServerInfo.java
public class ServerInfo {
	private String ipNum;
	private String portNum;
	
	public String getIpNum() {
		return ipNum;
	}
	public void setIpNum(String ipNum) {
		this.ipNum = ipNum;
	}
	public String getPortNum() {
		return portNum;
	}
	public void setPortNum(String portNum) {
		this.portNum = portNum;
	}
}

//applicationCTX_dev.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"
	profile="dev">

	<bean id="serverInfo" class="com.javalec.spring_8_3_1.ServerInfo">
		<property name="ipNum" value="localhost"></property>
		<property name="portNum" value="8181"></property>
	</bean>
</beans>

//applicationCTX_run.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"
	profile="run">
	
	<bean id="serverInfo" class="com.javalec.spring_8_3_1.ServerInfo">
		<property name="ipNum" value="123.456.789.00"></property>
		<property name="portNum" value="80"></property>
	</bean>
</beans>

// MainClass.java
import java.util.Scanner;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
	public static void main(String[] args) {
		String config="";
		Scanner scanner = new Scanner(System.in);
		String str = scanner.next();
		
		if (str.equals("dev")) {
			config="dev";
		} else if(str.equals("run")){
			config="run";
		}
		
		scanner.close();
		
		GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
		ctx.getEnvironment().setActiveProfiles(config);
		ctx.load("applicationCTX_dev.xml", "applicationCTX_run.xml");
		ServerInfo info = ctx.getBean("serverInfo", ServerInfo.class);
		System.out.println("ip : "+info.getIpNum());
		System.out.println("port : "+info.getPortNum());
	}
}

2. java 설정 예제

// ServerInfo.java
public class ServerInfo {
	private String ipNum;
	private String portNum;
	
	public String getIpNum() {
		return ipNum;
	}
	public void setIpNum(String ipNum) {
		this.ipNum = ipNum;
	}
	public String getPortNum() {
		return portNum;
	}
	public void setPortNum(String portNum) {
		this.portNum = portNum;
	}
}

// ApplicationConfigDev.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@Profile("dev")
public class ApplicationConfigDev {
	
	@Bean
	public ServerInfo serverInfo() {
		ServerInfo info = new ServerInfo();
		info.setIpNum("localhost");
		info.setPortNum("8181");
		
		return info;
	}
}

// ApplicationConfigRun.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@Profile("run")
public class ApplicationConfigRun {
	
	@Bean
	public ServerInfo serverInfo() {
		ServerInfo info = new ServerInfo();
		info.setIpNum("123.456.789.00");
		info.setPortNum("80");
		
		return info;
	}
}
// MainClass.java
import java.util.Scanner;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainClass {
	public static void main(String[] args) {
		String config="";
		Scanner scanner = new Scanner(System.in);
		String str = scanner.next();
		
		if (str.equals("dev")) {
			config="dev";
		} else if(str.equals("run")){
			config="run";
		}
		
		scanner.close();
		
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
		ctx.getEnvironment().setActiveProfiles(config);
		ctx.register(ApplicationConfigDev.class, ApplicationConfigRun.class);
		ctx.refresh();
		
		ServerInfo info = ctx.getBean("serverInfo", ServerInfo.class);
		System.out.println("ip : "+info.getIpNum());
		System.out.println("port : "+info.getPortNum());
		
		ctx.close();
	}
}

'java,jsp,spring > Spring' 카테고리의 다른 글

Spring 프로젝트 설계 - 기본 게시판  (0) 2022.10.11
Spring 기초 (5)  (0) 2022.10.11
Spring 기초 (4)  (0) 2022.10.11
Spring 기초 (2)  (0) 2022.10.04
Spring 기초 (1)  (0) 2022.09.30