什么是依赖注入
- 当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。
- 所谓依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理。
什么是控制反转
- 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
- 站在调用者角度去描述:原先我们是在调用者的代码中 直接控制被调用者。而现在有了spring容器后,对象的实例不是由调用者自己去new创建,而是由spring容器帮我们完成。站在调用者的角度去看,原先自己控制对象的创建权交给了容器。控制权发生了反转。这就是控制反转(对象的创建权反转)
控制反转概述图
Bean的依赖注入方式
- 构造方法
- set方法
第一种注入方式:使用set方法注入属性
(1)创建类,定义属性和对应的set方法
public class Book{
//表示书名
private String bname;
//无参构造器
public Book(){}
//有参构造器
public Book(String bname){
this.bname=bname;
}
//set方法注入属性
public void setBname(String bname){
this.bname=bname;
}
public void test(){
System.out.println("书名:"+bname);
}
}
(2)在Spring配置文件中配置对象创建,配置属性注入
<!--使用bean标签创建Book对象-->
<bean id="book"class="com.wzx.entity.Book">
<!--bean管理 -> set方法注入属性:
使用property标签完成属性注入
name属性:指定类里面要注入属性值的那个属性名称
value属性:向属性注入的值
注意:property默认使用的是类的set方法进行注入属性
-->
<property name="bname" value="Java程序设计">
</property>
</bean>
(3)编写测试代码,测试Spring通过set方法注入属性
public void test1(){
//1.使用IOC容器加载xml配置文件,创建Book对象
ApplicationContext context=new ClassPathXmlApplicationContext("beanbook.xml");
//2.获取配置文件创建创建的Book对象
Book book=context.getBean("book",Book.class);
book.test();
}
public static void main(String[]args){
TestBook testBook=newTestBook();
testBook.test1();
}
p名称空间注入属性
使用p名称空间注入,可以简化xml配置方式
第一步:添加p名称空间到配置文件中
第二步:创建bean标签,进行属性注入
<!--
使用p名称空间完成属性注入(底层使用的是set方法注入属性)
1.添加p名称空间到配置文件中
xmlns:p="http://www.springframework.org/schema/p"
2.进行属性注入,在bean标签中进行操作
-->
<bean name="order" class="com.wzx.spring.entity.Order" p:oname="IPhone" p:address="USA">
</bean>
第三步:编写代码进行测试
public void test02(){
//1.使用IOC容器加载Spring配置文件,创建Order对象
ApplicationContext context=new ClassPathXmlApplicationContext("bean_p_space.xml");
//2.获取Spring创建的Order对象
Order order=context.getBean("order",Order.class);//alt+回车快速导包
//3.测试属性是否获取到
order.test();
}
第二种注入方式:使用有参构造器注入属性
(1)创建类,定义属性,创建属性对应的有参构造器
public class Order{
//属性
private String oname;
private String address;
//有参构造器
public Order(String oname,String address){
this.oname=oname;
this.address=address;
}
public void test(){
System.out.println(oname+"----------------"+address);
}
}
(2)在Spring配置文件进行配置
<!--通过Spring配置文件创建Order对象-->
<bean id="order" class="com.wzx.spring.entity.Order">
<!--有参构造注入属性-->
<!--第一种方式-->
<constructor-arg name="oname" value="电脑">
</constructor-arg>
<constructor-arg name="address" value="China">
</constructor-arg>
</bean>
<bean id="order1" class="com.wzx.spring.entity.Order">
<!--第二种方式-->
<constructor-arg index="0" value="数码">
</constructor-arg>
<constructor-arg index="1" value="USA">
</constructor-arg>
</bean>
(3)编写测试代码进行测试
public void test01(){
//1.使用IOC容器加载Spring配置文件,创建Order对象
ApplicationContext context=new ClassPathXmlApplicationContext("beanorder.xml");
//2.获取Spring创建的Order对象
Order order=context.getBean("order",Order.class);//alt+回车快速导包
//3.测试属性是否获取到
order.test();
}