IoC是我们常用来讲对象的控制权转换到外部的一种做法,我们是基于Spring来进行使用的,我是在学习的时候使用了这个东西,从最复杂的讲道最简单的,这个东西并不难,重要的是去理解整个过程的实现
接下来我们开始说明一下IoC是个什么,IoC(控制反转),用俗话来理解,我们在后期维护如果更换了对象的名字,我们的维护难度就比较大,因为需要从新的编译、打包、测试等操作,而像我们经常使用的对象更是应该丢到一个配置文件中,动态的进行修改,这样的效率会大大的提高,不过屁事也会更多,原本写习惯了new的对象,现在要将对象包裹在配置文件中,所以Spring提供这样的一种配置,提供给各位开发者使用。
正式进入IoC中,我们使用Marven来管理项目,所以在pom.xml下我们需要导入spring-context的jar包,导入完成后,我们在resources下创建一个spring config的配置文件
这就是我们需要创建的配置文件了,创建完成之后,我们定义一个类和一个测试类
我们对这个配置文件进行一些配置,这里需要介绍一下我们使用的Bean是什么,还是长话短说,官方语言太标准不好理解,我们就把它当做一个能够装载你需要声明对象的容器,声明在里面,后面调用就可以用了
<?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="settingDao" class="com.itheima.SettingDao"/>
</beans>
id是作为一个唯一的表示,是需要和用这个对象时的getbean操作中的名字相同
class是作为代表要创建对象的路径,也就是类的路径
public class SettingDao {
void S(){
System.out.println("the secoundy running");
}
}
我们在测试类中,我们需要配置一些其他的东西
ApplicationContext 这是一个接口,不能直接new,所以我们new了它的子类,代表把这个spring-config的文件,配置进去,下面就和我们平常创建对象的方法不同了,我们只需要调用getBean获取需要的对象名字,然后强制转换为当前这个类型,就可以直接调用下面的方法了
public class test {
public static void main(String[] args) {
ApplicationContext acc = new ClassPathXmlApplicationContext("Springconfig.xml");
SettingDao settingDao= (SettingDao)acc.getBean("settingDao");
settingDao.S();
}
}
获得结果
这就是我们使用的当中对象的方法,还有一种就是在类中声明对象,然后调用当中的方法,也就是下面这种
public class ServiceDao {
public SettingDao settingDao;
public void setting() {
System.out.println("the main is running ");
settingDao.S();
}
}
我们像刚刚那样去调用肯定是会出错的,因为这是在一个类中又调用了一次获取对象,但是Spring就帮助我们解决了这样的问题,我们在配置文件中声明了property标签在bean标签中,这种行为我们称为依赖注入(DI)会用就行
<?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="settingDao" class="com.itheima.SettingDao"/>
<bean id="serviceDao" class="com.itheima.ServiceDao">
<property name="settingDao" ref="settingDao"/>
</bean>
</beans>
我们把测试类也改了,改成测试这个的
public class test {
public static void main(String[] args) {
ApplicationContext acc = new ClassPathXmlApplicationContext("Springconfig.xml");
ServiceDao serviceDao= (ServiceDao)acc.getBean("serviceDao");
serviceDao.setting();
}
}
一运行,发现出问题了
不过这个错误,比较明显,说了我们这个类中没有一个setter方法
我们在原本的类中加入一个set方法
public class ServiceDao {
public SettingDao settingDao;
public void setSettingDao1(SettingDao settingDao) {
this.settingDao = settingDao2;
}
public void setting() {
System.out.println("the main is running ");
settingDao.S();
}
}
在测试一次发现成功了
注意:这里一样的serviceDao的id要和测试类中传进来的getBean中的名字相同,property中的name要和我们使用的setter方法中的名字相同,而后面的ref要和形参的名字相同,这样才不会报错
介绍了IoC中普通使用的方法,也是最复杂的方法,没有之一,名字对来对去的,很容易出错,后面补充简易的方法,这种刷一下就好了,知道有这么个东西就行