Spring依赖注入详解

Spring依赖注入详解

介绍:

  所谓 依赖注入 就是指:在运行期间,有外部容器动态地将依赖对象注入到组件中

分为:

1.setter方法注入
2.使用构造器注入
3.使用Field注入(用于注解方式)

4.使用静态工厂的方法注入

5.普通工厂类的方法注入

一、Setter方法注入:

例如1:
  1. public class Person {  
  2.     private String name;  
  3.     private int age;  
  4.     public String getName() {  
  5.         return name;  
  6.     }  
  7.     public void setName(String name) {  
  8.         this.name = name;  
  9.     }  
  10.     public int getAge() {  
  11.         return age;  
  12.     }  
  13.     public void setAge(int age) {  
  14.         this.age = age;  
  15.     }  
  16.       
  17. }  
上面是一个纯粹的POJO类 给了 Name 和 Age 两个简单的属性:
spring.xml中:
  1. <bean class="com.test.spring.Person">  
  2.     <property name="name" value="LYW"/>  
  3.     <property name="age" value="21"/>  
  4. </bean>  
这样配置Bean Person类就被Spring管理了起来
  例如2:
还有一种复杂的情况:如果Person类 包含了一个Type对象属性,配置就比较繁琐:
Person.Java
  1. public class Person {  
  2.     private String name;  
  3.     private int age;  
  4.         private Type type;  
  5.     public String getName() {  
  6.         return name;  
  7.     }  
  8.     public void setName(String name) {  
  9.         this.name = name;  
  10.     }  
  11.     public int getAge() {  
  12.         return age;  
  13.     }  
  14.     public void setAge(int age) {  
  15.         this.age = age;  
  16.     }  
  17.     public void setType(Type type) {  
  18.         this.type = type;  
  19.     }  
  20. }  
  Type.Java
  1. public class Type {  
  2.     private String typeName;  
  3.     public void setTypeName(String typeName){  
  4.         this.typeName= typeName;  
  5.     }  
  6. }  
以上这种情况 如何配置?
有两种方法:1、内置Bean方式:
  1. <bean class="com.test.spring.Person">  
  2.     <property name="name" value="LYW"/>  
  3.     <property name="age" value="21"/>  
  4.     <property name="type">  
  5.         <bean class="com.test.spring.Type">  
  6.             <property name="typeName" value="Coding"/>  
  7.         </bean>  
  8.     </property>  
  9. </bean>  
2、或者采引入属性的方法 :
spring.xml
  1. <bean class="com.test.spring.Type" id="type">  
  2.         <property name="typeName" value="Coding"/>  
  3.     </bean>  
  4.   
  5. <bean class="com.test.spring.Person">  
  6.         <property name="name" value="LYW"/>  
  7.         <property name="age" value="21"/>  
  8.         <property name="type" ref="type"> </property>  
  9.      </bean>  

上下两种配置方式  建议使用下面这种 看起来 方便 不杂乱 

二、构造器注入: 这种方式的注入是指带有参数的构造函数注入

例如:
Person类:
  1. public class Person {  
  2.     private String name;  
  3.     private int age;  
  4.     public String getName() {  
  5.         return name;  
  6.     }  
  7.     public void setName(String name) {  
  8.         this.name = name;  
  9.     }  
  10.     public int getAge() {  
  11.         return age;  
  12.     }  
  13.     public void setAge(int age) {  
  14.         this.age = age;  
  15.     }  
  16.     public Person(String name, int age) {  
  17.         super();  
  18.         this.name = name;  
  19.         this.age = age;  
  20.     }  
  21.       
  22. }  
     Spring.xml配置:
  1. <bean id="person" class="com.test.spring.Person  
  2.         <constructor-arg name="name" value="LYW" />  
  3.                 <constructor-arg name="age" value="21" />  
  4.       </bean>  
这是简单的构造注入
在配置时 name可以不写 不写会默认按照顺序 注入 
也根据属性类型注入  <constructor-arg type="int" value="21" /> 这样 不写name 写个type也可以区分

三、注解注入

列如:
UserDao.java
  1. @Repository  
  2. public class UserDao {  
  3.   
  4.     public void sayHello(String name) {  
  5.         System.out.println("Hello\t"+name);  
  6.     }  
  7.   
  8. }  
UserService.java
  1. @Service  
  2. public class UserService {  
  3.   
  4.     @Autowired  
  5.     private UserDao userDao;  
  6.   
  7.     public void sayHello(String name) {  
  8.         this.userDao.sayHello(name);  
  9.     }  
  10. }  
spring.xml
  1. <context:annotation-config />  
  2.    <context:component-scan base-package="com.lyw.*" >  
  3.    </context:component-scan>  
这样就可以使用注解的方式注入

四、静态工厂注入

使用静态工厂方法创建Bean实例时,class属性也必须指定,但此时class属性并不是指定Bean实例的实现类,而是静态工厂类。因为Spring需要知道是用哪个工厂来创建Bean实例。另外,还需要使用factory-method来指定静态工厂方法名,Spring将调用静态工厂方法(可能包含一组参数),来返回一个Bean实例,一旦获得了指定Bean实例,Spring后面的处理步骤与采用普通方法创建Bean实例则完全一样。需要注意的是,当使用静态工厂方法来创建Bean时,这个factory-method必须要是静态的。
通俗点讲,就是通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过spring注入的形式获取: 

  1. public interface Person(){  
  2.     public void sayHello();  
  3. }  

下面是接口的两个实现类:

  1. public class Work implements Person {  
  2.     private String msg;  
  3.     //依赖注入时必须的setter方法  
  4.     public void setMsg(String msg){  
  5.         this.msg = msg;  
  6.     }  
  7.     @Override  
  8.     public void sayHello(){  
  9.         System.out.println(msg + ",你好");  
  10.     }  
  11. }  

  1. public class Teacher implements Person {  
  2.     private String msg;  
  3.     //依赖注入时必须的setter方法  
  4.     public void setMsg(String msg){  
  5.         this.msg = msg;  
  6.     }  
  7.     @Override  
  8.     public void sayHello(){  
  9.         System.out.println(msg + ",Hello");  
  10.     }  
  11. }  
下面的PersonFactory工厂中包含了一个getPerson的静态方法,该方法将根据传入的参数决定创建哪个对象。这是典型的静态工厂设计模式。
  1. public class PersonFactory {  
  2.     public static Animal getPerson(String type){  
  3.         if ("work".equalsIgnoreCase(type)){  
  4.             return new Work();  
  5.         } else {  
  6.             return new Teacher();  
  7.         }  
  8.     }  
  9. }  
spring.xml配置
  1. <bean id="work" class="com.lyw.spring.PersonFactory" factory-method="getPerson">  
  2.     <!-- 配置静态工厂方法的参数 -->  
  3.     <constructor-arg value="work" />  
  4.     <!-- 通过setter注入的普通属性 -->  
  5.     <property name="msg" value="工人" />  
  6. </bean>  
  7. <bean id="teacher" class="com.lyw.spring.PersonFactory" factory-method="getPerson">  
  8.     <constructor-arg value="teacher" />  
  9.     <property name="msg" value="老师" />  
  10. </bean>  

这样就配置完了Spring了

五、普通工厂类的方法注入

  1. public class PersonFactory {    
  2.     
  3.     public Person createPerson(){    
  4.         Person person = new Person();    
  5.         person.setName("LYW");    
  6.         person.setAge(22);    
  7.         return person;    
  8.     }    
  9.         
  10. }    

spring.xml配置文件 
  1. <bean id="personFactory" class="com.lyw.spring.PersonFactory"></bean>    
  2. <bean id="person" factory-bean="personFactory" factory-method="createPerson"></bean>    
这样配置就可以了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值