`
忘忧鸟
  • 浏览: 141871 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Bean注入方式1:使用Setter方式装配属性(依赖注入)

阅读更多

注入依赖对象



基本类型对象注入:

<bean id="orderService" class="cn.itcast.service.OrderServiceBean">
 <constructor-arg index=“0” type=“java.lang.String” value=“xxx”/>//构造器注入
 <property name=“name” value=“zhao/>//属性setter方法注入
</bean>

 
注入其他bean:
方式一

 

<bean id="persionDao" class="cn.com.xinli.dao.impl.PersionDaoBean"></bean> 
 <bean id="persionServiceBean" class="cn.com.xinli.service.impl.PersionServiceBean" init-method="init" destroy-method="destory">
  <property name="persionDao" ref="persionDao">
 </property>
 </bean>

方式二(使用内部bean,但该bean不能被其他bean使用)

<bean id="orderService" class="cn.itcast.service.OrderServiceBean">
 <property name="orderDao">
  <bean class="cn.com.xinli.dao.impl.PersionDaoBean"/>
 </property>
</bean>

 

场景:有一个业务需要我们在service曾调用dao层的方法,一般的做法是我们在serivce层new一个dao参的对象,调用其中的方法,这样就会造成dao层和service层之间的耦合,下面我们使用spring中的 依赖注入 在service层 注入dao层的对象.
步骤:
(1).dao层PersionDao接口

package cn.com.xinli.dao; 

public interface PersionDao 
{ 

 public abstract void add(); 

} 

 (2) 接口实现PersionDaoBean 

package cn.com.xinli.dao.impl; 

import org.apache.log4j.Logger; 

import cn.com.xinli.dao.PersionDao; 

public class PersionDaoBean implements PersionDao 
{ 
 Logger log=Logger.getLogger(PersionDaoBean.class); 
 /* (non-Javadoc) 
 * @see cn.com.xinli.dao.impl.PersionDao#add() 
 */ 
 public void add() 
 { 
 log.info("执行了PersionDaoBean中的add()方法"); 
 } 
} 
 
(3) 在service 层,我们要把dao层的对象 注入 进来

package cn.com.xinli.service.impl; 

import org.apache.log4j.Logger; 

import cn.com.xinli.dao.PersionDao; 
import cn.com.xinli.service.PersionSevice; 

public class PersionServiceBean implements PersionSevice 
{ 
 Logger log=Logger.getLogger(PersionServiceBean.class); 
private PersionDao persionDao; 

 public PersionDao getPersionDao() 
 { 
 return persionDao; 
 } 
 public void setPersionDao(PersionDao persionDao) 
 { 
 this.persionDao = persionDao; 
 }
 public void init() 
 { 
 log.info("初始化资源"); 
 } 
 public PersionServiceBean() 
 { 
 log.info("我被实例化了"); 
 } 

 public void save() 
 { 
 this.persionDao.add(); 
 } 
 public void destory() 
 { 
 log.info("释放资源"); 
 } 
} 
 
(4) 配置bean.xml

<bean id="persionDao" class="cn.com.xinli.dao.impl.PersionDaoBean"></bean>                                                                  
    <bean id="persionServiceBean" class="cn.com.xinli.service.impl.PersionServiceBean" init-method="init" destroy-method="destory">   
        <property name="persionDao" ref="persionDao"></property>   
    </bean>  
 
其中 property 标签的 name属性 标识我们需要注入的属性的名字,对应了persionServiceBean 的一个属性, ref 属性是将bean.xm中声明的哪个bean 注入到 name 申明的属性中去

(5)测试
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); 
 PersionSevice ps=(PersionSevice)ctx.getBean("persionServiceBean"); 
 ps.save(); 
 

深入理解: 模拟Spring容器属性注入的 ItcastClassPathXMLApplicationContext 容器,在以前的基础上修改,主要是理解spring容器是如何完成依赖对象的注入

/** 
 * 为属性注入值 
 */ 
 private void injectObject() { 
 for(BeanDefinition beanDefinition : beanDefines){ 
 Object bean = sigletons.get(beanDefinition.getId()); 
 if(bean!=null) 
 { 
 try 
 { 
 //得到bean对象所有的属性声明,返回的是一个数组 
 PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors(); 
 for(PropertyDefinition propertyDefinition : beanDefinition.getPropertys()) 
 { 
 for(PropertyDescriptor properdesc : ps) 
 { 
 //如果xml中读取的属性名字是bean对象属性的名字 
 if(propertyDefinition.getName().equals(properdesc.getName())) 
 { 
 //setter方法是写方法 
 Method setter = properdesc.getWriteMethod(); 
 //获取属性的setter方法 ,如果方法是private需要调用 
 if(setter!=null) 
 { 
 Object value = sigletons.get(propertyDefinition.getRef()); 
 setter.setAccessible(true); 
 setter.invoke(bean, value);//把引用对象注入到属性 
 } 
 break; 
 } 
 } 
 } 
 } 
 catch (Exception e) 
 { 
 } 
 } 
 } 
 } 
 


 测试:换成 ItcastClassPathXMLApplicationContext 容器

ItcastClassPathXMLApplicationContext ctx = new ItcastClassPathXMLApplicationContext("beans.xml"); 
 PersionSevice ps=(PersionSevice)ctx.getBean("persionServiceBean"); 

 ps.save();
分享到:
评论

相关推荐

    spring学习心得

    Spring容器的特点 (1)容器对对象的管理 a.创建时机:默认和容器一起创建。... Dependecy Injection 依赖注入 Spring 使用DI技术实现了IoC控制。 a.setter注入 b.构造注入 c.接口注入(以后了解)

    Spring 3 Reference中文

    4.4.1.2 基于setter 方法的依赖注入 41 4.4.1.3 解决依赖过程.. 42 4.4.1.4 依赖注入示例.. 43 4.4.2 深入依赖和配置.. 45 4.4.2.1 直接值(原生类型,String,等). 45 4.4.2.2 引用其它...

    springMVC-annotation注解介绍

    @Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起...

    Spring面试题含答案.pdf

    20. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter 方法注入? 21.什么是 Spring beans? 22. 一个 Spring Bean 定义 包含什么? 23. 如何给 Spring 容器提供配置元数据? 24. 你怎样定义类的作用域? 25. ...

    myspringlearning:Spring学习项目

    -VS--namebeans.xml简单属性的注入UserDAOImpl连接池需要bean的scope属性singleton单例prototype原型官方文档,scope集合注入设置好set,get方法在bean中设置好值自动装配auto-wire生命周期lazy-initinit-method,...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    xmljava系统源码-SpringInAction4:《SpringInAction4th》学习笔记

    依赖注入 AOP bean的初始化过程 spring容器 2. 装配Bean “initialization on demand holder”创建单例模式的理解,参考 Spring中单例的概念限于Spring上下文中,遵守约定 内部bean适用于setter注入和构造器注入,...

    火炬博客系统5

    业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC”, 或者“setter依赖注入”来操作这些对象,这些对象在一个外部的XML文件中被引用。...

    火炬博客系统7

    业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC”, 或者“setter依赖注入”来操作这些对象,这些对象在一个外部的XML文件中被引用。...

    火炬博客系统6

    业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC”, 或者“setter依赖注入”来操作这些对象,这些对象在一个外部的XML文件中被引用。...

    spring3.1中文参考文档

    1.1 依赖注入和控制反转 ............................................................................................................................7 1.2 模块..............................................

    JAVA核心知识点整理(有效)

    1:eden、servicorFrom 复制到 ServicorTo,年龄+1................................................................................... 25 2:清空 eden、servicorFrom.............................................

Global site tag (gtag.js) - Google Analytics