问题一:为什么我们需要使用spring?
1.在传统的项目中,我们各个组建之间往往需要经过很多步骤的封装、注入。一般的注入方式有set注入、构造函数注入等等。
2.而一个大型的项目,包含着大量的注入需要人工操作(如果不使用spring的话)。这种大量的注入是有规律可循的,这也就为spring的诞生奠定了基础
3.spring的ioc实际上解决的是各个对象之间的注入问题。其本质是通过spring的使用,将【注入】这一步骤和【代码解耦】。即:对象的注入不需要修改代码(重新编译)就可以实现,因为重新编译的代价是比较大的(原因:现场更新、项目重启、非技术人员无法操作等等,都是代价大的体现)。所以我们需要使用spring,spring让注入变得简单,高效,并且只要修改xml文件即可实现,无需重新编译,非技术人员即可操作,实现了和代码的解耦。
问题二:传统项目中的注入是什么样的?
如图1.1,是一个很简单的项目,以及图1.2 输出语句打印。
下图是输出语句:
基本情况:
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 所示
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>
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();
}
}
我们可以看到,在两个Action层的注入上,已经节省了很多代码量,如果在大型工程中,有很多的注入,那么可以节省很多代码量。我们在使用的时候,只要在xml文件中配置好,用spring框架的工厂模式去生成我们所需要的action类就可以了,十分方便。
并且这里的注入关系书写在applicationContext.xml文件中,一目了然。
7.输出结果:
前面的红色字体,就是spring框架输出的内容。
我们可以看到,控制台输出的结果和图1.2 中输出的结果是一模一样的。
问题五:总结spring IOC优点
spring ioc的优点:
1.避免了在代码中书写重复而繁琐的各种依赖关系,降低了代码量。
2.用xml书写相关对象的依赖关系,一目了然。降低了代码维护的成本(避免了重新编译,非技术人员也可以看懂和修改,避免了对于源代码的更改,从而就没有代码从测试环境更新到现场环境的问题)
3.大型项目中,对于公用的类,大大降低了注入部分的代码。注入用到得越多,节省的代码就越多。
4.实现了代码注入的解耦:之前是在源代码中写死,现在是哪里使用,哪里调用,依赖关系在xml中写好,根据需求生成即可。
问题六:源代码
因为csdn无法直接上传附件,只能以下载的形式上传了,链接如下,审核通过之后应该可以正常下载: