上一节,我介绍了什么是Spring以及Spring的优势,其中Spring最核心的两个知识点,一个是IOC,另一个是AOP。
今天我会用最通俗易懂的话让大家明白什么是IOC,IOC的作用,IOC的用法。
上课!
我们在使用Javaweb开发网站的时候,写的代码是这样的:
定义接口类:UserDao.java
public interface UserDao
{
public void getName();
}
定义实现类:UserDaoImpl.java
public class UserDaoImpl implements UserDao
{
public void getName()
{
System.out.println("我是一名研究生");
}
}
定义业务层:UserService.java
public interface UserService
{
public void getName();
}
定义实现类:UserServiceImpl.java
public class UserServiceImpl implements UserService
{
UserDao ud = new UserDaoImpl();
public void getName()
{
ud.getName();
}
}
可以看出在Service层需要new一个Dao层的对象,这样两者就会产生依赖,而且这种依赖被硬编码在程序里,如果需要修改,则需要在程序内部修改,使得程序耦合度非常高,这样的程序是不好的。
那么怎么做可以让对象之间实现解耦呢?之前我们是把对象间的依赖关系硬编码在程序里,造成了高耦合,那么我们能不能把这种依赖关系交给第三方进行处理呢?这个第三方就是IOC容器
我们可以通过Spring的IOC容器,把对象间的依赖关系交给Spring控制,这个时候如果Service层需要调用Dao层的对象,就不需要硬编码了,而是取Spring容器里面去取出来,完全不需要硬编码,实现了解耦的作用。
看这些文字可能有点绕,没关系,直接上代码,一看就懂了:
ApplicationContext.xml
<bean id="udi" class="com.DaoImpl.UserDaoImpl">
解释:首先创建一个配置文件,一般命名为ApplicationContext.xml
然后创建一个bean标签,每一个bean标签代表一个对象,比如上面的bean标签代表的是UserDaoImpl对象
id 表示 该对象的唯一标识符,通过id就可以找到这个对象, class 表示的是该对象的全限定名
通过XML配置文件,通过反射机制就完成了对象的创建:UserDao ud = new UserDaoImpl();
创建完对象之后,需要保存对象,Spring采用Map的方式来存放对象,即springMap.put(id,对象):SpringMap.put("udi",new UserDaoImpl);
写完配置文件后,我们开始去获取对象
UserServiceImpl.java
public class UserServiceImpl implements UserService
{
1.定义配置文件
String config="ApplicationContext.xml";
2.创建表示Spring容器的对象:ApplicationContext
ApplicationContext是一个接口,ClassPathXmlApplicationContext是它的实现类
ClassPathXmlApplicationContext用来读取配置文件并且创建出配置文件中的所有对象
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
3.获取对象,可以看出没有使用new关键字了,实现了解耦的效果
UserDao ud =(UserDao) ac.getBean("udi");
4.调用方法
ud.getName();
}
这样写之后,如果我们想进行修改,比如在ServiceImpl中我们不想new UserDaoImpl 了,我们想new 一个别的Impl,那么我们就不需要在代码中修改,只需要去配置文件里面去做修改,实现了解耦,方便开发。
总结一下流程:
- 创建配置文件
- ApplicationContext ac = new ClassPathXmlApplicationContext(config)读取配置文件
- 通过ac.getBean(id) 来获取对象并调用方法
如何知道xml中有多少个bean呢?我们总不能一遍一遍去看吧,spring给我们提供了接口:
获取bean的数量
public void getBeanCount()
{
String config="ApplicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
System.out.println(ac.getBeanDefinitionCount());
}
public void getBeanName()
{
String config="ApplicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
String [] bean_names=ac.getBeanDefinitionName());
for(String bean_name:bean_names)
{
System.out.println(bean_name);
}
}
大家如果有什么疑问,欢迎评论区留言。