Spring 依赖注入的方法(基于xml配置)
前言
Spring依赖注入的方法有三种:
- 属性注入(setter方法注入)
- 构造函数注入(入参方式有所差异)
- 工厂方法注入(静态方法和非静态方法)
Spring依赖注入原理:是利用Java的反射机制
注: Spring可以注入类实现所需要的外部资源,实例主要注入的是属性,所有的实例都可以在idea上运行测试,文章末尾附了一些maven工程结构和配置
属性注入(set注入)
属性注入条件:类中有默认的构造方法(即无参构造方法),有属性对应的setter方法。
实例:(在Animal类中生成setter方法)
public class Animal { private String name; private String food; public void printAnlimal(){ System.out.println(name + "吃" + food); } /*java类中如果没有构造方法会自动生成默认的无参构造方法, 如果有带参数 的构造方法,Java类就不会自动生成默认构造方法,就需要手动创建无参构造方法*/ public void setName(String name) { this.name = name; } public void setFood(String food) { this.food = food; } }
xml中的bean的配置
<!--bean的id不可以相同,否则在后定义的bean会覆盖之前的bean--> <bean id="cat" class="com.ddpapa.springIoC.Animal"> <property name="name"><value>猫</value></property> <property name="food"><value>老鼠</value></property> </bean>
构造函数注入
通过类的有参构造方法注入属性值。
实例
package com.ddpapa.springIoC; public class Animal { private String name; private String food; private String animalType; public void printAnlimal(){ System.out.println(name + "吃" + food); } public Animal(String name, String food) { //有参构造方法 this.name = name; this.food = food; } }
xml中的配置
<!--1.参数类型匹配--> <bean id="cat" class="com.ddpapa.springIoC.Animal"> <constructor-arg type="java.lang.String"> <value>猫</value> </constructor-arg> <constructor-arg type="java.lang.String"> <value>老鼠</value> </constructor-arg> </bean> <!--2.索引匹配--> <bean id="cat" class="com.ddpapa.springIoC.Animal"> <constructor-arg index="0"> <value>猫</value> </constructor-arg> <constructor-arg index="1"> <value>老鼠</value> </constructor-arg> </bean> <!--3.类型索引联合匹配--> <bean id="cat" class="com.ddpapa.springIoC.Animal"> <constructor-arg index="0" type="java.lang.String"> <value>猫</value> </constructor-arg> <constructor-arg index="1" type="java.lang.String"> <value>老鼠</value> </constructor-arg> </bean>
工厂方法注入
- 非静态方法
Animal的工厂类
package com.ddpapa.springIoC; public class AnimalFactory { public Animal creatAnimal(){ //利用构造方法注入animal 的属性 Animal cat = new Animal("猫","老鼠"); return cat; } }
xml中配置
<!--animal的工厂方法不是静态的,要先实例化工厂才能使用工厂方法; 在xml中需要先配置animalFactory的bean,再指定工厂方法--> <bean id="animalFactory" class="com.ddpapa.springIoC.AnimalFactory"/> <bean id="cat" factory-bean="animalFactory" factory-method="creatAnimal"/>
- 静态方法
animal的静态工厂方法
package com.ddpapa.springIoC; public class AnimalFactory { public static Animal creatAnimal(){ //利用构造方法注入animal 的属性 Animal cat = new Animal("猫","老鼠"); return cat; } }
xml中的配置
<!--无需配置工厂bean指定工厂类和工厂方法--> <bean id="cat" class="com.ddpapa.springIoC.AnimalFactory" factory-method="creatAnimal"/>
附件
- maven工程结构
- pom.xml配置spring所需要的依赖文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ddpapa</groupId> <artifactId>springIoC</artifactId> <version>1.0</version> <name>SpringIoCAndDI</name> <dependencies> <!-- spring 依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency> </dependencies> <properties> <file.encoding>UTF-8</file.encoding> <spring.version>4.2.2.RELEASE</spring.version> </properties> </project>
- Animal类:
package com.ddpapa.springIoC; public class Animal { private String name; private String food; public void printAnlimal(){ System.out.println(name + "吃" + food); } }
- 测试类:
package com.ddpapa.springIoC; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class IoCtest { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("springIoC.xml"); Animal cat = ctx.getBean("cat",Animal.class); cat.printAnlimal(); } }
- Spring的xml配置文件
<?xml version="1.0" encoding="utf-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> </beans>