在介绍Spring中IOC之前,先说说Spring的优势有哪些。首先1.方便解耦,简化开发:就是说将对象间的依赖关系交给Spring进行控制,避免了编码造成的过度耦合。2.AOP编程的支持:方便进行切面编程。3.声明式事务的支持:进行事务的管理,提高开发效率和质量。4.方便程序的测试:可以用非容器的依赖的编程方式进行几乎所有的测试工作。5.方便集成各种优秀的框架:Spring降低各种框架的难度,提供各种框架的支持。6.降低API的难度:Spring对(JDBC,javaMail,远程调用等)进行了薄薄的封装层,使这些API使用难度大大降低。
以上讲述了Spring的好处,接下来说说Spring的核心技术IOC。官方是这样介绍IOC的:控制反转,表示将对象的创建权利反转给Spring框架。它主要解决的是“程序耦合性高的问题”。以前创建对象,直接new,利用反射,调用对象克隆,运用序列化手段调用java.io.ObjectInputStream 对象的 readObject()方法。IOC已经帮我们解决了这个问题,创建对象的动作直接交给Spring,它相当于一个大容器,将已经创建好的对象放到容器中,需要那个对象,直接到容器中去取就可以了。
Spring提供了2个工厂接口:1.ApplicationContext接口 :该接口可以获得具体的Bean对象,而且这个接口有2个具体的实现类分别是ClassPathXmlApplicationContext:加载类路径下的Spring配置文件 FileSystemXmlApplicationContext:加载本地磁盘下的Spring配置文件。2.BeanFactory:是Spring框架早期的创建Bean对象工厂接口。代码如下:
看如下代码:
@Test public void test() { // 创建Spring工厂,IOC容器 ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
//BeanFactory ac=new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); //Beanfactory创建对象
UserDao userDao =(UserDao) ac.getBean("userDao"); userDao.save(); }
对于以上两个接口还是有区别的,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean。而applicationContext.xml中就会创建具体的Bean对象,除此之外具有事件传递,Bean自动装配,各种不同的应用层的Context实现。对于IOC入门学习者,了解一下Spring核心配置文件的标签。id属性:id属性是Bean的唯一标识 class属性是Bean的全路径名 scope属性代表Bean的作用范围,其中single:单例(默认值) prototype:多例 request:应用在Web应用层,将创建的对象存入到request域中 session:应用在web应用中,将创建的对象存入到session中 globalsession:应用在porlet环境下使用,将创建的对象存入到全局的session中。注意:当设置为多例时,每次getBean时,都会重新实例化。
init-method属性:当Bean被载入到容器的时候调用init-method指定的方法。destroy-method属性:当Bean从容器中删除的时候调用destroy-method属性指定的方法,想查看destroy-method的效果,必须满足scope=singleton有效,Web容器会自动调用,需要手动ClassPathXmlApplicationContext的close方法。
public class UserDaoImpl implements UserDao{ public void save() { System.out.println("持久层,用户保护"); } public void firstInit(){ System.out.println("初始化方法启动"); } public void lastdestroy(){ System.out.println("销毁方法启动"); } }
核心配置文件的配置如下:
<bean id="userDao" class="com.user.dao.impl.UserDaoImpl" init-method="firstInit" destroy-method="lastdestroy"></bean>
测试代码:
@Test public void test() { // 创建Spring工厂,IOC容器 ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao =(UserDao) ac.getBean("userDao"); userDao.save(); // 手动关闭close,才能调用destroy-method方法 ((ClassPathXmlApplicationContext)ac).close(); }
2.依赖注入DI:在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件中!可以通过构造(提供构造方法)注入,set注入(提供Set方法)等,除了以上常用注入以外,还有特殊类型的注入。比如数组或list注入,Map注入,properties注入。特殊类型的注入式放在Bean中注入的,这里实体类需要提供属性,并且提供set方法,以下分别列出其注入的代码:
<!-- 构造方法注入 --> <bean id="car" class="com.domain.Car"> <constructor-arg name="name" value="大奔"></constructor-arg> <constructor-arg name="price" value="1234.00"></constructor-arg> </bean> <!-- set方法注入 --> <bean id="people" class="com.domain.People"> <property name="name" value="李斯特"></property> <property name="address" value="上海黄浦区"></property> <property name="car" ref="car"></property> </bean> <bean id="cd" class="com.domain.CollectionBean"> <!--list注入 --> <property name="list"> <list> <value>测试1</value> <value>测试2</value> <value>测试3</value> </list> </property> <!-- Map注入 --> <property name="map"> <map> <entry key="id" value="1"></entry> <entry key="name" value="测试"></entry> </map> </property> <!-- properties注入 --> <property name="properties"> <props> <prop key="name">测试2</prop> <prop key="age">22</prop> </props> </property> </bean>