spring IOC入门: 从一个简单的项目来看IOC

问题一:为什么我们需要使用spring?

1.在传统的项目中,我们各个组建之间往往需要经过很多步骤的封装、注入。一般的注入方式有set注入、构造函数注入等等。

2.而一个大型的项目,包含着大量的注入需要人工操作(如果不使用spring的话)。这种大量的注入是有规律可循的,这也就为spring的诞生奠定了基础

3.spring的ioc实际上解决的是各个对象之间的注入问题。其本质是通过spring的使用,将【注入】这一步骤和【代码解耦】。即:对象的注入不需要修改代码(重新编译)就可以实现,因为重新编译的代价是比较大的(原因:现场更新、项目重启、非技术人员无法操作等等,都是代价大的体现)。所以我们需要使用spring,spring让注入变得简单,高效,并且只要修改xml文件即可实现,无需重新编译,非技术人员即可操作,实现了和代码的解耦。

问题二:传统项目中的注入是什么样的?

如图1.1,是一个很简单的项目,以及图1.2 输出语句打印。
这里写图片描述

图1.1 一个简单的项目
下图是输出语句:
这里写图片描述
图1.2 Test1的输出语句

基本情况:

action层用service的接口当做属性,这样提升了项目的可扩展性。

IPomainService接口中,定义了addPomain方法。并且该接口在项目中有两个实现类:PomainService、PomainServiceTran。

注意:我们在实际的项目中可能会有更多的实现类(6-10个都是有可能的)。
所以这里用接口的好处就是:我在action层,只要指定用这个接口作为属性,不管你有10个还是100

个接口的实现,我都可以只写这么一个action类。

service层选择dao作为属性,实现了addPomain方法,方法体中分别调用dao层的方法,只是PomainService、PomainServiceTran稍有不同,后者比前者多加上了事务处理。

项目理解:

在Test1中,实际上做了两件事情:

1.手动完成对象属性的注入(如果不注入,则调用的时候会报空指针):将pdao、mdao、rdao注入pservice和transervice。将pservice注入paction,将transervice注入pactiontran。

2.调用方法paction和pactiontran的add方法。

问题三:传统项目的弊端有哪些?

项目弊端:显而易见,上述项目的弊端就是我们在使用action层的时候,需要一步一步自己注入servier的实现,以及service实现所依赖的每一个dao,代码冗长。而这一部分原本是可以通过spring的IOC来实现的。

问题四:如何使用spring完成一个简单的注入?

1.spring需要用到的几个基础jar包:
commons-logging-1.1.1.jar
spring-beans-4.2.4.RELEASE.jar
spring-context-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-expression-4.2.4.RELEASE.jar

2.因为我使用的是java项目,那么在项目下面创建一个lib文件夹,并且将这几个jar包复制进去。然后添加至构建路径。

3.在项目的src下面创建applicationContext.xml文件。

并且使用spring固定的写法:

    <?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.xsd">
    内容体。。。。。

    </beans>

4.此时,如果你上述步骤做的正确的话,你会发现刚刚创建的applicationContext.xml文件,变了一个图标,如图1.3 所示

图1.3 spring的applicationContext.xml文件样式

图1.3 spring的applicationContext.xml文件样式

5.在applicationContext.xml文件中写入相关依赖关系,如图1.4所示:

<?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.xsd">

 <!-- id:可以自己定义名字 class:包名+类名-->
 <bean id="dao1"class="com.spring.dao.PoitemDao"></bean>
 <bean id="dao2"class="com.spring.dao.PomainDao"></bean>
 <bean id="dao3"class="com.spring.dao.ProductDao"></bean>

 <bean id="nomalservice"class="com.spring.service.imp.PomainService">
  <!-- name:和PomainService类中的变量名对应 ref:和上面的id对应-->
  <property name="pdao"ref="dao1"></property>
  <property name="mdao"ref="dao2"></property>
  <property name="rdao"ref="dao3"></property>
 </bean>

 <bean  id="transervice"class="com.spring.service.imp.PomainServiceTran">
  <!-- name:和PomainService类中的变量名对应 ref:和上面的id对应-->
  <property name="pdao"ref="dao1"></property>
  <property name="mdao"ref="dao2"></property>
  <property name="rdao"ref="dao3"></property>
 </bean>

 <bean id="nomalaction"class="com.spring.action.PomainAction">
  <!-- name和PomainAction类中的变量名对应 ref:和上面的id对应 -->
  <property name="pomainService"ref="nomalservice"></property>
 </bean>

 <bean id="tranaction"class="com.spring.action.PomainAction">
  <!-- name和PomainAction类中的变量名对应 ref:和上面的id对应 -->
  <property name="pomainService"ref="transervice"></property>
 </bean>
</beans>

图1.4 applicationContext.xml中书写依赖关系

6.在测试类中完成调用即可:

package com.spring.test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.spring.action.PomainAction;

public class Test2{

 public static void main(String [] args){
  //IOC的核心组件是BeanFactory
  //加载applicationContext.xml
  BeanFactory factory =new ClassPathXmlApplicationContext("applicationContext.xml");

  //工厂模式生成我们所需要的类
  PomainAction action1 = factory.getBean("nomalaction", PomainAction.class);
  action1.add();

  System.out.println("--------@#$@#%!#$@#$@#$-------------");

  PomainAction action2 = factory.getBean("tranaction", PomainAction.class);
  action2.add();
 }
}

图1.5 调用测试类实现IOC

我们可以看到,在两个Action层的注入上,已经节省了很多代码量,如果在大型工程中,有很多的注入,那么可以节省很多代码量。我们在使用的时候,只要在xml文件中配置好,用spring框架的工厂模式去生成我们所需要的action类就可以了,十分方便。

并且这里的注入关系书写在applicationContext.xml文件中,一目了然。

7.输出结果:
这里写图片描述

图1.6输出结果

前面的红色字体,就是spring框架输出的内容。
我们可以看到,控制台输出的结果和图1.2 中输出的结果是一模一样的。

问题五:总结spring IOC优点

spring ioc的优点:

1.避免了在代码中书写重复而繁琐的各种依赖关系,降低了代码量。

2.用xml书写相关对象的依赖关系,一目了然。降低了代码维护的成本(避免了重新编译,非技术人员也可以看懂和修改,避免了对于源代码的更改,从而就没有代码从测试环境更新到现场环境的问题)

3.大型项目中,对于公用的类,大大降低了注入部分的代码。注入用到得越多,节省的代码就越多。

4.实现了代码注入的解耦:之前是在源代码中写死,现在是哪里使用,哪里调用,依赖关系在xml中写好,根据需求生成即可。

问题六:源代码

因为csdn无法直接上传附件,只能以下载的形式上传了,链接如下,审核通过之后应该可以正常下载:

http://download.csdn.net/download/liuyishan1993/10243713

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值