Spring学习
Spring框架的由来就是为了简化企业级开发,它当中有2个技术,一个是Ioc(inversion-of-control:叫也依赖注入) 反向控制 和 Aop面向方面编程。
什么依赖注入。我们先来讨论一个简单的问题,一个汽车要从A地行驶到B地,这个问题很简单,我们可以很容易的抽象出一个模型
public class SaloonCar
{
private String name;
private Way way;
public SaloonCar(String name)
{
this.name = name;
way = new BeijWay();
}
public void move(){ //Way一是个路线,他表示汽车要行驶的路线
…………………..
way.execut();
…………………..
}
………
}
这样当我们如果我们要写一个测试用列测试move的时候会发现无论怎么测试都会间接的把way.execute方法测试了,而way又是SaloonCar在创建的时候创建,这样Salooncar和BeijWay互相耦合,Salooncar的 move方法必须依赖事先创建好的way.
如果我们把上面代码改写成
public class SaloonCar
{
private String name;
private Way way;
public SaloonCar(String name)
{
this.name = name;
}
public void move()
{
way.execute();
}
public void setWay(Way way)
{
This.way = way;
}
}
这样way不在依靠在创建SaloonCar创建的时候创建,这样虽然还是存在着耦合,但是测试用列的时候可以事先设置我们预定的Way,还是减小了偶合。这中技术就是依赖注入。
在spring中通过BeanFactory来实现Bean的依赖注入。
现在我们来看看javabean的xml的配置
<?
xml
version
=
"1.1"
encoding
=
"GBK"
?>
<!
DOCTYPE
beans
PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd"
>
<
beans
>
<
bean
id
=
"car"
class
=
"com.maomao.spring.model.SaloonCar"
>
<
property
name
=
"name"
>
<
value
>
redcar
</
value
>
</
property
>
<
property
name
=
"way"
>
<ref bean=”
myfactorybean
” />
</
property
>
</
bean
>
<
bean
id
=
"myfactorybean"
class
=
"com.maomao.spring.model.BeijWay" /
>
</beans>
这样我们就完成了
bean
的配置。
然后我们怎么才能根据
XML
创建实列对象呢,
spring
通过
2
中方法来创建。一种是通过
BeanFactory
另外一中是通过ApplicationContext上下文来创建Bean. BeanFactory是最简单的一种创建Bean的方法,Spring给我们提供了很多实现了BeanFactory的类,其中最常用的是XmlBeanFactory
BeanFactory factory = new XmlBeanFactory(“spring.xml”);
SaloonCar car = (SaloonCar)factory.getBean(“car”);
它实列化一个类的时候是通过getBean里传递的参数去spring.xml文件中找对应的Bean,然后根据信息实列话类。
而ApplicationContext的实现类是在创建BeanFactory的时候就加载Xml文件,并且实列话类,而且ApplicationContext提供了更多的企业级开发的服务,所以一般开发中都用ApplicationContext的子类,很少用BeanFacroy。以上就是Ioc技术。(xml配置细节网上N多文章)。
注意:<!DOCTYPE
beans
PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
这段话必须要加,因为Spring
会验证文档的完整性
现在我们来讲讲Spring中的一些特殊的bean.
第1个,对Bean进行后处理。(请自己查阅Bean的生命周期,这个比较重要)
Spring为我们提供了两次机会,让我们切入到Bean的生命周期中,检查或者修改它的配置,这叫做后处理。在Bean被创建以及在装配以后,org.springframework.beans.factory.config.BeanPostProcessor;接口为你提供了两次机会来修改这个Bean
这个接口有2个方法
postProcessAfterInitialization
(Object bean, String beanName)
和postProcessBeforeInitialization(Object bean, String beanName)
通过实现这个接口可以修改Bean的信息,在这里就不做举列了。装载的时候用
ApplicationContext的子类装载。
第2 BeanFactoryPostProcessor在Bean工厂载入所有的Bean的定义以后,实列话Bean之前,对Bean工厂做一写后处理的工作
public class MpBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
throws BeansException {
System.out.println(arg0.getBeanDefinitionCount());
String[] name = arg0.getBeanDefinitionNames();
for(String x:name)
{
System.out.println(x);
}
}
}
用ApplicationContext加载完所有的定义以后,实列化Bean的时候会调用这个类。
还有分散和定制属性编辑器等
<!--
自定制类型转换
-->
<
bean
id
=
"editor"
class
=
"org.springframework.beans.factory.config.CustomEditorConfigurer"
>
<
property
name
=
"customEditors"
>
<
map
>
<
entry
key
=
"com.maomao.spring.model.MyType"
>
<
bean
id
=
"mytypeeditor"
class
=
"com.maomao.spring.model.MyTypeEditor"
/>
</
entry
>
</
map
>
</
property
>
</
bean
>
<!-- end -->
<!--
连接外部文件
-->
<
bean
id
=
"property"
class
=
"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
>
<
property
name
=
"location"
>
<
value
>
com/maomao/spring/xml/outspring.properties
</
value
>
</
property
>
</
bean
>
<!--
以上
Bean
里的类都是
Spring
里提供实现了特殊接口的类。
还有BeanNameAware,BeanFactoryAware,ApplicationContextAware,这些都比较简单,自己看网上查下吧。。