IOC(Invension of Control 控制反转),原来属性由自己控制,自己创建对象进行初始化;现在由Spring容器控制,反转到容器了。解耦同时更灵活,对象可以随意装配。
DI(Dependency Injection 依赖注入),比如UserDao的属性是依赖Spring容器注入进来的,不是自己在类中写死的。Spring内部原理就是依靠反射实现的。
即从实现具体的初始化到抽象层次初始化。
以下是一个基于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-2.5.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
1.建立Spring的User Library,加入spring.jar和commons-logging.jar。对UserService进行JUnit测试(在类同级的地方new一个JUnit Test Case,拖到test的source folder里,run as Junit test即可)。
2.查api(在jar包上-properties-javadoc location中加入api路径),点击类后按F1即可在右边javadoc窗口查看到。
查看构造方法后得知可以加多个xml文件方便开发。
BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
或者
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
BeanFactory 还是 ApplicationContext?
BeanFactory接口擅长于处理bean的初始化和配置,而 ApplicationContext接口除了处理上述工作外,它还针对企业引用 提供了许多基础支持,比如事务处理和AOP。
简而言之,一般把ApplicationContext接 口作为首选。
总之,模拟spring的bean工厂就是模拟BeanFactory和ClassPathXmlApplicationContext这两个类。
具体用时模拟效果和spring中使用的是一样的。
都是先声明上下文
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
再从容器中拿实例化的bean即可
UserService service = (UserService) factory.getBean("userService");