servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 객체 하나하나? -->
<beans:beans
xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<annotation-driven />
<context:component-scan
base-package="com.app.controller"></context:component-scan>
<!-- 여기 들어와서 스캔하라고 스프링한테 알려줘야 들어가서 bean 객체 생성.. -->
<context:component-scan
base-package="com.app.config"></context:component-scan>
<beans:bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- /WEB-INF/views/ 의 폴더구조는 동일하기 때문에 prefix에 앞 구문 -->
<beans:property name="prefix" value="/WEB-INF/views/"></beans:property>
<!-- .jsp인 파일 이름은 동일하기 때문에 suffix에 뒷 구문 -->
<beans:property name="suffix" value=".jsp"></beans:property>
</beans:bean>
<!-- 외부에서 요청이 들어오면 resources로 연결시키겠다 -->
<resources location="/resources/" mapping="/**"></resources>
</beans:beans>
config 패키지 안에 Configuration 어노테이션을 추가한 클래스 안에 Bean 어노테이션을 통해서 Bean을 수동으로 등록
com/app/config/BeanConfiguration
@Configuration
public class BeanConfiguration {
// 여기 들어와서 스캔해서 필요한 컴포넌트를 가져가라고 설정을 해줘야함
// 등록할 bean에 대한 리턴 형태의 메소드 작성
@Bean // 내가 등록을 하려고 하는 bean에 대한 정보를 입력
// JavaConfigBean 타입의 Bean을 등록 -> 만들어서 리턴
// xml에 <bean id="javaConfigBean" class="com.app.beans.javaConfigBean" /> 를 넣어주는 것과 동일
public JavaConfigBean javaConfigBean() {
// 새 bean 객체를 만들어서 리턴
return new JavaConfigBean();
}
@Bean
@Lazy // 나중에 getBean해서 불리는 시점에!! 빈이 생성된다.
public JavaConfigBean javaConfig() {
return new JavaConfigBean();
}
// name 속성을 통해 id 이름 설정 가능
@Bean(name = "myConfigBean")
public JavaConfigBean sampleConfig() {
return new JavaConfigBean();
}
@Bean // javaTempBean1이라는 이름의 bean 등록됨
@Scope("prototype") // Singleton 하나 vs Prototype 만들때마다 개별적으로 객체 만듦
public JavaBean1 javaTempBean1() {
return new JavaBean1();
}
}
: 자동으로 스프링 컨테이너에 빈을 등록하는 방법
@Service 어노테이션에 이미 @Component 어노테이션이 포함되어 있는 모습
root-context.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">
<bean id="sb1" class="com.app.beans.SampleBean1" />
<bean id="sb2" class="com.app.beans.SampleBean1" />
<bean id="gsb2" class="com.app.beans.GetSetBean2">
<!-- 필드 이름과 동일하게 적어야 spring에서 set+{name}으로 setter를 불러올 수 있음 -->
<property name="var1" value="500"/>
<property name="var2" value="600"/>
<property name="var3" value="문자!"/>
<!-- 객체를 넣어주는 것이기 때문에 ref로 들어가야 함 -->
<property name="sb1" ref="sb1" />
<property name="sb2" ref="sb2" />
<!-- 변수 지정해주고 어디서 따로 불러오지 않고 바로 만들어서 넣어주는 것이기 때문에 id 필요 X, property 태그 안에 바로 만들어줌
<property name="sb1">
<bean class="com.app.beans.SampleBean1" />
</property>
<property name="sb2">
<bean class="com.app.beans.SampleBean1" />
</property>
-->
</bean>
</beans>
GetSetBean2
package com.app.beans;
public class GetSetBean2 {
// 기본타입 3개 + 객체 타입 2개
int var1;
String var2;
String var3;
SampleBean1 sb1;
SampleBean1 sb2;
public int getVar1() {
return var1;
}
public void setVar1(int var1) {
this.var1 = var1;
}
public String getVar2() {
return var2;
}
public void setVar2(String var2) {
this.var2 = var2;
}
public String getVar3() {
return var3;
}
public void setVar3(String var3) {
this.var3 = var3;
}
public SampleBean1 getSb1() {
return sb1;
}
public void setSb1(SampleBean1 sb1) {
this.sb1 = sb1;
}
public SampleBean1 getSb2() {
return sb2;
}
public void setSb2(SampleBean1 sb2) {
this.sb2 = sb2;
}
@Override
public String toString() {
return "GetSetBean2 [var1=" + var1 + ", var2=" + var2 + ", var3=" + var3 + ", sb1=" + sb1 + ", sb2=" + sb2
+ "]";
}
}
root-context.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">
<!-- ContainerBean의 name 필드로 들어가면서 생성됨 -->
<bean id="containerBean2" class="com.app.beans.ContainerBean">
<constructor-arg value="xml 주입한 이름" />
</bean>
<!-- FieldBean의 data 필드로 들어가면서 생성됨 -->
<bean id="fieldBean" class="com.app.beans.FieldBean">
<constructor-arg value="xml 주입 데이터" />
</bean>
<!-- 이미 만들어놓은 객체를 넣어주려면 ref로 id명 넣어줌 -->
<bean id="containerBean3" class="com.app.beans.ContainerBean">
<constructor-arg ref="fieldBean" />
</bean>
</beans>
ContainerBean
package com.app.beans;
public class ContainerBean {
String name;
FieldBean fieldBean;
public ContainerBean() {
name = "기본이름";
}
public ContainerBean(String name) {
this.name = name;
}
public ContainerBean(FieldBean fieldBean) {
this.fieldBean = fieldBean;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public FieldBean getFieldBean() {
return fieldBean;
}
public void setFieldBean(FieldBean fieldBean) {
this.fieldBean = fieldBean;
}
}
FieldBean
package com.app.beans;
public class FieldBean {
String data;
public FieldBean(String data) {
this.data = data;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
+ 생성자의 매개변수로 들어가는 값은 String이 우선이기 때문에, type에 자료형을 넣어 구분해줄 수 있음
ex. SampleBean5에 String만 받는 생성자와 int만 받는 생성자가 둘다 있는 경우
root-context.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">
<bean id="sampleBean5_2" class="com.app.beans.SampleBean5">
<!-- 어떤 타입을 넣어줄지 type으로 명시할 수 있음 -->
<constructor-arg value="30" type="int" />
</bean>
<bean id="sampleBean5_3" class="com.app.beans.SampleBean5">
<!-- 여러 value 넣어주면 순서대로 들어감 -->
<constructor-arg value="10"/>
<constructor-arg value="20"/>
</bean>
</beans>
ContainerBean에 생성자와 getter-setter 설정
public class ContainerBean {
String name;
FieldBean fieldBean;
public ContainerBean() {
name = "기본이름";
}
public ContainerBean(String name) {
this.name = name;
}
public ContainerBean(FieldBean fieldBean) {
this.fieldBean = fieldBean;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public FieldBean getFieldBean() {
return fieldBean;
}
public void setFieldBean(FieldBean fieldBean) {
this.fieldBean = fieldBean;
}
}
BeanConfiguration에서 Bean을 생성할 때 생성자 안에 주입시키거나 setter를 통해 주입
@Configuration
public class BeanConfiguration {
@Bean
public ContainerBean cbBean() {
FieldBean fb = new FieldBean("필드빈데이터");
ContainerBean cb = new ContainerBean(fb);
return cb;
}
}
@Configuration
public class BeanConfiguration {
@Bean
public ContainerBean cbBean() {
// 2. setter를 통한 주입
FieldBean fb = new FieldBean("필드빈데이터2");
ContainerBean cb = new ContainerBean();
cb.setFieldBean(fb);
return cb;
}
}
(Autowired로 불러오려는 객체가 bean으로 등록되어 있다는 전제!)
@Controller
public class ExDaoController {
@Autowired
ExDao2 exDao2;
}
@Controller
public class ExDaoController {
// 필드변수로 선언해놓고
ExDao3 exDao3;
// 생성자 주입
@Autowired
public ExDaoController(ExDao3 exDao3) {
this.exDao3 = exDao3;
}
}
@Controller
public class ExDaoController {
// 필드변수로 선언해놓고
ExDao2 exDao2;
// setter 주입
@Autowired
public void setExDao2(ExDao2 exDao2) {
this.exDao2 = exDao2;
}
}