概述
在java开发领域spring框架非常有名,尤其是在java领域,如果不知道spring框架,你就太low了(当然牛逼到爆的人除外)。spring框架的英文名就是springFramework,翻译过来就是spring框架。spring框架其实只是SpringSource公司的一个项目,SpringSource公司有很多项目,这是项目主页,你会看到非常多多项目。但是springFramework是最基础的,也就是最核心的。基础和核心的就是其他spring项目都要依赖springFramework项目,换句话说其他项目都是在springFramework的基础之上延伸出来的。
其他项目和springFrameWork的关系就是这样的。Spring还有其他很多东西,比如它的历史什么的,读者可以闲暇时自己百度。关于它的优点我会慢慢道来。
1IoC容器
1.1介绍
容器(container)这个词感觉已经被滥用了,什么都是容器。容器顾名思义就是装东西的东西。例如水杯是一个容器,用来装水。IoC容器就是用来装应用中的对象实例。注意我强调的是对象,这意味着同一类型的对象你可以在IoC容器中放好几个。IoC容器中,IoC的意思就是Inversion of Control(控制反转)。首先明确一下这里的控制是控制什么?这里的控制范范的说就是控制对象的生命周期,明确到一个典型点来说就是对象的实例化,再具体一点来说就是将对象依赖的其它对象传递给该对象。在一般情况下,建立一个对象都是通过new,静态方法,工厂方法等等手段。springFramework采用了一种比较高效的机制,它将实例化好的对象全部存在一个类似map结构的容器当中,每一个key都对应一个实例化对象。
Object0 obj0 = new Object0();
Object1 obj1 = new Object1();
Object2 obj2 = new Object2();
Object3 obj3 = new Object3();
Object4 obj4 = new Object4();
Object5 obj5 = new Object5();
Object6 obj6 = new
Object6(obj0,obj1,obj2,obj3,obj3,obj4,obj5);
采用springFramework之前的管理对象的方法。
public class obj6{
@Autowired
public Object0 obj0
@Autowired
public Object1 obj1
@Autowired
public Object2 obj2
@Autowired
public Object3 obj3
@Autowired
public Object4 obj4
@Autowired
public Object5 obj5
}
public class Boot{
public static void main(String[] argv){
IoC ioc = new IoC();
Object0 obj0 = new Object();
ioc.put("obj0",obj0);
Object1 obj1 = new Object();
ioc.put("obj1",obj1);
Object2 obj2 = new Object();
ioc.put("obj2",obj2);
Object3 obj3 = new Object();
ioc.put("obj3",obj3);
Object4 obj4 = new Object();
ioc.put("obj4",obj4);
Object5 obj5 = new Object();
ioc.put("obj5",obj5);
Object6 obj6 = ioc.getBean(Object6.class);
}
}
采用springFramework之后使用IoC容器来管理对象。
初看之下,发现采用IoC容器似乎要更加麻烦,要多写很多代码,但假设一下,这些对象的重用率非常高,这样的话,通过传递IoC容器就可以在不同的函数中使用这些对象。当然这个优点非常牵强,使用起来也非常不方便,在实际的开发中并不会传递IoC容器,是通过注解的方式来获取IoC容器中的对象,这样就非常方便。但这里要强调的是IoC容器的强大之处在于对象生命周期的管理,这里面涉及到很多知识,包括前面提到的注解,在下面的文章中会详细介绍。本文的重点是springFramework的使用和背后的思想,并不会深究springFramework的实现。
1.2IoC容器的实现
之前只是阐述了IoC容器的思想,现在介绍一下IoC容器在springframework中的实现。
BeanFactory
Bean工厂,bean只的就是对象实例。bean其实没有任何限制,并不需要它的类有set和get方法,只是一半情况下因为习惯和其他一些因素,都会加上set和get方法。BeanFactory就是IoC容器的最基本实现,可以实现存放对象的功能。BeanFactory只会在极少(我至今都没有见过使用BeanFactory的情况)的情况下使用。一般情况下都会使用ApplicationContext,因为BeanFactory的功能实在太基础类,也就是太弱了。
ApplicationContext
ApplicationContext是IoC容器的另一个实现,当然是在BeanFactory基础上的扩展。ApplicationContext包含了很多强大的功能,能够更加精确的控制对象的生命周期,加载资源等等。
1.3如何定义一个对象实例
因为对象需要装填到IoC容器中,因此目前最迫切的事情就是实例化一个对象。实例化一个对象有多种方式,spring将其分为来两类,一类是通过xml的方式来实例化一个对象,另一种是通过代码,也就是new关键字,工厂方法等形式来实例化一个对象,当然随着springFramework的发展,极力推荐采用通过代码的形式实例化对象。因此我会采用抛砖引玉的方式,先讲砖,而且会一带而过,因为不想在砖上话太多时间,也完全没有必要。在这里xml形式就是砖。
1.2.1通过XML实例化对象
现在我不会讲解具体实践的细节,比如这个demo需要哪些jar,xml放在哪里等等。
<?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="user" class="org.liu.spring.entity.User">
<property name="id" value="1"/>
<property name="name" value="liu"/>
<property name="password" value="pass"/>
</bean>
</beans>
public class App
{
public static void main( String[] args )
{
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
User user = context.getBean(User.class);
System.out.println(user.getName());
}
}
着差不多就是spring基于XML的HelloWorld了,但是我觉的还是麻烦,因为得配置一个麻烦的xml,及其容易让人出错。
这是这个项目的地址
好了,到这里为止,砖已经介绍完了,该讲玉了。就是采用java编写代码的形式使用对象实例的定义。
1.2.2通过JAVAConfig实例化对象
之前采用的是从classpath加载xml配置,因此采用ClassPathXmlApplicationContext.现在采用javaConfig的形式就需要一种新的ApplicationContext了,就是AnnotationConfigApplicationContext。
public class App
{
public static void main( String[] args )
{
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
User user = context.getBean(User.class);
System.out.println( user.getName());
}
}
这是项目地址.这个强烈建议下载下来。
少了一个xml是令人多么爽,我个人对xml深恶痛绝。
这里主要为让这个示例项目讲解一下,App和AppConfig不要放在默认的包路径下,一定要有包名。App顾名思义就是应用程序的执行类,拥有main函数。AppConfig就是配置类,这个配置类特殊一点,有一个@ComponentScan注解,用于扫描其它带有注解的类。因此一定要将带有@ComponentScan的类房子比较顶级的包路径下,虽然@ComponentScan是可配置的,但是为例省事不出错,就放在顶级目录下用默认配置就好。因为使用的是AnnotationConfigApplicationContext,这个context有个特点就是会把带有@Configuration的类作为配置类。在这个项目中首先将AppConfig添加到了context中,然后AppConfig声明了@ComponentScan会把所有带有注解到类扫描进来,这其中就包括config包下带有@Configuration的配置类。在这个类中配置类一个Pserson的实例对象,因此可以在App中可以直接获通过context获取到Person的实例。
小结
本章只是介绍类IoC容器的概念,以及在springIoC容器的使用。