反射
反射听起来高大上,其实就可以理解为:通过类的路径(就是个字符串)来new一个类:
IOC
依赖注入,依赖注入的好处就是:如果你的程序中new一个类是需要动态new的,那么得到这个需要new的类的名称之后,就可以动态new出来。
我理解IOC就像工厂方法+反射动态生成对象。
举个例子:
假设有这些类
class food{
}
class apple extends food{
void eat(){
System.out.println("apple");
}
}
class banana extends food{
void eat(){
System.out.println("banana");
}
}
我们程序中会动态生成今天吃的食物的名称是apple还是banana,如果是apple就要求返回一个apple对象,如果想吃banana就要求返回一个banana对象。为了应对这种需求,我们可以写出一个工厂类:
class Factory{
food getFood(String name){
if (name.equals("apple")){
return new apple();
} else if (name.equals("banana")){
return new banana();
}
return null;
}
}
但是这样写有个麻烦,假设我们的菜谱上又加上一个类:
class potato extends food{
void eat(){
System.out.println("potato");
}
}
那么为了适应这种变化,我们就要去更改工厂类,所以我们要通过反射来实现我们的工厂类:
class Factory{
Class<?> getFood(String name) throws ClassNotFoundException {
return Class.forName(name);
}
}
这样无论以后增加什么菜谱,我们都不需要更改工厂类,我们只需要传过来新菜品的名字就能new新菜品。
IOC就是这个道理,我们先将每个POJO注册到bean容器中,(bean容器可以理解成一个哈希表,key是bean的名字,value是名字对应的实体类)当我们程序中需要动态new一个类的时候,我们只需要用这个类的名字到bean容器中去获得名字对应的实体类就可以,这样的好处是:
程序中可以动态的获取对象,比方说每天的菜品是变化的,当我们获得一个菜品的名字字符串的时候,如果不使用IOC,那么我们就很难new一个对象。而且使用bean容器管理对象也很简单。
来源:CSDN
作者:canaryW
链接:https://blog.csdn.net/cobracanary/article/details/103465813