核心机制是以BeanFactory为基础,管理bean与benn之间的依赖的.Spring以bean防是
组织管理java应用中的各组件,组件之间的依赖关系松耦合运行良好.这依赖与spring德核心机制:依赖注入.Spring使用BeanFactory作为应用中富者生产和管理各种组件的工厂,同事也是组件运行的容器.BeanFactory根据配置的文件确定容器中bean的实现.管理bean之间的关系.
将bean对bean实现类的依赖解耦,变成对
接口的依赖,程序从面向具体的类的编程,转向编程面向接口的编程,极大的降低应用中的组件的耦合.
spring 能有效的组织j2ee应用各层的对象.不管是控制层的actiong对象.还是业务层的service对象.还有持久层的dao对象,都可以在 aispring的管理机制下有机协调的运行,spring将各层的对象以松耦合的访华四组织在一起.阿香体哦那个对象无需关心service.
依赖注入(Dependency Injection)和控制反转(Inversion of contro)是同一个概念,具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个java实例,被调用者)的协助的时候. 在传统的程序设计过程中,通常由调用者来创建被调用者的实例,但在spring里面,创建被调用者的工作不再有调用者来完成.因此称为控制反转.创建被调用者实力的工作通常由spring容器来完成.然后注入调用者.因此也称为依赖注入.
原理代码简单重现:
设置注入:
设置注入是指通过setter方法传入被调用者的实例,这汇总注入方式简单,直观,因而在spring的依赖注入里面大量使用.以下是一个Person接口:
//定义Person接口
Public interface Person
{
//person接口里面定义的一个使用斧子的方法
public void useAxe();
}
____________________________________________________________________
public interface Axe
{
//Axe接口里面有个砍的方法
public void chop();
}
____________________________________________________________________
Person的实现类如下:
public ckass Chinese implements Person
{
private Axe axe;//面向Axe接口编程,而不是具体实现类.
public Chisese(){//默认
构造器
}
//设置注入所需的setter方法
public void serAxe(Axe axe)
{
this.axe = axe;
}
//实现person接口类的useAxe方法
public void useAdxe(){
System.out.pringln(axe.chop());
}
}
____________________________________________________________________
//Axe的第一个实现类 StoneAxe
public class StoneAxe implements Axe
{
//默认构造器
public StoneAxe(){}
//实现Axe接口的chop方法
public Stirng chop()
{
return "用势头斧子去砍柴";
}
}
____________________________________________________________________
下面是关键,是采用spring的配置文件将person实例和Axe实例组织在一起,配置如下:
____________________________________________________________________
<!--Spring 配置文件的根元素 -->
<beans>
<!-定义第一bean,该bean得id失chidese,class指定该bean实例的实现类 -->
<bean id = "chainese" class="lee.Chinese">
<!-property元素用来指定需要容器注入的属性,axe属性需要容器注入,此处是没有设置注入,因此Chisese类必须拥有setAxe方法 -->
<property name = "axe">
<!-- 此处将另一个bean的引用注入给chinese bean -->
<ref local = "stoneAxe"/>
</property>
</bean>
<!-- 定义stoneAxe bean -->
<bean id = "stoneAxe" class ="lee.StoneAxe"/>
</beans>
下面看主程序部分:
public class BeanTest
{
public static void main(Sting[] args) throws Exveption
{
//因为是独立的应用程序,显式地市厉害spring的上下文
ApplicationContext ctx = new FileSystemXmlApplicationContest("bean.xml")
//通过Person Bean的id来获取bean实例,面向接口编程.因此,此处通过强制
类型转换为接口类型
Person p = (Person)ctx.getBean("chinese");
//直接执行Person的useAxe()方法
p.useAxe();
}
}