`
忘忧鸟
  • 浏览: 144992 次
  • 性别: 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依赖注入和bean的装配问题.pdf

    setter注入是Spring框架中最常用的依赖注入方式之一,它遵循JavaBean的规范。通过定义无参构造函数,并为每个依赖项提供相应的setter方法,Spring容器在创建Bean后,通过调用setter方法将依赖项注入到Bean中。这种...

    Spring - -setter方式 向bean中注入各种类型的值

    在Spring框架中,依赖注入(Dependency Injection,DI)是核心特性之一,它允许开发者通过声明式的方式管理对象的生命周期和装配。"setter方式"是DI的一种实现方式,它通过调用对象的setter方法来设置其属性值。这篇...

    Spring依赖注入——java项目中使用spring注解方式进行注入.rar

    1. `@Autowired` 注解:这是Spring中最常用的注解,用于自动装配依赖。当Spring容器扫描到这个注解时,会自动寻找类型匹配的bean进行注入。如果存在多个候选bean,可以通过`@Qualifier`注解指定特定的bean。 2. `@...

    模仿Spring依赖注入

    Spring提供了自动装配(Auto-Wiring)功能,它可以尝试根据bean的类型自动进行依赖注入。此外,通过`@Component`、`@Service`、`@Repository`和`@Controller`等注解标记类,配合`@ComponentScan`进行组件扫描,可以...

    spring依赖注入的实现原理

    3. **AutowireCandidateResolver**:处理自动装配的候选资格,决定哪些bean可以作为依赖注入的目标。 4. **DependencyDescriptor**:描述了依赖的详细信息,包括类型、是否必须等。 5. **BeanPostProcessor**:...

    基于java的企业级应用开发:Bean的装配方式.ppt

    Bean的装配,也称为依赖注入,是指将对象所需的依赖关系(例如其他对象或服务)设置到该对象中,而不是让对象自己去寻找或创建这些依赖。这样可以降低对象之间的耦合度,提高代码的可测试性和可维护性。 **基于XML...

    Spring 控制反转 依赖注入

    2. **Java注解配置**:使用如`@Component`、`@Service`、`@Repository`和`@Controller`等注解来标记组件,以及`@Autowired`、`@Qualifier`等注解进行依赖注入。 3. **Java配置类**:从Spring 3.0开始引入,使用`@...

    SpingIOC注入实例化bean

    例如,使用@Component、@Service、@Repository和@Controller注解声明bean,使用@Autowired、@Qualifier、@Value等注解进行依赖注入。 8. **Spring Boot与SpringIOC** Spring Boot简化了Spring应用的初始搭建和配置...

    Spring Ioc 注解 依赖注入

    - **@Resource**:也是用于依赖注入,但它属于JSR 250规范的一部分,可以通过name或lookup属性指定依赖的名称。 #### 五、示例代码分析 假设我们有一个简单的例子,包含一个UserService类和一个UserRepository类,...

    自己实现的Spring反转控制和依赖注入

    如果使用注解,我们可以在类或方法上使用`@Autowired`来自动装配依赖: ```java @Service public class ExampleBean { @Autowired private DependencyBean dependency; } ``` Spring会根据类型或指定的`@...

    关于spring boot中几种注入方法的一些个人看法

    在使用 @Autowired 之前,我们对一个 bean 配置起属性时,是使用 属性名" value=" 属性值"/&gt; 的方式来配置,比较繁琐,而且代码比较多。在 Spring 2.5 引入了 @Autowired 注释,我们平常直接引用的时候很少注意这些...

    Spring学习笔记(5)----依赖注入的简单实现

    在配置文件(如`applicationContext.xml`)或使用Java配置类时,我们需要定义`Repository`和`Service`这两个Bean,Spring会根据Bean的类型和名称自动装配依赖。 ```xml &lt;bean id="repository" class=...

    springIOC控制反转 依赖注入实例

    3. 测试类或主程序:这个类用于启动Spring容器,并通过容器获取和使用bean,从而展示依赖注入的效果。 通过这个小例子,你可以深入理解Spring IOC如何工作,以及如何在实际项目中应用。例如,你可以看到如何通过XML...

    Spring依赖注入检查.

    使用`@Autowired`注解可以在字段、构造器或setter方法上自动装配依赖: ```java @Component public class MyClass { @Autowired private MyDependency myDependency; } ``` 4. **接口与抽象类的依赖注入**...

    Spring中你不知道的注入方式编程开发技术共6页.pdf

    通过`@Configuration`注解的Java类,可以声明bean并进行依赖注入,这种方式更加面向对象,易于理解和维护。 这些注入方式的灵活运用,能够帮助开发者更好地管理应用中的组件,提高代码质量。通过学习和实践这些...

    spring依赖注入三种方式 测试源码

    在进行依赖注入时,Spring使用BeanFactory或ApplicationContext作为容器,负责创建、管理和装配Bean。容器读取配置文件,根据配置信息创建Bean实例并进行依赖注入。当一个Bean需要另一个Bean作为依赖时,Spring会...

    Spring.net(依赖注入应用)

    2. **属性注入**:使用setter方法或者直接通过属性来注入依赖。这种方式更加灵活,可以在对象创建后动态调整依赖。 3. **方法注入**:通过调用特定的方法注入依赖。在某些情况下,如初始化逻辑复杂时,可以使用这种...

    第四章 在Ioc容器中装配Bean

    综上所述,本章通过介绍IoC容器的概念、Bean的定义、依赖注入、作用域、生命周期管理以及自动装配等知识点,为开发者深入理解Spring框架如何管理和装配应用中的Bean提供了重要的理论基础,并且指导开发者如何在实际...

    第3章 依赖注入的实现(IOC)1

    依赖注入(DI)是IOC的一个具体实现,它通过构造函数、属性setter方法或者接口来注入依赖。Spring框架提供了多种实现DI的方式: 1. **构造函数注入**:依赖通过构造函数的参数传递给对象。当只有一个构造函数时,...

    Ioc注入讲解

    Bean的定义包含了对象的创建方式、依赖注入方式以及其他配置信息。例如: - **Bean的名称**:用于标识Bean。 - **Bean的类名**:指定Bean的具体类型。 - **构造函数参数**:指定构造函数所需的参数。 - **属性值**...

Global site tag (gtag.js) - Google Analytics