Spring框架依赖注入和类的自动装配
依赖注入
- 依赖注入的方式有3种:----你去注入属性的时候有这3种注入方式;
- 接口注入(调用和实现分离):不常用
-
setter注入(就是使用set方法为属性赋值):set的注入,在你的这个bean(实体类中)文件,一定要有的set方法
注:如果实体类中的属性值是数组,集合,xml文件注入的时候使用< list >标签
- 构造器注入(通过构造方法赋值):要进行构造方法注入的时候,一定要保证你的这个bean文件中有先关的这个构造方法,通过标签中的value为元素的构造方法赋值
- 代码示例:
- 依赖jar包
- 接口注入
/*
这是一个语言转换的接口
*/
public interface ChangeLetter {
public String change() throws Exception;
}
实现类
/*
这是语言转换接口的一个实现类将字符串转换成小写
*/
public class ChangetoLowerCase implements ChangeLetter{
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
@Override
public String change() throws Exception {
return str.toLowerCase();
}
}
bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="ChangetoLowerCase" class="com.hfc.intface.ChangetoLowerCase">
<property name="str" value="HHHHJHHHHHHHHHHHHHSDFSDFSDFSD"></property>
</bean>
</beans>
测试类
public class Test {
public static void main(String[] args) throws Exception {
ApplicationContext applicationContext=new
ClassPathXmlApplicationContext("com/hfc/intface/bean.xml");
ChangeLetter changeLetter=applicationContext.getBean("ChangetoLowerCase",
ChangetoLowerCase.class);
System.out.println( changeLetter.change());
}
}
-
使用set和构造器注入
这是student类
package com.wdhcr.bean;
public class Student {
private String name;
private int age;
private String address;
public Student() {
}
public Student(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
Person类
package com.wdhcr.bean;
/*
* 这是实体类,有它的相关的成员变量,并生成了它的get set方法 ,
* 还有带参构造器,和重写了它的tostring方法
* */
public class Person {
private String name;
private int age;
private Student student;
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public Person() {
}
public Person(String name, int age, Student student) {
this.name = name;
this.age = age;
this.student = student;
}
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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", student=" + student +
'}';
}
}
bean.xml文件依赖注入
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 使用set的方式注入-->
<bean id="person" class="com.wdhcr.bean.Person">
<property name="name" value="张三"></property>
<property name="age" value="12"></property>
<property name="student" ref="student"></property>
</bean>
<!-- 使用构造器的方式-->
<bean id="person1" class="com.wdhcr.bean.Person">
<constructor-arg index="0"><value>张三</value></constructor-arg>
<constructor-arg index="1"><value>13</value></constructor-arg>
<constructor-arg index="2" ref="student"></constructor-arg>
</bean>
<bean id="student" class="com.wdhcr.bean.Student">
<property name="name" value="小学生"></property>
<property name="age" value="10"></property>
<property name="address" value="北京"></property>
</bean>
</beans>
测试类代码
package com.wdhcr.test;
import com.wdhcr.bean.Person;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/*
* 这是person的测试类
* 使用spring框架创建person的一个对象
* */
public class PersonTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("bean.xml");
Person person = classPathXmlApplicationContext.getBean("person", Person.class);
System.out.println(person);
System.out.println(person.getName()+"\t"+person.getAge());
System.out.println("-------------");
Person person1 = classPathXmlApplicationContext.getBean("person1", Person.class);
System.out.println(person1);
System.out.println(person1.getName()+"\t"+person1.getAge());
}
}
运行结果
自动装配
- autowire byName (按名称自动装配)
- 由于在手动配置xml过程中,常常发生字母缺漏和大小写等错误,而无法对其进行检查,使得开发效率降低。采用自动装配将避免这些错误,并且使配置简单化。
- 当一个bean节点带有 autowire byName的属性时。
- 将查找其类中所有的set方法名
- 去spring容器中寻找是否有此字符串名称id的对象,如果有,就取出注入;如果没有,就报空指针异常
- autowire byType (按类型自动装配)
- 使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。
- constructor
- 根据构造器自动装配
- 代码示例
- 依赖jar包
- Dog类
package com.wdhcr.auto;
/*
*
*这是dog的实体类使用xml文件注入
* 生成它的set get方法和带参和无参构造
* 重写它的tostring方法
* */
public class Dog {
private String name;
private Integer age;
private String address;
public Dog() {
}
public Dog(String name, Integer age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + ", address=" + address + "]";
}
}
- Cat类
package com.wdhcr.auto;
/*
*
*这是cat的实体类使用xml文件注入
* 生成它的set get方法和带参和无参构造
* 重写它的tostring方法
* */
public class Cat {
private String name;
private Integer age;
private String address;
public Cat() {
}
public Cat(String name, Integer age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
- User类
package com.wdhcr.auto;
/*
*
*这是user的实体类使用xml文件注入
* 生成它的set get方法和带参和无参构造
* 重写它的tostring方法
* */
public class User {
private String name;
private Integer age;
private String address;
private Dog dog;
private Cat cat;
public User() {
}
public User(String name, Integer age, String address, Dog dog, Cat cat) {
this.name = name;
this.age = age;
this.address = address;
this.dog = dog;
this.cat = cat;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
", dog=" + dog +
", cat=" + cat +
'}';
}
}
bean.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 让cat和dog根据name自动装配-->
<!-- <bean id="user" class="com.wdhcr.auto.User" autowire="byName">-->
<!-- <property name="name" value="张三"></property>-->
<!-- <property name="age" value="14"></property>-->
<!-- <property name="address" value="北京"></property>-->
<!-- </bean>-->
<!-- 让cat和dog根据类型自动装配-->
<!-- <bean id="user" class="com.wdhcr.auto.User" autowire="byType">-->
<!-- <property name="name" value="张三"></property>-->
<!-- <property name="age" value="14"></property>-->
<!-- <property name="address" value="北京"></property> -->
<!-- </bean>-->
<!-- 使用构造器自动装配-->
<!-- <bean id="user" class="com.wdhcr.auto.User" autowire="constructor">-->
<!-- <constructor-arg index="0" value="李四"></constructor-arg>-->
<!-- <constructor-arg index="1" value="14"></constructor-arg>-->
<!-- <constructor-arg index="2" value="北京"></constructor-arg>-->
<!-- </bean>-->
<!-- <!– set注入使用byName自动装配–>-->
<!-- <bean id="dog" class="com.wdhcr.auto.Dog" >-->
<!-- <property name="name" value="小狗"></property>-->
<!-- <property name="age" value="3"></property>-->
<!-- <property name="address" value="狗窝"></property>-->
<!-- </bean>-->
<!-- <bean id="cat" class="com.wdhcr.auto.Cat" >-->
<!-- <property name="name" value="小猫"></property>-->
<!-- <property name="age" value="2"></property>-->
<!-- <property name="address" value="猫窝"></property>-->
<!-- </bean>-->
</beans>
- 测试类
package com.wdhcr.auto;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext classPathXmlApplicationContext =
new ClassPathXmlApplicationContext("com/wdhcr/auto/bean.xml");
User user = classPathXmlApplicationContext.getBean("user", User.class);
System.out.println(user);
}
}
- 以上就简单的介绍了Spring框架的依赖注入和自动装配。