一、谈一下你对spring的理解?
Spring是轻量级开发应用开源框架,为简化企业级开发而生,零配置编程,面向bean编程,与主流框架无缝集成。
二、Spring框架有哪些主要模块?
Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。
三、什么是IOC,什么是依赖注入?
IOC:Inverse Of Control(反转控制)
IOC容器是Spring中的一个核心,主要是用来存储Bean的,保证Bean之间的依赖关系,Spring提供IOC容器通过配置文件或者注解的方式来管理对象之间的依赖关系。
传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。
反转控制的思想:反转了资源的获取方向,改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。
那接下里用代码直接感受下ioc控制翻转:
1、pojo类
public class Dog {
public String name;
public Integer age;
private String color;
public Dog() {
}
public Dog(String name, Integer age, String color) {
this.name = name;
this.age = age;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Dog dog = (Dog) o;
return Objects.equals(name, dog.name) &&
Objects.equals(age, dog.age) &&
Objects.equals(color, dog.color);
}
@Override
public int hashCode() {
return Objects.hash(name, age, color);
}
}
2、我们现在要给pojo类name属性赋值,我们普通的方式:
public class TestIoc {
@Test
public void test(){
Dog c = new Dog();
c.setName("二狗");
System.out.println(c.getName());
}
}
我们实例化要进行new的操作,是我们人为的操作,这个实例的控制权在我们自己的手中,将实例化后的这个实例由c这个变量来保存。
3、我们使用ioc进行操作
//配置文件,通过bean注解将Dog类注入到ioc容器中
@Configuration
public class Appconfig {
@Bean
public Dog dog(){
return new Dog();
}
}
public class TestIoc {
@Test
public void test1(){
//初始化容器
AnnotationConfigApplicationContext c = new AnnotationConfigApplicationContext(Appconfig.class);
//从容器中获取实例dog
Dog dog =(Dog)c.getBean("dog");
dog.setName("二狗");
}
}
以前是new一个对象,现在不用手动去创建对象,通过bean或注解自动创建了IOC容器,自行创建了对象。我们将这个创建实例的控制权交给了Spring,之前new()来对象由一个变量来保存,spring创建的对象是有Spring容器来保存IOC容器,用来存储bean对象。我们需要的时候直接拿就可以。注意:每次在通过IOC容器读取Bean的实例之前,需要先将IOC容器本身实例化。
IOC开发中的两种实现方式 :配置文件,注解。(后期我会在再写一篇文章)
依赖注入就是DI(Dependency Injection),ioc的最终目的就是实现依赖注入。用大白话说就是一个类需要另一个类的协助来完成工作,这就产生了依赖,所以需要的依赖项就要注入过来协同完成工作。
软件设计原则中有一个依赖倒置原则(DIP)讲的是要依赖于抽象,不要依赖于具体,高层模块不应该依赖于低层模块,二者应该依赖于抽象。简单的说就是为了更好的解耦,就是面向接口编程,通过调用接口的方法,而不直接实例化对象去调用。而控制反转(IOC)就是这样的一个实现思路,这个思路的其中一种实现方式就是依赖注入(DI)。
这样做的好处就是如果添加了另一个实现类,不需要修改之前的代码,只需要修改注入的地方将实现类替换。我们实例化接口类的时候不用手动New来构造实现类,这种工作我们可以交给DI、Autofac等这些IOC框架去构建。