빈 주입
- @Autowired를 활용하여 Bean을 자동으로 주입받을 수 있다.
- Spring MVC에서는 추가로 request, session, application을 제공하고 있다.
RequestScope
- Bean을 정의할 때 request scope로 정의하면 요청이 발생할 때 마다 Bean객체가 생성되어 자동으로 주입됨
- 주입된 Bean은 요청 발생 시 주입만 이루어지는 것이므로 request영역에 저장되지는 않는다.
- xml로 Bean을 설정하고, byName으로 주입받았을 경우에만 request 영역에 자동 저장됨
- Java로 세팅하는 방식에서는 @RequestScope를 사용
- XML으로 세팅하는 방식에서는 scope="request"로 설정
@Bean을 사용 & Type으로 주입받은 예시
1) DataBean1 생성하기
public class DataBean1 {
private int data1;
private int data2;
public int getData1() {
return data1;
}
public void setData1(int data1) {
this.data1 = data1;
}
public int getData2() {
return data2;
}
public void setData2(int data2) {
this.data2 = data2;
}
}
2)index.jsp 생성하기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href='test1'>test1</a>
</body>
</html>
3) RootAppContext 정의하기(Bean에 이름을 붙이자! @Bean("이름"))
// 프로젝트 작업시 사용할 bean을 정의하는 클래스
@Configuration
public class RootAppContext {
@Bean("requestBean2")
@RequestScope
public DataBean2 dataBean2() {
return new DataBean2();
}
}
4)TestController 생성해서 주입받기
@Controller
public class TestController {
@Autowired
DataBean1 requestBean1;
@GetMapping("/test1")
public String test1(){
requestBean1.setData1("문자열1");
requestBean1.setData2("문자열2");
return "forward:/result1";
}
@GetMapping("/result1")
public String result1(Model model) {
System.out.printf("requestBean1.data1 : %s\n", requestBean1.getData1());
System.out.printf("requestBean1.data2 : %s\n", requestBean1.getData2());
return "result1";
}
}
-@Autowired를 사용했기 때문에 Type을 통해 주입 받게 된다.
-정의된 Bean 중에서 DataBean1 Type으로 지정된 Bean이 있는지 찾게 되고,
위에서 @RequestScope라고 정의 했기 때문에 새로운 요청이 발생했을 때 dataBean1()이라는 매서드가 호출되고,
return new DataBean1();에 따라 DataBean이 생성된다.
5) result1.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>result1</h1>
<h3>requestBean1.data1 : ${requestScope.requestBean1.data1 }</h3>
<h3>requestBean1.data2 : ${requestScope.requestBean1.data2 }</h3>
</body>
</html>
-실행 결과: 문자열1과 문자열2이 콘솔 창에서만 정상 출력, jsp에서는 출력되지 않는다.
-위에 말했듯이, @RequestScope라고 정의함으로써 Bean이 새로운 요청이 발생했을 때 주입되는건 맞지만
그것이 request에 저장되었다는 뜻은 아니다!
-jsp에 쓰고자 한다면 Model을 주입받아 addAttribute 해주어야 한다.
6) TestController에서 Model 주입받기
@Controller
public class TestController {
@Autowired
DataBean1 requestBean1;
@GetMapping("/test1")
public String test1(){
requestBean1.setData1("문자열1");
requestBean1.setData2("문자열2");
return "forward:/result1";
}
@GetMapping("/result1")
public String result1(Model model) {
System.out.printf("requestBean1.data1 : %s\n", requestBean1.getData1());
System.out.printf("requestBean1.data2 : %s\n", requestBean1.getData2());
model.addAttribute("requestBean1", requestBean1);
//request 영역에 저장!
return "result1";
}
}
**xml 방식으로 하고자 한다면, Bean을 root-context.xml에 정의해주면 된다!
@Bean을 사용 & 이름으로(byName) 주입받은 예시
1) DataBean2 생성하기
public class DataBean2 {
private String data3;
private String data4;
public String getData3() {
return data3;
}
public void setData3(String data3) {
this.data3 = data3;
}
public String getData4() {
return data4;
}
public void setData4(String data4) {
this.data4 = data4;
}
}
2)index.jsp 생성하기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href='test1'>test1</a>
</body>
</html>
3) RootAppContext 정의하기
// 프로젝트 작업시 사용할 bean을 정의하는 클래스
@Configuration
public class RootAppContext {
@Bean
@RequestScope //새로운 요청이 발생했을 때 Bean이 주입된다.
public DataBean1 dataBean1() {
return new DataBean1();
}
@Bean("requestBean2")
@RequestScope
public DataBean2 dataBean2() {
return new DataBean2();
}
}
4)TestController 생성해서 주입받기
@Controller
public class TestController {
@Resource(name = "requestBean2")
DataBean2 requestBean2;
@GetMapping("/test1")
public String test1(){
requestBean1.setData1("문자열1");
requestBean1.setData2("문자열2");
//이 부분 추가
requestBean2.setData3("문자열3");
requestBean2.setData4("문자열4");
//
return "forward:/result1";
}
@GetMapping("/result1")
public String result1(Model model) {
System.out.printf("requestBean1.data1 : %s\n", requestBean1.getData1());
System.out.printf("requestBean1.data2 : %s\n", requestBean1.getData2());
//이 부분 추가
System.out.printf("requestBean2.data3 : %s\n", requestBean2.getData3());
System.out.printf("requestBean2.data4 : %s\n", requestBean2.getData4());
//request에 저장하겠다는 뜻은 아니므로 윗 부분만 넣으면 결과가 jsp에 넘어가지 X
//따라서 Model에 addAttribute해줘야 request에 저장된다.
model.addAttribute("requestBean1", requestBean1);
model.addAttribute("requestBean2", requestBean2);
return "result1";
}
}
-@Resource(name = " ")을 사용했기 때문에 같은 이름을 가진 Bean을 찾아 주입한다.
-위에 말했듯이, @RequestScope라고 정의함으로써 Bean이 새로운 요청이 발생했을 때 주입되는건 맞지만
그것이 request에 저장되었다는 뜻은 아니다!
-jsp에 쓰고자 한다면 Model을 주입받아 addAttribute 해주어야 한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>result1</h1>
<h3>requestBean1.data1 : ${requestScope.requestBean1.data1 }</h3>
<h3>requestBean1.data2 : ${requestScope.requestBean1.data2 }</h3>
</body>
</html>
-실행 결과: 콘솔과 jsp 에서 모두 정상 출력!
@Component를 사용한 예제
*@Component는 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션이다.
@Component역시 아무런 추가 정보가 없다면 Class의 이름을 Camelcase로 변경한 것이 Bean id로 사용된다.
하지만 @Bean과는 다르게 @Componentn는 name이 아닌 value를 이요해 Bean의 이름을 지정한다.
1) DataBean3 생성하기
@Component
@RequestScope
public class DataBean3 {
private String data5;
private String data6;
public String getData5() {
return data5;
}
public void setData5(String data5) {
this.data5 = data5;
}
public String getData6() {
return data6;
}
public void setData6(String data6) {
this.data6 = data6;
}
}
2)index.jsp 생성하기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href='test1'>test1</a>
</body>
</html>
3) ServletAppContext.java에서 @Component를 찾아낼 수 있도록 @ComponentScan 지정
// Spring MVC 프로젝트에 관련된 설정을 하는 클래스
@Configuration
// Controller 어노테이션이 셋팅되어 있는 클래스를 Controller로 등록한다.
@EnableWebMvc
// 스캔할 패키지를 지정한다.
@ComponentScan("kr.co.softcampus.controller")
@ComponentScan("kr.co.softcampus.beans")
public class ServletAppContext implements WebMvcConfigurer{
// Controller의 메서드가 반환하는 jsp의 이름 앞뒤에 경로와 확장자를 붙혀주도록 설정한다.
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// TODO Auto-generated method stub
WebMvcConfigurer.super.configureViewResolvers(registry);
registry.jsp("/WEB-INF/views/", ".jsp");
}
// 정적 파일의 경로를 매핑한다.
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// TODO Auto-generated method stub
WebMvcConfigurer.super.addResourceHandlers(registry);
registry.addResourceHandler("/**").addResourceLocations("/resources/");
}
}
TestController에서 주입받는 방법과, reqeust영역까지 저장하는 방법, Type이 아닌 byName으로 가져오는 방법은 위의 예제와 모두 동일하다!
단, byName으로 지정할 때 @Bean에서는 (name)을 사용하지만, @Component에서는 아래와 같이 (value) 사용
@Resource(name = "requestBean2")
@Component(value = "requestBean4")
'SPRING' 카테고리의 다른 글
[SPRING] SessionScope (0) | 2021.07.27 |
---|---|
[SPRING] 스프링 component-scan 개념 및 동작 과정 (0) | 2021.07.27 |
[SPRING] Request Scope (0) | 2021.07.25 |
[SPRING] Redirect와 Forward (0) | 2021.07.24 |
[SPRING] FORM TAG 요소 - 2 (0) | 2021.07.23 |
댓글