上来直接干货:一点基础知识
Spring是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架,主要是为了解决企业开发的复杂性。
IOC(Inverion of Control):是Spring核心,控制权的转移,应用程序本身不负责对象的创建和维护,而由Spring外部容器负责。解决了传统开发中的对象之间的相互依赖关系复杂的问题。IOC又被称为DI(DependencyInjection),所谓依赖注入就是在IOC容器在运行期间,把某种依赖关系注入到对象中。实际上,IOC和DI是从不同的方面说的同一个过程,通过引入IOC容器,利用注入的方式,实现对象的解耦。
Spring 用bean来管理对象,xml文件来配置(或者注解)。
下面来看一个简单的入门demo:
先是写一个接口:
package com.hanchun.springdemo;
/**
*基于接口编程
*/
public interface SayHello {
public String sayHello();
}
package com.hanchun.springdemo;
/**
*实现SayHello接口
*/
public class ChineseHello implements SayHello{
@Override
public String sayHello() {
return "你好,我的朋友!";
}
}
package com.hanchun.springdemo;
/**
*实现SayHello接口
*/
public class AmericanHello implements SayHello {
@Override
public String sayHello() {
return "Hello, my friend!";
}
}
再者是一个Person类:
package com.hanchun.springdemo;
public class Person {
//SayHello的引用,具体指向哪个,由spring配置文件决定
SayHello sayHello;
public SayHello getSayHello() {
return sayHello;
}
public void setSayHello(SayHello sayHello) {
this.sayHello = sayHello;
}
public String sayHello(){
//调用配置文件里指定的对象的sayHello()方法
return this.sayHello.sayHello();
}
}
再写一个Test类:
package com.hanchun.springdemo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args){
//上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("hello.xml");
//通过ApplicationContext拿到相应的bean
SayHello helloBean = (SayHello)context.getBean("chineseHello");
// SayHello helloBean = (SayHello)context.getBean("americanHello");
System.out.println(helloBean.sayHello());
}
}
最后附上配置文件(就本测试,建议摆放到src目录下):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="chineseHello" class="com.hanchun.springdemo.ChineseHello"></bean>
<bean id="americanHello" class="com.hanchun.springdemo.AmericanHello"></bean>
<bean id="person" class="com.hanchun.springdemo.Person">
<property name="sayHello" ref="chineseHello"/> <!--注意这边的注入操作 -->
</bean>
</beans>
我想程序的意图很明显了:并没有通过new出SayHello具体实现类,而是通过交给Spring容器去自动在需要的时候注入。