您的位置:首页 > 编程语言 > Java开发

自学spring

2016-04-26 23:33 330 查看
Spring最基本的功能就是ioc容器,什么是ioc容器。

一般说道容器,我们都会想到一些高大上的东西,比如tomcat等等这些web容器,docker,甚至有些人将某些数据结构(List,Set,Map)也称为容器。可以说容器这个词已经被用烂了。

那就讲解一下容器最本质的意思,就是放东西的东西。所以上面的这些东西都可以被称之为容器。那么什么是ioc容器,ioc是控制反转的意思,也有人讲ioc称之为依赖注入,我们只将他们称为专有名词,就和迭代器一样,谁能从它的名字里面猜出它的功能。ioc容器的意思就是,我们将实例化好的对象,存到ioc容器当中,没当我们需要某种类型,或者某个对象的时候,我们可以通过唯一标识符,或者id,来获取这个对象。

可能有人会说,这很麻烦。的确,这很麻烦。但是比如碰到某些场景,比如,我们需要平凡的实例化某些实例,就拿web应用来说,比如数据访问,我们需要频繁的创建数据访问的对象,一般情况下,不同的数据类型都会创建不同的数据访问对象,比如访问teacher表,和访问student表用的就不同一种数据访问对象。比如StudentDao,teacherDao。有人说那我每次都写一个new,把数据访问对象实例化不就可以了嘛。的确可以,而且也不会出错。比如我们可能会用到一堆数据访问对象,好啊,我们可以将这些对象都在构造函数中实例化了,用到用不到也浪费不了多少资源。这意味着我们每个处理不同请求的类,都有一个非常大的构造函数,里面用new实例化了非常多的相同的简单的数据访问对象。我不知道你写完这样的代码作何感想,你也许你突然会发现自己写好一个处理请求的构造函数之后,发现其他的构造函数都在复制和粘贴,在做一些没用的重复劳动,写的都是无用new代码。


public class StudyController{
StudentDao studentDao;
TeachaerDao teacherDao;
HeadMasterDao teacherDao;

public StudentController(){
studentDao = new StudentDao();
teacherDao = new TeacherDao();
teacherDao = new HeadMasterDao();
.....
}
}


那我们可不可以不这样做呢,可以那就是采用ioc容器。比如你new了一个ioc容器,把要实例化的对象都通过配置文件告诉了ioc容器,而且你采用类型来当做唯一标识符,当然你也可以采用其他的,比如这个对象的id就是1,那个对象的id就是2,这样同种类型就可以建立不同的对象了。到时候我们只需要实例化以ioc容器(当然这时候人们都爱叫它上下文Context),StudyController就可以这样写了。

public class StudyController{
StudentDao studentDao;
TeachaerDao teacherDao;
HeadMasterDao teacherDao;
public StudentController(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
studentDao = context.get(1);
teacherDao = context.get(2);
teacherDao = context.get(3);
.....
}

}


看完这些有人要骂我sb了,这不比刚刚还复杂。

但是考虑一下在web应用的时候,我们给这个web应用建立一个全局ioc容器,通过静态方法来实现,那么代码会这样:

public class StudyController{
StudentDao studentDao;
TeachaerDao teacherDao;
HeadMasterDao teacherDao;

public StudentController(){
StudentDao studentDao = MyApplicationContext.get(1);
TeachaerDao teacherDao = MyApplicationContext.get(2);
HeadMasterDao teacherDao = MyApplicationContext.get(3);
.....
}
}


这样就和最开始一样复杂。

那么spring想了一下,其实这些只是语法上的重复,正在不重复的是id的值。于是spring通过annotation(注解,和注释有相同的目的,只不过,注释是给人看的,注解是给ioc容器看的)来改进语法。

public class StudyController{
@Annotation(1)
StudentDao studentDao;
@Annotation(2)
TeachaerDao teacherDao;
@Annotation(3)
HeadMasterDao teacherDao;
}


这样看一下,是不少写了很多。好了又的人可能会说,spring就是帮助我们通过它的注解,来改善我们少些代码。这就错了,spring的功能很强大,非常强大,但是它对我们最直观的感受,就是我们可以通过注解来少写代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring