在Spring中,如果你需要在一个类中定义另一个类。在这种情况下,参数注入时,则需要引用不同的参数。以上文的girl为事例:
private String girlName;
private List<String> hobbies;
private Map<String,Integer> score;
随后定义boy.java
private String name;
private girl girl;
最后在applicationContext.xml中进行引用:
<bean id="boy1" class="com.spring.bean.boy">
<property name="name">
<value>林惊羽</value>
</property>
<property name="girl" ref="girl1"></property>
</bean>
测试程序如下:
boy boy = (boy)ac.getBean("boy1");
System.out.println(boy.getName()+":妹子姓名是"+boy.getGirl().getGirlName());
bean的作用域
1)如果没有scope属性,这个bean的作用域是属于共享实例的,所谓共享实例是指所有的 bean对象都引用同一个实例对象。默认bean的 scope值是singleton,简单的说就是:
boy boy = (boy)ac.getBean("boy1");
boy boy1 = (boy)ac.getBean("boy1");
boy.equals(boy1) 输出为true;
2)非共享实例:对同一个beanID,每次产生bean的对象都不一样,此时scope的值是prototype
3)web类型:request 和session 都是在web情况下使用,都是一个bean对应一个实例,而且request每次请求都会有各自的request。
如果在web开发中,各个层次的bean做如下引用:
在Dao层
public class UserInfoDao {
public void add(){
System.out.println("这是数据库访问类");
}
}
在Service层
public class UserInfoService {
private UserInfoDao userInfoDao;
public void addService(){
System.out.println("业务层调用数据库访问层");
userInfoDao.add();
}
public UserInfoDao getUserInfoDao() {
return userInfoDao;
}
public void setUserInfoDao(UserInfoDao userInfoDao) {
this.userInfoDao = userInfoDao;
}
}
在action层
public class UserInfoAction {
public UserInfoService getUserInfoService() {
return userInfoService;
}
public void setUserInfoService(UserInfoService userInfoService) {
this.userInfoService = userInfoService;
}
private UserInfoService userInfoService;
public void addAction(){
System.out.println("这是action层调用业务层方法");
userInfoService.addService();
}
}
applicationContext.xml做如下配置:
<!-- 首先配置dao层bean -->
<bean id="userInfoDao" class="com.spring.dao.imp.UserInfoDao">
</bean>
<!-- 配置service层的bean autowire 属性名字和bean的名字一样,即可实现 否则需要一个一个property 进行配置 -->
<bean id="userInfoService" class="com.spring.service.UserInfoService" autowire="byName"></bean>
<!-- 配置action层的bean -->
<bean id="UserServiceBean" class="com.spring.action.UserInfoAction" autowire="byName"></bean>
</beans>
最后如下测试:
UserInfoAction userInfo = (UserInfoAction)ac.getBean("UserServiceBean");
userInfo.addAction();
实际上,spring提供了一种 简化的注入方式 :通过命名空间来实现,实现步骤如下:
首先在applicationContext.xml加入命名空间:p
xmlns:p="http://www.springframework.org/schema/tx"
在编写bean的时候,通过简化属性进行注入,
<!-- 通过命名空间注入 -->
<bean id="girl5" p:girlName="陆雪琪" class="com.spring.bean.girl">
</bean>
最后测试和之前一样