Spring IoC概念 原

    Spring现在是我们在开发当中必不可少的框架,几乎所有的java项目都用到了spring框架,但是有时候想一想感觉虽然是每天都在和Spring框架接触,但是好像还真的不太了解它背后的原理,所以最近把Spring的一些知识整理一下,写一些博客做一个记录。

    

什么是Spring IoC

    Spring IoC有一个中文解释:控制反转。控制反转的意思就是我们把创建对象的权利交给Spring来完成,我们不需要去创建对象,只需要在要用到的时候调用对象就行,而这些对象都在Spring的IoC容器里面存储着。举一个例子,我们创建了一个Student类,Student类里面有一个study()方法,这时候我们再创建一个Teacher类,如过我们想要在Teacher中调用Student的study()方法的话就需要像下面代码一样在Teacher中new一个Student实例然后调用study()方法,一般的代码中我们是这样做的,但是在一项目当中我们往往需要用到很多不同的类当中的不同方法,这样我们就需要不停的new出需要的对象的实例,而且这些实例在我们使用完之后有时候就没什么用了,这样不仅我们要在代码中不停地去new新的实例,也非常影响代码的性能。Spring IoC很好地为我们解决了这个问题,当我们的代码利用Spring跑起来的时候,Spring会在IoC容器中为我们代码中需要创建实例的类创建好实例放在IoC容器当中(当然我们也可以设置在用到Spring在我们用到某个对象的实例的时候在创建也行),我们需要的时候再去调用就可以,而且Spring中创建这些实例默认是单例模式,只会创建一个,这样就相当于节省了代码的性能消耗。

    这就是Spring IoC,为我们的系统创建并保存实例供我们在需要的时候调用。

public class Student {
    public void study() {
        System.out.println("学生正在学习。。。");
    }
}

public class Teacher {
    public static void main(String[] args) {
        Student student = new Student();
        student.study();
    }
}

 

Spring的IoC容器

    刚刚在上面提到了Spring的IoC容器,它是一个放置Spring所产生的对象实例(Spring中称呼这些实例为bean)的地方,我们可以再IoC容器当中获取我们需要的所有项目的实例也就是bean。

    Spring IoC容器的设计主要是基于BeanFactory和ApplicationContext两个接口,其中ApplicationContext是BeanFactory的子接口,BeanFactory是一个顶级接口,我们在实际开发过程中用到最多的往往是ApplicationContext这个子接口,因为ApplicationContext相当于BeanFactory的一个扩展,和BeanFactory比起来,ApplicationContext的方法和功能更加齐全。

 

Spring IoC在代码当中的实现

    再好的理论也要用到实践当中,上面讲的都是一个Spring的理论知识,到底Spring IoC在代码里是如何展示的?这里是一个我个人的理解。(由于现在流行的是以注解的方式开发,所以我们这里就以注解方式为例,XML方法不作讲解)。

    Spring IoC的作用是控制反转,帮助我们来创建对象的实例,但是Spring如何知道到底哪些类需要被创建实例?我们一般在需要被创建实例的类上加上特定的注解告诉Spring这个类需要被创建实例总共四个注解:@Controller,@Service和@Repository这三个分别用来注解controller层、service层和dao层。还有一个特殊的注解@Component哪一层都可以注释,使用注解的时候放在类的最上面即可。其实这几个注释在目前来说区别不得太大,它们的功能仅仅是通知Spring将目标类创建一个实例放在IoC容器中即可,当时Spring建议将这些类的每一层注释清楚,不排除以后会做区分的可能,所以在写代码的时候一定要注意规范。

//注解放在类的上方
@Service
public class MenuServiceImpl implements MenuService {

    当然仅仅是使用注解是不够的,我们需要告诉Spring这些有注解的类文件的地址,于是这里一般是在xml文件中配置扫描器,我们一般在Springmvc的xml配置@Controller的扫描,在Spring配置文件里面配置@Service和@Repository的扫描,如下代码base-package中设置的即为这些注解类所在的包。

<!-- springmvc配置文件 -->
<!-- 自动扫描的包名,只扫描@Controller -->
<context:component-scan base-package="com.test.controller" >
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!-- spring配置文件 -->
<!-- 扫描service和dao包下所有使用注解的类型 -->
<context:component-scan base-package="com.test.service">
	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章