在閱讀這篇文章之前,大家可以先參閱《理解Spring中的依賴注入和控制反轉》一文,了解下依賴注入和控制反轉的相關內容。
三種依賴注入的方式
屬性注入,通過setter方法注入bean的屬性值或依賴的對象構造注入工廠方法注入(很少使用)
例子
這裡我們使用了spring-4.3.2,maven配置文件
<dependency> <groupid>org.springframework</groupid> spring-core</artifactid> <version>${org.springframework-version}</version> <exclusions> <exclusion> <groupid>commons-logging</groupid> commons-logging</artifactid> </exclusion> </exclusions></dependency><dependency> <groupid>org.springframework</groupid> spring-beans</artifactid> <version>${org.springframework-version}</version></dependency><dependency> <groupid>org.springframework</groupid> spring-aop</artifactid> <version>${org.springframework-version}</version></dependency><dependency> <groupid>org.springframework</groupid> spring-context</artifactid> <version>${org.springframework-version}</version></dependency><dependency> <groupid>commons-logging</groupid> commons-logging</artifactid> <version>1.2</version></dependency><!-- Junit --><dependency> <groupid>junit</groupid> junit</artifactid> <version>3.8.1</version> <scope>test</scope></dependency>applicationContext.xml配置文件
<!--?xml version="1.0" encoding="UTF-8"?--><beans xmlns="https://www.springframework.org/schema/beans" xmlns:p="https://www.springframework.org/schema/p" xmlns:util="https://www.springframework.org/schema/util" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd https://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd"> <!-- 配置bean id:標識容器中bean對象class:bean的全類名,通過反射的方式在IOC容器中創建Bean,所以要求Bean類必須有無參構造器--> <bean id="helloWorld"> <property name="name" value="crystal"></property> </bean> <!-- 通過構造方法配置bean,可以指定參數的位置和類型,以區分重載的構造函數--> <bean id="car"> <constructor-arg index="0" value="BENCHI"></constructor-arg> <constructor-arg index="1" type="double" value="200000.0"></constructor-arg> </bean> <bean id="car1"> <!-- 如果字面值包含特殊字符,使用<![CDATA[]]>包裹起來屬性值可以使用value子節點來配置--> <constructor-arg type="java.lang.String"> <value><!--[CDATA[<shanghai-->]]></value> </constructor-arg> <constructor-arg index="1" type="int" value="200"></constructor-arg> </bean> <bean id="person"> <property name="name" value="Crystal"></property> <property name="age" value="20"></property> <!-- 可以使用ref建立引用之間的關係--> <!-- <property name="car" ref="car"></property> --> <!-- <property name="car"> <ref bean="car2"/> </property> --> <!-- <property name="car"> <bean> <constructor-arg value="changanFute"></constructor-arg> <constructor-arg value="3000000"></constructor-arg> <constructor-arg value="240"></constructor-arg> </bean> </property> --> <!-- 測試賦值null --> <!-- <property name="car"><null/></property> --> <property name="car" ref="car1"></property> <!-- 為級聯屬性賦值,注意:屬性需要先初始化後才能為級聯屬性賦值,和structs2不同--> <property name="car.price" value="400000"></property> </bean> <!-- 測試配置集合屬性--> <bean id="person3"> <property name="name" value="barry"></property> <property name="age" value="21"></property> <property name="cars"> <list> <ref bean="car"> <ref bean="car1"> <bean> <constructor-arg value="changanFute"></constructor-arg> <constructor-arg value="3000000"></constructor-arg> <constructor-arg value="240"></constructor-arg> </bean> </ref></ref></list> </property> </bean> <!-- 配置Map的屬性值--> <bean id="newPerson"> <property name="name" value="lina"></property> <property name="age" value="22"></property> <property name="cars"> <!-- 使用map節點及map的entry子節點配置Map類型的成員變量--><map> <entry key="AA" value-ref="car"></entry> <entry key="BB" value-ref="car1"></entry></map> </property> </bean> <!-- 配置Properties屬性值--> <bean id="dataSource"> <property name="properties"> <!-- 使用props和prop子節點來為Properties屬性賦值--> <props> <prop key="user">root</prop> <prop key="password">1234</prop> <prop key="jdbcUrl">jdbc:mysql://test</prop> <prop key="jdbcDriver">com.mysql.jdbc.Driver</prop> </props> </property> </bean> <!-- 配置單例的集合bean,以供多個bean進行引用,需要導入util命名空間--> <util:list id="cars"> <ref bean="car"> <ref bean="car1"> </ref></ref></util:list> <bean id="person4"> <property name="name" value="Jackie"></property> <property name="age" value="30"></property> <property name="cars" ref="cars"></property> </bean> <!-- 通過p命名空間為bean的屬性賦值,需要先導入p命名空間,相對於傳統配置方式更為簡潔--> <bean id="person5" p:age="32" p:cars-ref="cars" p:name="Queue"></bean></beans>
1. 下面是簡單的屬性注入、構造注入的測試類
Car.java
package com.spring.test;public class Car {private String name;private int maxSpeed;private double price;public Car() {}public Car(String name, double price) {this.name = name;this.price = price;}public Car(String name, int maxSpeed) {this.name = name;this.maxSpeed = maxSpeed;}public Car(String name, double price, int maxSpeed) {this.name = name;this.price = price;this.maxSpeed = maxSpeed;}public void setPrice(double price) {this.price = price;}@Override public String toString() {return "Car [name:" + name + ", price:" + price + ", maxSpeed:" + maxSpeed + "]";}}HelloWorld.java
package com.spring.test;public class HelloWorld {private String name;public HelloWorld() {System.out.println("HelloWorld constructor...");}public String getName() {return name;}public void setName(String name) {System.out.println("setName:" + name);this.name = name;}@Override public String toString() {return "hello," + name;}}Person.java
package com.spring.test;public class Person {private String name;private int age;private Car car;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 Car getCar() {return car;}public void setCar(Car car) {this.car = car;}@Override public String toString() {return "Person: [name=" + name + ", age=" + age + ", car=" + car + "]";}}Main.java
package com.spring.test;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {public static void main(String[] args) {HelloWorld hello = new HelloWorld();hello.setName("barry");System.out.println("print:"+ hello + "/n");// 裝入Spring 配置文件/** * 裝入Spring 配置文件* ApplicationContext是IOC容器,它有兩個主要實現類(ClassPathXmlApplicationContext和FileSystemXmlApplicationContext) * ApplicationContext在初始化上下文時就實例化所有單例的Bean */ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");//HelloWorld hello1 = (HelloWorld) context.getBean("helloWorld"); // 通過id獲取bean對象HelloWorld hello1 = context.getBean(HelloWorld.class);// 通過類型獲取bean對象(要求在IOC容器裡該類型的對像只能有一個)System.out.println(hello1);}@Test public void testContructor() {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Car car = (Car) context.getBean("car");// 通過類型獲取bean對象(要求在IOC容器裡該類型的對像只能有一個)Car car1 = (Car) context.getBean("car1");System.out.println(car);System.out.println(car1);Person person = (Person) context.getBean("person");System.out.println(person);}} 2. 下面是集合的測試類
NewPerson.java
package com.spring.test.collections;import java.util.Map;import com.spring.test.Car;public class NewPerson {private String name;private int age;private Map<string, car=""> cars;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 Map<string, car=""> getCars() {return cars;}public void setCars(Map<string, car=""> cars) {this.cars = cars;}@Override public String toString() {return "Person: [name=" + name + ", age=" + age + ", cars=" + cars + "]";}}Person.java
package com.spring.test.collections;import java.util.List;import com.spring.test.Car;public class Person {private String name;private int age;private List<car> cars;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 List<car> getCars() {return cars;}public void setCars(List<car> cars) {this.cars = cars;}@Override public String toString() {return "Person: [name=" + name + ", age=" + age + ", cars=" + cars + "]";}}DataSource.java
package com.spring.test.collections;import java.util.Properties;public class DataSource {private Properties properties;public Properties getProperties() {return properties;}public void setProperties(Properties properties) {this.properties = properties;}@Override public String toString() {return "DataSource: [properties:" + properties + "]";}}Main.java
package com.spring.test.collections;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {@Test public void testCollections() {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Person person = (Person) context.getBean("person3");System.out.println(person);NewPerson newPerson = (NewPerson) context.getBean("newPerson");System.out.println(newPerson);DataSource dataSource = (DataSource) context.getBean("dataSource");System.out.println(dataSource);Person person4 = (Person) context.getBean("person4");System.out.println(person4);Person person5 = (Person) context.getBean("person5");System.out.println(person5);}}總結
以上就是本文關於Spring框架依賴注入方法示例的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!