Spring - DI & 工厂(02)

DI

Dependency Injection,翻译,依赖注入。DI是一种常用的IOC实现方式。在第01篇文章中我们知道为了实现的代码之间的解耦和,需要使用接口 + 工厂类 + 反射 + 配置文件的方式,其中这种方式的IOC就是依赖注入。

反转了谁 & 谁依赖谁

如果理解了Spring的IOC,你会发现解耦和的目的之一就是让所有的类能独立存在(不一定能独立运行)并且交由IOC容器(包括配置文件和解析配置文件的代码)管理。也就是说以前是各类之间相互耦合,类之间是平级关系。现在是IOC容器控制各个类,它的级别高于其他类。所以反转了谁指的是反转了类的控制权,把控制权交给了IOC容器。

如果类A中使用到了类B,我们就说类A依赖于类B。依赖注入指的是注入所依赖的对象,在刚才的例子中就是,把B的实例注入到A中。在第01篇文章中没有依赖注入的体现,不过依赖注入也可以通过反射来完成。

Spring注入属性

接口:UserDao,类:UserDaoImplTest,配置文件:applicationContext.xml

public interface UserDao {
    public void save();
}
public class UserDaoImpl implements UserDao{
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void save() {
        System.out.println("My name is " + name);
    }
}
<?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="UserDao" class="com.spring.firstday.UserDaoImpl">
        <property name="name" value="程序员..."></property>
    </bean>
</beans>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDaoImpl ud = (UserDaoImpl)ac.getBean("UserDao");
        ud.save();
    }
    /*Console:
     *      My name is 程序员...
     * */
}

工厂

按照第一篇文章所述。所有的实例对象的获取不应该直接new,而是通过某个工厂获取。Spring中的工厂有两个:BeanFactoryApplicationContext。继承关系图如下:


继承图

区别是BeanFactory在获取Bean的时候才会创建类的实例,ApplicationContext是在配置文件被加载的时候就创建类的实例。有两个实现类:ClassPathXmlApplicationContextFileSystemXmlApplicationContext。前者的路径是相对于项目目录的src,后者是文件系统的绝对路径。

猜你喜欢

转载自blog.csdn.net/qq_38206090/article/details/82563807
今日推荐