您的位置:首页 > 编程语言 > Java开发

Spring依赖注入详解

2016-07-28 14:03 441 查看

Spring依赖注入详解

介绍:

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

分为:

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

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

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

一、Setter方法注入:

例如1:
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

}

上面是一个纯粹的POJO类 给了 Name 和 Age 两个简单的属性:
spring.xml中:
<bean class="com.test.spring.Person">
<property name="name" value="LYW"/>
<property name="age" value="21"/>
</bean>

这样配置Bean Person类就被Spring管理了起来

 
例如2:
还有一种复杂的情况:如果Person类 包含了一个Type对象属性,配置就比较繁琐:
Person.Java
public class Person {
private String name;
private int age;
private Type type;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void setType(Type type) {
this.type = type;
}
}
 
Type.Java
public class Type {
private String typeName;
public void setTypeName(String typeName){
this.typeName= typeName;
}
}
以上这种情况 如何配置?
有两种方法:1、内置Bean方式:
<bean class="com.test.spring.Person">
<property name="name" value="LYW"/>
<property name="age" value="21"/>
<property name="type">
<bean class="com.test.spring.Type">
<property name="typeName" value="Coding"/>
</bean>
</property>
</bean>

2、或者采引入属性的方法 :
spring.xml
<bean class="com.test.spring.Type" id="type">
<property name="typeName" value="Coding"/>
</bean>

<bean class="com.test.spring.Person">
<property name="name" value="LYW"/>
<property name="age" value="21"/>
<property name="type" ref="type"> </property>
</bean>


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

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

例如:
Person类:
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}

}
    
Spring.xml配置:
<bean id="person" class="com.test.spring.Person
<constructor-arg name="name" value="LYW" />
<constructor-arg name="age" value="21" />
</bean>
这是简单的构造注入
在配置时 name可以不写 不写会默认按照顺序 注入 
也根据属性类型注入 <constructor-arg type="int" value="21" /> 这样 不写name 写个type也可以区分

三、注解注入

列如:
UserDao.java
@Repository
public class UserDao {

public void sayHello(String name) {
System.out.println("Hello\t"+name);
}

}

UserService.java
@Service
public class UserService {

@Autowired
private UserDao userDao;

public void sayHello(String name) {
this.userDao.sayHello(name);
}
}
spring.xml
<context:annotation-config />
<context:component-scan base-package="com.lyw.*" >
</context:component-scan>
这样就可以使用注解的方式注入

四、静态工厂注入

使用静态工厂方法创建Bean实例时,class属性也必须指定,但此时class属性并不是指定Bean实例的实现类,而是静态工厂类。因为Spring需要知道是用哪个工厂来创建Bean实例。另外,还需要使用factory-method来指定静态工厂方法名,Spring将调用静态工厂方法(可能包含一组参数),来返回一个Bean实例,一旦获得了指定Bean实例,Spring后面的处理步骤与采用普通方法创建Bean实例则完全一样。需要注意的是,当使用静态工厂方法来创建Bean时,这个factory-method必须要是静态的。

通俗点讲,就是通过调用静态工厂的方法来获取自己需要的对象,为了让spring管理所有对象,我们不能直接通过"工程类.静态方法()"来获取对象,而是依然通过spring注入的形式获取: 

public interface Person(){
public void sayHello();
}


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

public class Work implements Person {
private String msg;
//依赖注入时必须的setter方法
public void setMsg(String msg){
this.msg = msg;
}
@Override
public void sayHello(){
System.out.println(msg + ",你好");
}
}

public class Teacher implements Person {
private String msg;
//依赖注入时必须的setter方法
public void setMsg(String msg){
this.msg = msg;
}
@Override
public void sayHello(){
System.out.println(msg + ",Hello");
}
}
下面的PersonFactory工厂中包含了一个getPerson的静态方法,该方法将根据传入的参数决定创建哪个对象。这是典型的静态工厂设计模式。

public class PersonFactory {
public static Animal getPerson(String type){
if ("work".equalsIgnoreCase(type)){
return new Work();
} else {
return new Teacher();
}
}
}
spring.xml配置
<bean id="work" class="com.lyw.spring.PersonFactory" factory-method="getPerson">
<!-- 配置静态工厂方法的参数 -->
<constructor-arg value="work" />
<!-- 通过setter注入的普通属性 -->
<property name="msg" value="工人" />
</bean>
<bean id="teacher" class="com.lyw.spring.PersonFactory" factory-method="getPerson">
<constructor-arg value="teacher" />
<property name="msg" value="老师" />
</bean>


这样就配置完了Spring了

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

public class PersonFactory {

public Person createPerson(){
Person person = new Person();
person.setName("LYW");
person.setAge(22);
return person;
}

}


spring.xml配置文件 
<bean id="personFactory" class="com.lyw.spring.PersonFactory"></bean>
<bean id="person" factory-bean="personFactory" factory-method="createPerson"></bean>
这样配置就可以了 

以上就是我对Spring注入的总结 希望可以喜欢 

作者:孩子你狠幼稚,真的很幼稚

出处:http://blog.csdn.net/lu1005287365/

如果,您认为阅读这篇博客让您有些收获,不妨点击一下下面的赞【赞一下】

如果,您希望有什么感觉不对的地方欢迎在下面评论【评一下】

如果,您对我的博客内容感兴趣,请继续关注我的后续博客,我是【LYW】

本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 依赖注入