Spring 학습 노트 IOC 의존 주입
반전 제어 (Inversion of Control, 영어 줄 임 말 IOC) 는 컴퓨터 프로그램의 결합 문 제 를 줄 이 는 중요 한 대상 프로 그래 밍 법칙 이자 경량급 Spring 프레임 워 크 의 핵심 이다.제어 반전 은 일반적으로 주입 (Dependency Injection, 약칭 DI) 과 찾기 (Dependency Lookup) 에 의존 하 는 두 가지 유형 으로 나 뉘 는데 주입 응용 에 의존 하 는 것 이 더욱 광범 위 하 다.개념 못 알 아 들 었 어?괜 찮 습 니 다. 주입 에 의존 하 는 매력 을 구체 적 인 사례 를 통 해 알 아 보 세 요.
2. 일반적인 생 성 대상
Spring 프레임 워 크 를 사용 하지 않 기 전에 일반적인 javabean 대상 을 만 드 는 절 차 는 다음 과 같 습 니 다. 먼저 javabean 대상 입 니 다.
public class Bean {
private int age;
private String name;
private boolean flag;
public Bean() {
super();
}
public Bean(int age, String name) {
super();
this.age = age;
this.name = name;
}
public Bean(int age, boolean flag) {
super();
this.age = age;
this.flag = flag;
}
public Bean(int age, String name, boolean flag) {
super();
this.age = age;
this.name = name;
this.flag = flag;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public String toString() {
return "Bean [age=" + age + ", name=" + name + ", flag=" + flag + "]";
}
}
그리고 생 성 과정:
Bean bean = new Bean(12,true," ");
이렇게 해서 우리 가 원 하 는 bean 대상 의 실례 를 얻 었 다.
3. Spring 사용 후 대상 만 들 기
Spring 을 사용 한 후에 우 리 는 일반적인 방법 으로 대상 을 만 들 수 있 을 뿐만 아니 라 주입 에 의존 하 는 방식 으로 우리 가 원 하 는 대상 의 인 스 턴 스 를 얻 을 수 있 습 니 다.
<bean id="beanByProperty" class="com.shi.springmvc.bean.Bean">
<property name="age" value="12">property>
<property name="name" value=" ">property>
<property name="flag" value="false">property>
bean>
그 다음 획득 과정:
// Spring IOC
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/bean.xml");
// bean
Bean bean = (Bean) ctx.getBean("beanByProperty");
우 리 는 new 가 더 이상 필요 하지 않다 는 것 을 알 게 되 었 습 니 다. 우 리 는 설정 파일 을 만 들 고 IOC 라 는 용기 에서 우리 가 원 하 는 대상 을 잡 으 면 됩 니 다. 전통 적 인 자원 검색 방식 은 구성 요소 가 용기 에 자원 을 찾 아 달라 고 요구 합 니 다. 응답 으로 용 기 는 적시에 자원 을 되 돌려 줍 니 다. IOC 를 사용 한 후에 용 기 는 자원 을 관리 하 는 구성 요소 에 자발적으로 전달 합 니 다.구성 요소 가 해 야 할 일 은 자원 을 받 아들 이 는 적당 한 방식 만 선택 하 는 것 이다. 이런 행 위 는 검색 의 수 동적 인 형식 이 라 고도 불 린 다. 사실은 본질 적 으로 이것 은 프레임 워 크 의 사용 일 뿐만 아니 라 프로 그래 밍 사상의 전환 이기 도 한다.
4. 위 에서 우리 가 사용 하 는 것 은 속성 주입 방식 으로 대상 의 인 스 턴 스 를 가 져 오 는 것 입 니 다. 아래 에서 우 리 는 구조 기 주입 방식 으로 대상 의 인 스 턴 스 를 가 져 옵 니 다.
bean. xml 파일 에 추가 합 니 다:
<bean id="beanByConstructor" class="com.shi.springmvc.bean.Bean">
<constructor-arg value="15">constructor-arg>
<constructor-arg value=" ">constructor-arg>
<constructor-arg value="true">constructor-arg>
bean>
그리고
Bean bean = (Bean) ctx.getBean("beanByConstructor");
우리 가 원 하 는 대상 의 인 스 턴 스 를 얻 을 수 있 습 니 다.
5. 속성 대상 이 존재 하고 구조 방법 파라미터 가 다른 대상 인 스 턴 스 의 획득 방식
우 리 는 한 대상 에 여러 가지 구조 방법 이 있 을 수 있다 는 것 을 알 고 있 습 니 다. 매개 변수 개수 와 유형 도 다 를 것 입 니 다. 한 대상 에 속성 대상 이 포함 되 어 있 을 수 있 습 니 다. 그러면 우 리 는 어떻게 처리 합 니까?우 리 는 'Spring 학습 노트 AOP 차단기 의 기본 실현' 프로젝트 를 바탕 으로 bean. java (위 에 이미 제 시 된) BeanParent. java 대상 을 추가 합 니 다.
public class BeanParent {
private String country;
private String language;
private Bean bean;
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public Bean getBean() {
return bean;
}
public void setBean(Bean bean) {
this.bean = bean;
}
@Override
public String toString() {
return "BeanParent [country=" + country + ", language=" + language + ", bean=" + bean + "]";
}
}
TestIOC. java 파일 (com. shi. springmvc. bean 패키지 아래):
@Controller
public class TestIOC {
private String SUCCESS = "success";
// Spring bean
@RequestMapping("/createBean")
private String createBean(){
Bean bean = new Bean();
bean.setAge(12);
bean.setFlag(true);
bean.setName(" ");
System.out.println(bean);
return SUCCESS;
}
@RequestMapping("/getBeanByProperty")
public String getBeanByProperty(){
// Spring IOC
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/bean.xml");
// bean ,
// , beanByProperty beans.xml ,getBean beans.xml id
// HelloWorld bean
Bean bean = (Bean) ctx.getBean("beanByProperty");
System.out.println(bean);
return SUCCESS;
}
@RequestMapping("/getBeanByConstructor")
public String getBeanByConstructor(){
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/bean.xml");
Bean bean = (Bean) ctx.getBean("beanByConstructor");
System.out.println(bean);
return SUCCESS;
}
@RequestMapping("/getBeanByConstructor01")
public String getBeanByConstructor01(){
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/bean.xml");
Bean bean = (Bean) ctx.getBean("beanByConstructor01");
System.out.println(bean);
return SUCCESS;
}
@RequestMapping("/getBeanByConstructor02")
public String getBeanByConstructor02(){
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/bean.xml");
Bean bean = (Bean) ctx.getBean("beanByConstructor02");
System.out.println(bean);
return SUCCESS;
}
@RequestMapping("/getParentBeanByProperty01")
public String getParentBeanByProperty01(){
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/bean.xml");
BeanParent beanParent = (BeanParent) ctx.getBean("beanParentByProp01");
System.out.println(beanParent);
return SUCCESS;
}
@RequestMapping("/getParentBeanByProperty02")
public String getParentBeanByProperty02(){
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/bean.xml");
BeanParent beanParent = (BeanParent) ctx.getBean("beanParentByProp02");
System.out.println(beanParent);
return SUCCESS;
}
}
test_ioc. jsp 파일 (WebContent 폴 더 아래)
"java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
span class="hljs-string">"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
"Content-Type" content="text/html; charset=UTF-8">
bean
"createBean">createBean
"getBeanByProperty">getBeanByProperty
getbeanByConstructor
"getBeanByConstructor01">getBeanByConstructor01
"getBeanByConstructor02">getBeanByConstructor02
"getParentBeanByProperty01">getParentBeanByProperty01
"getParentBeanByProperty02">getParentBeanByProperty02
bean. xml 파일 (src 폴 더 아래)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="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-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<bean id="beanByProperty" class="com.shi.springmvc.bean.Bean">
<property name="age" value="12">property>
<property name="name" value=" ">property>
<property name="flag" value="false">property>
bean>
<bean id="beanByConstructor" class="com.shi.springmvc.bean.Bean">
<constructor-arg value="15">constructor-arg>
<constructor-arg value=" ">constructor-arg>
<constructor-arg value="true">constructor-arg>
bean>
<bean id="beanByConstructor01" class="com.shi.springmvc.bean.Bean">
<constructor-arg value="15" index="0">constructor-arg>
<constructor-arg value=" " index="1" type="String">constructor-arg>
bean>
<bean id="beanByConstructor02" class="com.shi.springmvc.bean.Bean">
<constructor-arg value="15" index="0">constructor-arg>
<constructor-arg value="true" index="1" type="boolean">constructor-arg>
bean>
<bean id="beanParentByProp01" class="com.shi.springmvc.bean.BeanParent">
<property name="country" value="12">property>
<property name="language" value=" ">property>
<property name="bean" ref="beanByProperty">property>
bean>
<bean id="beanParentByProp02" class="com.shi.springmvc.bean.BeanParent">
<property name="country" value="12">property>
<property name="language" value=" ">property>
<property name="bean">
<bean class="com.shi.springmvc.bean.Bean">
<constructor-arg value="15">constructor-arg>
<constructor-arg value=" ">constructor-arg>
<constructor-arg value="true">constructor-arg>
bean>
property>
bean>
beans>
위의 코드 는 속성 주입 (getBeanByProperty), 구조 기 주입 (getBeanByConstructor), 구조 방법 파라미터 가 다 르 고 (getBeanByConstructor 01 과 getBeanByConstructor 02) 를 통 해 Bean 대상 의 인 스 턴 스 를 얻 을 수 있 으 며, 대상 속성 에 하위 대상 이 있 는 BeanParent 가 인 스 턴 스 를 어떻게 얻 는 지 두 가지 방법 (설정 파일 에서 ref 와 실 용적 이지 않 은 ref 를 사용 합 니 다) 을 실현 합 니 다.
6. 효과 도:
우 리 는 빈 과 빈 파 렌 트 의 대상 인 스 턴 스 를 성공 적 으로 얻 었 다 는 것 을 알 수 있다.
마지막 으로 demo 다운로드 주소 첨부: 내 가 들 어 갈 게.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.