의존성 주입
예시) 배터리 일체형 장난감 vs 배터리 분리형 장난감 => 모두 배터리를 의존하지만 더 효율적인건 분리형 장난감
=> 분리하고 캡슐화하는 것은 OOP에서도 아주 중요하다.
<bean>
에 id
와 class
를 작성한다.그 안에 <constructor-arg>
태그를 이용하여 해당 클래스의 생성자에 대한 정보를 쓸 수 있다.
ref
에는 생성자가 의존할 객체를 넣으면 된다(의존 객체 주입)<bean id="registerService" class="ems.member.service.StudentRegisterService">
<constructor-arg ref="studentDao" ></constructor-arg>
</bean>
setter함수의 이름에서 set을 제외하고 첫 글자를 소문자로 변경하여 property
의 name
에 전달한다.
setJdbUrl()
함수 => jdbUrl
String
인 경우<bean id="dataBaseConnectionInfoDev" class="ems.member.DataBaseConnectionInfo">
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="userId" value="scott" />
<property name="userPw" value="tiger" />
</bean>
name
은 setter 함수와 동일하게 작성value
속성을 사용하지 않고 property
태그 안에 list
태그 삽입<bean id="informationService" class="ems.member.service.EMSInformationService">
<property name="developers">
<list>
<value>Cheney.</value>
<value>Eloy.</value>
<value>Jasper.</value>
<value>Dillon.</value>
<value>Kian.</value>
</list>
</property>
</bean>
name
은 setter 함수와 동일하게 작성value
속성을 사용하지 않고 property
태그 안에 map
태그 삽입
entry
태그를 사용하여 데이터를 추가할 수 있다.<bean id="informationService" class="ems.member.service.EMSInformationService">
<property name="administrators">
<map>
<entry>
<key>
<value>Cheney</value>
</key>
<value>cheney@springPjt.org</value>
</entry>
<entry>
<key>
<value>Jasper</value>
</key>
<value>jasper@springPjt.org</value>
</entry>
</map>
</property>
<property name="dbInfos">
<map>
<entry>
<key>
<value>dev</value>
</key>
<ref bean="dataBaseConnectionInfoDev"/>
</entry>
</map>
</property>
</bean>
하나의 xml 파일에 내용이 너무 많아지면, 유지/보수하기 힘들도 가독성도 떨어지는 문제가 발생
GenericXmlApplicationContext
에 배열 형태로 전달기존 코드
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext("classpath:applicationContext.xml");
xml 분리 후 코드
String[] appCtxs = {"classpath:appCtx1.xml", "classpath:appCtx2.xml", "classpath:appCtx3.xml"};
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(appCtxs);
여러 개의 xml 파일을 import 할 수 있다.
<import/>
태그 사용<import resource="classpath:appCtx2.xml"/>
<import resource="classpath:appCtx3.xml"/>
배열 형태로 가져오지 않고 하나의 파일로 모두 가져올 수 있다.
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:appCtxImport.xml");
Singleton
getBean()
함수가 호출될 경우 모두 동일한 객체가 반환된다.Prototype
getBean()
함수가 호출될 때마다 새로운 객체가 생성되어 반환된다.<bean>
태그에 scope="prototype"
속성을 추가하면 된다.스프링 설정 파일에 annotation-config
태그를 추가해야 한다.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config />
<bean .../>
...
</bean>
@Autowired
어노테이션를 사용하여 생성자/함수/프로퍼티 위에 작성한다.
@Autowired
public WordRegisterService(WordDao wordDao) {
this.wordDao = wordDao;
}
required
속성을 이용하여 빈이 없을 경우 예외를 피할 수 있다.
@Autowired(required=false)
private WordDao wordDao;
동일한 객체가 2개 이상인 경우 스프링 컨테이너에서 자동 주입 대상 객체를 판단하지 못함
=> Exception 발생
동일한 객체가 있는 경우에 @Qualifier("name")
어노테이션 작성
<bean id="wordDao1" class="com.word.dao.WordDao" />
<bean id="wordDao2" class="com.word.dao.WordDao" />
@Autowired
@Qualifier("usedDao")
private WordDao wordDao;
@Resource
어노테이션을 사용하여 함수/프로퍼티 위에 작성한다.
Autowired
어노테이션과 유사하지만 required
속성이 없다.Qualifier
어노테이션 대신 Named
가 있다.@Inject
@Named(value="wordDao1")
private WordDao wordDao;