IoC思想的实现:依赖注入(一)
IoC介绍:
IoC是什么?
IoC控制反转(Inversion of control):是一种理论思想。其实就是把对象的创建、赋值和管理交给容器来实现。
为什么要使用IoC?
1、为了使用较少的代码来实现相应的功能
2、解耦合。
IoC的技术实现——依赖注入:在程序中,我们只需要使用对象的名称就可以了,至于对象的创建、赋值都不需要我们管。spring中实现DI(依赖注入)的方式主要有两种:
1、使用XML的方式来实现
2、使用注解的方式
首先:使用XML的方式进行依赖注入
步骤:
1、加spring依赖
2、创建类文件
public class Student { private String name; private int age; public void setName(String name) { System.out.println("name: "+name); this.name = name; } public String getName() { return name; } public int getAge() { return age; } public void setAge(int age) { System.out.println("age:"+age); this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
3、创建spring的xml配置文件。
<bean id="myStudent" class="com.kunkun.spring.ba01.Student"> <property name="name" value="lisi">property> <property name="age" value="20">property> bean> <bean id="myDate" class="java.util.Date"> <property name="time" value="923230123">property> bean>
4、使用ApplicationContext接口getBean方法来获取配置在bean标签中的对象。
@Test public void test(){ String config = "ba01/applicationContext.xml"; ApplicationContext ac = new ClassPathXmlApplicationContext(config); Student student = (Student) ac.getBean("myStudent"); System.out.println(student.toString()); Date date = (Date) ac.getBean("myDate"); System.out.println(date); }
上面介绍的是使用set方法来创建对象(在类中必须要有相应的set方法)。我们同样也可以使用构造放发来给属性赋值:
只需要在上面的第三步中改成:
<bean id="myStudent" class="com.kunkun.spring.ba03.Student"> <constructor-arg name="name" value="李四lisi">constructor-arg> <constructor-arg name="age" value="12">constructor-arg> <constructor-arg name="school" ref="school">constructor-arg> bean> <bean id="school" class="com.kunkun.spring.ba03.School"> <property name="name" value="北京大学">property> <property name="address" value="海淀区">property> bean>
上面的代码:其中标签属性ref表示引用类型的属性赋值。ref的值为另一个bean的id。
引用类型的自动注入
两个注入规则:byType和byName。
spring这个框架可以根据默写规则给引用类型自动赋值。
使用的规则最常用的是byName和byType
1、byName:按名称注入。java类中引用类型的属性名,和bean中id的名称一样且数据类型是一致的,这样的话,spring可以给属性自动赋值。
语法:
简单类型属性赋值
2、byType:按类型注入。java中数据类行和配置文件中声明的bean中的class属性是同源关系,自动赋值。
同源的意思就是:
(1)、同一种类型
(2)、Java中是父类,bean是子类。
(3)、java中是接口,bean是接口的实现。
语法:
简单类型属性赋值
1、byName:在bean标签中加入一个autowire的标签属性来确定注入规则。其中school中的id必须和类中的属性是相同的名字。
2、byType:spring容器会在容器中找到同源的对象(子类、实现类和同类)。如果对象重复,就会报错。
多个配置文件
优势:每个配置文件都不大,效率高,避免多人竞争一个配置文件带来的冲突。
上面的配置表示引入以Spring_开头的所有文件,和被注释掉的代码一个意思。
关键字:classpath:表示类路径,在IDEA中类路径表示为tar/classes。