Spring依赖注入
IOC是Spring中的重要概念,IOC是一种思想,而依赖查找DL和依赖注入DI是IOC思想的实现方式,依赖查找是针对对象,依赖注入是针对对象中的属性,依赖注入倚赖依赖查找。这篇文章主要来介绍依赖注入DI
依赖注入的方式
0 案例准备
在进行依赖注入的介绍前,我们先准备好一个Bean -- Person。
public class Person {
private String name;
private Integer age;
//getter 、 setter 、 toString 这些一定要写
}
1 setter注入
方法一:使用xml方式
- 这种方式是通过编写xml配置文件对对象的属性进行赋值,所以当我们编写好了Bean以后,我们就开始编写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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id = "person" class="Person类所在的包">
<property name="name" value="shea"/>
<property name="age" value="18"/>
</bean>
</beans>
在进行依赖查找的时候大家都有写过这个<bean>
这个标签,但是中间是没有子标签的,我们将我们要传的值写入<property>
标签中,其中name
属性就是我们对象的属性名,value
属性就是我们要给的值。
- 编写启动类
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("xml的Source Root");
Person person = ctx.getBean(Person.class);
System.out.println(person);
}
}
输出结果:
Person{name='shea', age=18}
在Person中一定要编写toString()
不然输出的就是Person所在的包,那就是依赖查找了。
方法二:使用注解
依赖注入就是倚赖于依赖查找,而依赖查找某种程度就是查找Bean,而上面我们是使用xml来标识谁是Bean,现在我们使用注解来标识谁是Bean
- 现在我们不写配置文件,我们写配置类,配置类的注解是
@Configuration
,标志JavaBean的注解是@Bean
@Configuration
public class Configuration {
@Bean
public Person person() {
Person person = new Person();
person.setName("shea");
person.setAge(18);
return person;
}
}
- 编写启动类
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(Configuration.class);
Person person = ctx.getBean(Person.class);
System.out.println(person);
}
}
输出结果
Person{name='shea', age=18}
和上一种方式是一样的
setter注入总结:
- 注入的成员变量是可变的,可以使用
setter
函数将成员的变量修改 - 注入的属性可以选择,使用setter方式注入,你可以选择你想注入哪些变量,不注入哪些变量
2 构造器注入
我们在学习面向对象的时候一定学过就是构造函数,这个注入方式就是使用的构造函数进行依赖注入,在进行注入前,我们就保留JavaBean中的toString()
方法,其他的getter setter
都删除。
然后在里面添加构造函数
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
这里是哟个xml文件注入的话就是在<bean></bean>
中添加子标签<constructor-arg index=" " value=" "/>
,index
属性就是根据构造函数中的值从0开始偏移。value
属性就是要注入的值,启动类和上面是一样的。
现在介绍一下使用注解如何完成
- 配置类的编写
@Configuration
public class ConstructorConfiguration {
@Bean
public Person person(){
return new Person("shea",18);
}
}
启动类也和上面的一样,最后的输出结果也都是一样的。
构造器注入总结
其实setter注入和构造器注入,这两个的学习过程和我们学习面向对象的setter
和构造函数两个过程是一样的,本质只要你了解基本的面向对象知识,你就可以理解这两个注入方式,本质来说,就是多了一些Spring的规范。
- 注入的成员变量不可变,在构造器中没有setter函数可以使用,一旦注入一个对象那值就不可变了。
- 注入的成员固定,这里你要注入的变量选择完全取决于你的构造函数的中所固定的属性
3 注解式属性注入
这个非常简单,如果我们想要对Person
的值进行注入的话,我们只要在它的属性上添加@value
标签
如下:
@Component
public class Person {
@Value("shea")
private String name;
@Value("18")
private Integer age;
//getter 、 setter 、 toString 这些一定要写
}
编写启动类的时候要进行Bean组件扫描,所以再加上一个@Component
注解标签
测试类如下
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext("Persen所在的包");
Person person = ctx.getBean(Person.class);
System.out.println(person);
}
}
输出的结果也是和上面的是一样的
转载自:https://juejin.cn/post/7159498158114865160