public class UserServiceImplWithIoCBasic implements UserServiceWithIoCBasic {
public void setUserDAO(UserDAOWithIoCBasic userDAO) {
this.userDAO = userDAO;
}
//중략
}
<bean id="com.sds.emp.user.services.UserServiceWithIoCBasic" class="com.sds.emp.user.services.impl.UserServiceImplWithIoCBasic"> <property name="userDAO" ref="userDAO" /> </bean> <bean id="userDAO" class="com.sds.emp.user.services.impl.UserDAOWithIoCBasic"/>
public class UserServiceImplWithIoCBasic implements UserServiceWithIoCBasic {
public UserServiceImplWithIoCBasic(UserDAOWithIoCBasic userDAO){
this.userDAO = userDAO;
}
//중략
}
<bean id="com.sds.emp.user.services.UserServiceWithIoCBasic"
class="com.sds.emp.user.services.impl.UserServiceImplWithIoCBasic">
<constructor-arg ref="userDAO"/>
<bean id="userDAO" class="com.sds.emp.user.services.impl.UserDAOWithIoCBasic"/>
</bean>
<bean id="com.sds.emp.user.services.UserServiceWithIoCBasic" class="com.sds.emp.user.services.UserServiceWithIoCBasic"> <constructor-arg type="com.sds.emp.user.services.BeanA" ref="beanA"/> <constructor-arg type="com.sds.emp.user.services.BeanB" ref="beanB"/> </bean>
<bean id="com.sds.emp.user.services.UserServiceWithIoCBasic"
class="com.sds.emp.user.services.impl.UserServiceImplWithIoCBasic">
<constructor-arg index="0" ref="beanA" />
<constructor-arg index="1" ref="beanB" />
</bean>
|
- 생성자 Parameter 목록이 길어 지는 것 방지
- 생성자의 수가 많아 지는 것 방지 - Circular dependencies 방지 |
- 강한 의존성 계약 강제
- Setter 메소드 과다 사용 억제 - 불필요한 Setter 메소드를 제거함으로써 실수로 속성 값을 변경하는 일을 사전에 방지 |
<bean id="beanFirst" class="test.BeanFirst">
<constructor-arg ref="beanSecond" />
</bean>
<bean id="beanSecond" class="test.BeanSecond">
<constructor-arg ref="beanFirst" />
</bean>
<bean id="exampleBean" class="examples.ExampleBean"> <constructor-arg type="int"><value>7500000</value></constructor-arg> <constructor-arg type="java.lang.String"><value>42</value></constructor-arg> </bean>
<bean id="exampleBean" class="examples.ExampleBean"> <constructor-arg index="0" value="7500000"/> <constructor-arg index="1" value="42"/> </bean>
<bean id="myDataSource" destroy-method="close">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
</bean>
<bean id="theTargetBean" class="..."/>
<bean id="theClientBean" class="...">
<property name="targetName">
<idref bean="theTargetBean" />
</property>
</bean>
<bean id="theTargetBean" class="..."/>
<bean id="theClientBean" class="...">
<property name="targetName">
<value>theTargetBean</value>
</property>
</bean>
<property name="targetName">
<!-- a bean with an id of 'theTargetBean' must exist,
else an XML exception will be thrown -->
<idref local="theTargetBean"/>
</property>
<!-- ‘bean’ 속성 값은 타 Bean의 ‘id’ 속성 혹은 ‘name’ 속성이다. --> <ref bean="someBean"/>
<!-- ‘local’ 속성 값은 동일 XML 파일 내 타 Bean의 ‘id’ 속성이다. --> <ref local="someBean"/>
<!-- in the parent context -->
<bean id="accountService" class="com.foo.SimpleAccountService">
<!-- insert dependencies as required as here -->
</bean>
<!-- in the child (descendant) context --> <bean id="userService" class="com.foo.SimpleUserService"> <ref parent="accountService"/> </bean>
<bean id="outer" class="...">
<!-- instead of using a reference to a target bean, simply define the target inline -->
<property name="target">
<bean class="com.mycompany.Person">
<!-- this is the inner bean -->
<property name="name" value="Fiona Apple"/>
<property name="age" value="25"/>
</bean>
</property>
</bean>
<bean id="moreComplexObject" class="example.ComplexObject">
<!-- results in a setAdminEmails(java.util.Properties) call -->
<property name="adminEmails">
<props>
<prop key="administrator">administrator@somecompany.org</prop>
</props>
</property>
<!-- results in a setSomeList(java.util.List) call -->
<property name="someList">
<list>
<value>a list element followed by a reference</value>
<ref bean="myDataSource" />
</list>
</property>
<!-- results in a setSomeMap(java.util.Map) call -->
<property name="someMap">
<map>
<entry>
<key>
<value>entry key</value>
</key>
<value>entry value</value>
</entry>
</map>
</property>
<!-- results in a setSomeSet(java.util.Set) call -->
<property name="someSet">
<set>
<value>just some string</value>
<ref bean="myDataSource" />
</set>
</property>
<!-- results in a setSomeArray(String[]) call -->
<property name="someArray" value="str1,str2,str3,str4"/>
</bean>
<beans>
<bean id="parent" abstract="true" class="example.ComplexObject">
<property name="adminEmails">
<props>
<prop key="administrator">administrator@somecompany.com</prop>
<prop key="support">support@somecompany.com</prop>
</props>
</property>
</bean>
<bean id="child" parent="parent">
<property name="adminEmails">
<!-- the merge is specified on the *child* collection definition -->
<props merge="true">
<prop key="sales">sales@somecompany.com</prop>
<prop key="support">support@somecompany.co.uk</prop>
</props>
</property>
</bean>
<beans>
<bean class="ExampleBean"> <property name="email"><null/></property> </bean>
<bean class="ExampleBean"> <property name="email"><value></value></property> </bean>
<!-- 코드 1 --> <property name="myProperty"><value>hello</value></property>
<!-- 코드 2 --> <property name="myProperty" value="hello"/>

<bean id="foo" class="foo.Bar"> <property name="fred.bob.sammy" value="123" /> </bean>
<bean id="com.sds.emp.user.services.UserServiceWithIoCBasic" class="com.sds.emp.user.services.impl.UserServiceImplWithIoCBasic" autowire="byType" depends-on="userSample"> </bean>
<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao"> <property name="manager" ref="manager" /> </bean> <bean id="manager" class="ManagerBean" /> <bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />
<bean id="userDAO" class="com.sds.emp.user.services.impl.UserDAOWithIoCBasic" lazy-init="true"> <bean id="userSample" class="com.sds.emp.user.services.impl.UserSample"/>
<beans default-lazy-init="true">
<!-- no beans will be eagerly pre-instantiated... -->
</beans>
| no | [기본 설정] Autowiring 기능 사용 안 함 |
| byName | Property 명과 동일한 id나 name을 가진 Bean을 찾아 Autowiring 기능 적용 |
| byType | 해당 Property 타입의 Bean이 하나 존재한다면 Autowiring되나 하나 이상 존재 시 UnsatisfiedDependencyException 발생됨. 만약 대응되는 Bean이 없다면 Property 셋팅 안됨 |
| constructor | 이것은 byType과 유사하지만 생성자의 인자에 적용됨. BeanFactory내 생성자의 인자 타입과 맞는 Bean이 정확하게 하나가 아닐 경우 UnsatisfiedDependencyException 발생됨 |
| autodetect | constructor 모드 수행 후 byType 모드가 수행됨 |
| default | <beans>의 default-autowire 속성에 설정한 autowire 모드가 해당 Bean에 적용됨 |
<bean id="com.sds.emp.user.services.UserServiceWithIoCBasic" class="com.sds.emp.user.services.impl.UserServiceImplWithIoCBasic" autowire="byType" depends-on="userSample"> </bean>
<bean id="bean" class="example.TestBean” autowire-candidate="false" />
| none | [기본 설정] 의존성 확인 안 함. 참조관계의 Bean이 존재하지 않는 경우 Property 설정 안 함 |
| simple | Primitive Type과 collection을 위해 의존성 확인 수행 |
| object | 참조관계의 Bean을 위해 의존성 확인 수행 |
| all | simple과 object 모드를 모두 수행 |
<bean id="userService" class="com.sds….UserServiceImpl" dependency-check="object”> <property name="userDAO" ref="userDAO" /> </bean>
<beans default-dependency-check="none" >
<!-- no beans will be eagerly pre-instantiated... -->
</beans>