컨테이너 생명 주기
빈 생명 주기
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 |