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:
例如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;
- }
- }
- 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>
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;
- }
- }
- <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);
- }
- }
- @Service
- public class UserService {
- @Autowired
- private UserDao userDao;
- public void sayHello(String name) {
- this.userDao.sayHello(name);
- }
- }
- <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注入的形式获取:
通俗点讲,就是通过调用静态工厂的方法来获取自己需要的对象,为了让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");
- }
- }
- public class PersonFactory {
- public static Animal getPerson(String type){
- if ("work".equalsIgnoreCase(type)){
- return new Work();
- } else {
- return new Teacher();
- }
- }
- }
- <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>